diff --git a/.agents/skills/sync-acp-spec/SKILL.md b/.agents/skills/sync-acp-spec/SKILL.md index 72c5bef43..e074c31a7 100644 --- a/.agents/skills/sync-acp-spec/SKILL.md +++ b/.agents/skills/sync-acp-spec/SKILL.md @@ -74,9 +74,9 @@ Keep `src/acp/schema/` aligned with the official Agent Client Protocol reference - `agent/implementations/debug_server/mock_agent.py` — add stubs to `MockAgent` 7. **Wire up in the ACP server** (if needed): - - `src/agentpool_server/acp_server/acp_agent.py` — implement new methods, advertise new capabilities - - `src/agentpool_server/acp_server/event_converter.py` — emit new session update types - - `src/agentpool_server/acp_server/session.py` — store new state + - `src/wolfharness_server/acp_server/acp_agent.py` — implement new methods, advertise new capabilities + - `src/wolfharness_server/acp_server/event_converter.py` — emit new session update types + - `src/wolfharness_server/acp_server/session.py` — store new state 8. **Update the synced commit hash** in `src/acp/__init__.py`: ```bash @@ -106,7 +106,7 @@ Keep `src/acp/schema/` aligned with the official Agent Client Protocol reference - `connection.py` (base JSON-RPC connection) — only if the wire protocol itself changes - `transports.py` — transport layer is our own - `stdio.py` — our process management layer -- `client/` implementations (`DefaultACPClient`, `HeadlessACPClient`, `NoOpClient`) — agentpool-specific +- `client/` implementations (`DefaultACPClient`, `HeadlessACPClient`, `NoOpClient`) — wolfharness-specific - `registry/` — our agent registry, not part of ACP spec - `task/` — our task abstraction - `tool_call_reporter.py`, `tool_call_state.py` — our extensions diff --git a/.agents/skills/sync-skills-spec/SKILL.md b/.agents/skills/sync-skills-spec/SKILL.md index 55d98fc6b..e32b48b66 100644 --- a/.agents/skills/sync-skills-spec/SKILL.md +++ b/.agents/skills/sync-skills-spec/SKILL.md @@ -1,11 +1,11 @@ --- name: sync-skills-spec -description: Sync the agentpool skills implementation with the official Agent Skills Spec by comparing against the reference repository. +description: Sync the wolfharness skills implementation with the official Agent Skills Spec by comparing against the reference repository. --- # Sync Skills Spec -Keep `src/agentpool/skills/` aligned with the official Agent Skills Spec. +Keep `src/wolfharness/skills/` aligned with the official Agent Skills Spec. ## Steps @@ -21,18 +21,18 @@ Keep `src/agentpool/skills/` aligned with the official Agent Skills Spec. - Focus on the `SkillProperties` model, frontmatter fields, validation rules, and prompt generation 3. **Compare with our implementation**: - - `src/agentpool/skills/skill.py` — our `Skill` Pydantic model, validators, `parse_frontmatter()`, `to_prompt()` - - `src/agentpool/skills/registry.py` — discovery and registration (our extension, not part of the spec) - - `src/agentpool/skills/manager.py` — pool-wide management (our extension) + - `src/wolfharness/skills/skill.py` — our `Skill` Pydantic model, validators, `parse_frontmatter()`, `to_prompt()` + - `src/wolfharness/skills/registry.py` — discovery and registration (our extension, not part of the spec) + - `src/wolfharness/skills/manager.py` — pool-wide management (our extension) - Check for missing fields, changed validation rules, new spec requirements 4. **Apply updates** to our code: - Add any new frontmatter fields to the `Skill` model - Update validators to match spec changes (name format, length limits, allowed fields) - Update `to_prompt()` if the recommended XML format changed - - Do NOT replace our registry/manager — those are agentpool-specific extensions + - Do NOT replace our registry/manager — those are wolfharness-specific extensions -5. **Update the synced commit hash** in `src/agentpool/skills/skill.py`: +5. **Update the synced commit hash** in `src/wolfharness/skills/skill.py`: - Get the current HEAD of the cloned repo: `git -C "$tmp/agentskills" rev-parse HEAD` - Update the `SPEC_SYNCED_COMMIT` constant to the new hash - This tracks which version of the spec we last synced against diff --git a/.copier-answers.yml b/.copier-answers.yml deleted file mode 100644 index 821d79946..000000000 --- a/.copier-answers.yml +++ /dev/null @@ -1,21 +0,0 @@ -# Changes here will be overwritten by Copier -_commit: v2.3.3 -_src_path: https://github.com/phil65/copier-phil65.git -author_email: philipptemminghoff@googlemail.com -author_fullname: Philipp Temminghoff -author_username: phil65 -copyright_date: "2025" -copyright_holder: Philipp Temminghoff -copyright_holder_email: philipptemminghoff@googlemail.com -libraries_use_pydantic: true -libraries_use_qt: false -project_description: Pydantic-AI based Multi-Agent Framework with YAML-based Agents, - Teams, Workflows & Extended ACP / AGUI integration -project_name: AgentPool -python_minimum_version: "3.13" -python_package_command_line_name: agentpool -python_package_distribution_name: agentpool -python_package_import_name: agentpool -repository_name: agentpool -repository_namespace: phil65 -repository_provider: github.com diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f52ec6e10..b7d03d44f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -54,7 +54,7 @@ jobs: env: OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - run: uv run --no-group docs pytest --cov-report=xml --cov=src/agentpool/ --cov-report=term-missing + run: uv run --no-group docs pytest --cov-report=xml --cov=src/wolfharness/ --cov-report=term-missing - name: VCR tests run: uv run pytest tests/vcr/ --strict-vcr-cassette-usage --tb=short --no-cov -q @@ -146,7 +146,7 @@ jobs: run: uv sync --all-extras - name: Build with PyInstaller - run: uv run pyinstaller agentpool.spec + run: uv run pyinstaller wolfharness.spec - name: Get package version (Unix) id: get_version_unix @@ -167,23 +167,23 @@ jobs: if: ${{ matrix.os != 'windows' }} run: | cd dist - zip agentpool-${{ matrix.os }}-${{ matrix.arch }}-${{ steps.get_version_unix.outputs.version }}.zip agentpool + zip wolfharness-${{ matrix.os }}-${{ matrix.arch }}-${{ steps.get_version_unix.outputs.version }}.zip wolfharness - name: Zip binary (Windows) if: ${{ matrix.os == 'windows' }} shell: pwsh run: | cd dist - Compress-Archive -Path agentpool.exe -DestinationPath agentpool-${{ matrix.os }}-${{ matrix.arch }}-${{ steps.get_version_windows.outputs.version }}.zip + Compress-Archive -Path wolfharness.exe -DestinationPath wolfharness-${{ matrix.os }}-${{ matrix.arch }}-${{ steps.get_version_windows.outputs.version }}.zip - name: Upload binary to release (Unix) if: ${{ matrix.os != 'windows' }} uses: softprops/action-gh-release@v2 with: - files: dist/agentpool-${{ matrix.os }}-${{ matrix.arch }}-${{ steps.get_version_unix.outputs.version }}.zip + files: dist/wolfharness-${{ matrix.os }}-${{ matrix.arch }}-${{ steps.get_version_unix.outputs.version }}.zip - name: Upload binary to release (Windows) if: ${{ matrix.os == 'windows' }} uses: softprops/action-gh-release@v2 with: - files: dist/agentpool-${{ matrix.os }}-${{ matrix.arch }}-${{ steps.get_version_windows.outputs.version }}.zip + files: dist/wolfharness-${{ matrix.os }}-${{ matrix.arch }}-${{ steps.get_version_windows.outputs.version }}.zip diff --git a/.github/workflows/publish_docker.yml b/.github/workflows/publish_docker.yml index 638003471..b4e3797e7 100644 --- a/.github/workflows/publish_docker.yml +++ b/.github/workflows/publish_docker.yml @@ -33,7 +33,7 @@ jobs: id: meta uses: docker/metadata-action@v5 with: - images: ghcr.io/${{ github.repository }}/agentpool + images: ghcr.io/${{ github.repository }}/wolfharness tags: | type=semver,pattern={{version}} type=ref,event=branch diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index 0f9d87135..7af358b19 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -131,7 +131,7 @@ jobs: run: uv sync --all-extras --no-group lint - name: Import smoke test run: | - uv run python -c "mods=['agentpool','agentpool_config','agentpool_cli','agentpool_commands','agentpool_storage','agentpool_prompts','agentpool_server','agentpool_toolsets','acp'];[(__import__(m),print(f' OK {m}')) for m in mods];print(f'All {len(mods)} modules imported successfully')" + uv run python -c "mods=['wolfharness','wolfharness_config','wolfharness_cli','wolfharness_commands','wolfharness_storage','wolfharness_prompts','wolfharness_server','wolfharness_toolsets','acp'];[(__import__(m),print(f' OK {m}')) for m in mods];print(f'All {len(mods)} modules imported successfully')" - name: Test collection check run: uv run pytest --co -q 2>&1 | tail -3 diff --git a/.gitignore b/.gitignore index 4a1d89325..fe8c14d4b 100644 --- a/.gitignore +++ b/.gitignore @@ -66,6 +66,9 @@ test_configs/ # Prometheus / OpenCode workspace files .omo/ +# Codegraph local index cache +.codegraph/ + # Git worktrees .worktrees/ diff --git a/.opencode/agents/review-code.md b/.opencode/agents/review-code.md index 312e0cc0d..f07aec8b5 100644 --- a/.opencode/agents/review-code.md +++ b/.opencode/agents/review-code.md @@ -44,8 +44,8 @@ code changes in a pull request and report findings. You do NOT edit files. - No `asyncio.create_task()` without an active span 5. **Architecture** - - Config models import from `agentpool_config.*`, not `agentpool.models` - - New modules follow existing patterns in `src/agentpool/` + - Config models import from `wolfharness_config.*`, not `wolfharness.models` + - New modules follow existing patterns in `src/wolfharness/` - New capabilities registered properly in the capability system ## Output Format diff --git a/.opencode/agents/review-docs.md b/.opencode/agents/review-docs.md index 7d6a58936..24907434b 100644 --- a/.opencode/agents/review-docs.md +++ b/.opencode/agents/review-docs.md @@ -34,15 +34,15 @@ documentation. You do NOT edit files. ## What to Check 1. **Context Loading Table** - - New `src/agentpool/**/AGENTS.md` files MUST be registered in the root + - New `src/wolfharness/**/AGENTS.md` files MUST be registered in the root `AGENTS.md` Context Loading table. - Removed subsystem AGENTS.md files MUST be removed from the table. 2. **Subsystem Documentation** - - New modules under `src/agentpool/` that introduce a new directory SHOULD have + - New modules under `src/wolfharness/` that introduce a new directory SHOULD have a corresponding `AGENTS.md` in that directory. - - Changes to `src/agentpool/lifecycle/`, `src/agentpool/capabilities/`, - `src/agentpool/skills/`, `src/agentpool/hooks/` MUST check whether the + - Changes to `src/wolfharness/lifecycle/`, `src/wolfharness/capabilities/`, + `src/wolfharness/skills/`, `src/wolfharness/hooks/` MUST check whether the subsystem AGENTS.md needs updating. 3. **Explanation Docs** diff --git a/.opencode/agents/review-lead.md b/.opencode/agents/review-lead.md index 29e6b6c21..17728f288 100644 --- a/.opencode/agents/review-lead.md +++ b/.opencode/agents/review-lead.md @@ -55,10 +55,10 @@ single review comment. You do NOT edit files or run commands. ## When to Invoke review-docs Always invoke `@review-docs` when the PR: -- Adds or removes files under `src/agentpool/` +- Adds or removes files under `src/wolfharness/` - Modifies any `AGENTS.md` - Modifies anything under `docs/` -- Adds a new directory under `src/agentpool/` (potential new subsystem) +- Adds a new directory under `src/wolfharness/` (potential new subsystem) - Changes code style conventions, testing rules, or telemetry rules - Adds or removes lifecycle dimensions, capabilities, protocols, or tools diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5247c6dd1..3d6268b6e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -61,7 +61,7 @@ repos: name: check-jsonschema entry: uv run check-jsonschema --schemafile schema/config-schema.json language: system - files: ^src/agentpool/config_resources/.*\.yml$|^docs/examples/.*/config\.yml$ + files: ^src/wolfharness/config_resources/.*\.yml$|^docs/examples/.*/config\.yml$ require_serial: true # Phase 4: pre-push — heavier checks, only when pushing (~30-60s) diff --git a/AGENTS.md b/AGENTS.md index 72aa5447b..e2ab719d7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,6 +11,28 @@ All significant changes go through OpenSpec: `/opsx:explore` → `/opsx:propose` - Location: `openspec/` (24 capability specs, 34 archived changes) - CLI: `openspec` v1.4+ — see `openspec/config.yaml` +## Changelog + +Every release requires a changelog entry. See `changelog/README.md` for the full convention. + +### Release workflow + +1. Development changes accumulate in `changelog/unreleased/` — one detail file per logical change (`YYYY-MM-DD-short-slug.md`). +2. At release time: + - Rename `unreleased/` to the version number (e.g. `2.10.0/`). + - Write `README.md` (summary linking each detail file) and `RELEASE.md` (GitHub Release body). + - Update `pyproject.toml` version. + - Commit **before** creating the git tag. + - Create a fresh empty `unreleased/` for the next cycle. + +### Detail file format + +```markdown +# Title + +What changed and why. Use `##` sections once the entry covers more than one thing. +``` + ## Quick Commands ```bash @@ -22,8 +44,8 @@ uv run ruff check src/ # Lint uv run ruff format src/ # Format uv run --no-group docs mypy src/ # Type check duty lint # All checks -agentpool run "prompt" # Run agent -agentpool serve-acp config.yml # Start ACP server +wolfharness run "prompt" # Run agent +wolfharness serve-acp config.yml # Start ACP server ``` ## Code Style — Red Lines @@ -32,7 +54,7 @@ agentpool serve-acp config.yml # Start ACP server - PEP 8 via Ruff. Google-style docstrings (no types in Args section). - Type hints required (`mypy --strict`). **Never** use `as any`, `@ts-ignore`, or type suppressions. - `from __future__ import annotations` for forward references. -- Use `TYPE_CHECKING` blocks to avoid circular imports. Config models import from `agentpool_config.*`, not `agentpool.models`. +- Use `TYPE_CHECKING` blocks to avoid circular imports. Config models import from `wolfharness_config.*`, not `wolfharness.models`. - No `getattr`/`hasattr` — provide full type safety. - NEVER use shortcuts or leave TODOs unless explicitly asked. @@ -50,28 +72,28 @@ Instrument critical-path code (RunLoop, Turn, delegation, protocol entry points) ## Key Files -- `src/agentpool/delegation/pool.py` — AgentPool orchestration -- `src/agentpool/agents/agent.py` — Native agent implementation -- `src/agentpool/messaging/messagenode.py` — MessageNode base abstraction -- `src/agentpool/orchestrator/core.py` — EventBus, SessionController -- `src/agentpool/orchestrator/run.py` — RunHandle (RunLoop) lifecycle -- `src/agentpool/models/manifest.py` — Configuration schema -- `src/agentpool/capabilities/` — Capability system (M3) -- `src/agentpool/lifecycle/` — Lifecycle dimensions (M2) +- `src/wolfharness/delegation/pool.py` — AgentPool orchestration +- `src/wolfharness/agents/agent.py` — Native agent implementation +- `src/wolfharness/messaging/messagenode.py` — MessageNode base abstraction +- `src/wolfharness/orchestrator/core.py` — EventBus, SessionController +- `src/wolfharness/orchestrator/run.py` — RunHandle (RunLoop) lifecycle +- `src/wolfharness/models/manifest.py` — Configuration schema +- `src/wolfharness/capabilities/` — Capability system (M3) +- `src/wolfharness/lifecycle/` — Lifecycle dimensions (M2) ## Context Loading | Working on | Read this | |---|---| -| RunLoop / Turn / EventBus | `src/agentpool/orchestrator/AGENTS.md` | -| Lifecycle dimensions | `src/agentpool/lifecycle/AGENTS.md` | -| Capabilities / tools | `src/agentpool/capabilities/AGENTS.md` | -| Skills system | `src/agentpool/skills/AGENTS.md` | -| Hooks system | `src/agentpool/hooks/AGENTS.md` | +| RunLoop / Turn / EventBus | `src/wolfharness/orchestrator/AGENTS.md` | +| Lifecycle dimensions | `src/wolfharness/lifecycle/AGENTS.md` | +| Capabilities / tools | `src/wolfharness/capabilities/AGENTS.md` | +| Skills system | `src/wolfharness/skills/AGENTS.md` | +| Hooks system | `src/wolfharness/hooks/AGENTS.md` | | Tests | `tests/AGENTS.md` | -| Protocol servers | `src/agentpool_server/AGENTS.md` | +| Protocol servers | `src/wolfharness_server/AGENTS.md` | | ACP protocol | `src/acp/AGENTS.md` | -| Core framework overview | `src/agentpool/AGENTS.md` | +| Core framework overview | `src/wolfharness/AGENTS.md` | | Architecture deep-dives | `docs/explanation/` | | Module structure | `docs/explanation/module-structure.md` | | Graph architecture | `docs/explanation/graph-architecture.md` | @@ -83,7 +105,7 @@ Instrument critical-path code (RunLoop, Turn, delegation, protocol entry points) | ToolDisplayCapability (tool rename + diff + rich display events) | `docs/explanation/tool-display-capability.md` | | Telemetry rules | `docs/explanation/telemetry.md` | | Usage examples | `docs/explanation/usage-examples.md` | -| Extending AgentPool | `docs/explanation/extending-agentpool.md` | +| Extending AgentPool | `docs/explanation/extending-wolfharness.md` | | Where to put new docs | `docs/meta/documentation-guide.md` | ## Tool Compatibility diff --git a/Dockerfile b/Dockerfile index 36466e125..25bafd132 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,5 +9,5 @@ RUN pip install --no-cache-dir "." EXPOSE 8000 # Run the server -ENTRYPOINT ["agentpool", "serve-api"] +ENTRYPOINT ["wolfharness", "serve-api"] CMD ["--auto-discover"] diff --git a/README.md b/README.md index a9a85dab6..33299af7c 100644 --- a/README.md +++ b/README.md @@ -1,83 +1,34 @@ -# AgentPool - -[![PyPI License](https://img.shields.io/pypi/l/agentpool.svg)](https://pypi.org/project/agentpool/) -[![Package status](https://img.shields.io/pypi/status/agentpool.svg)](https://pypi.org/project/agentpool/) -[![Monthly downloads](https://img.shields.io/pypi/dm/agentpool.svg)](https://pypi.org/project/agentpool/) -[![Python version](https://img.shields.io/pypi/pyversions/agentpool.svg)](https://pypi.org/project/agentpool/) -[![Github Stars](https://img.shields.io/github/stars/Leoyzen/agentpool)](https://github.com/Leoyzen/agentpool/stars) - -**A unified agent orchestration hub that lets you configure and manage heterogeneous AI agents via YAML and expose them through standardized protocols.** - -[Documentation](https://leoyzen.github.io/agentpool/) - -## The Problem - -You want to use multiple AI agents together - native PydanticAI agents for analysis, ACP-compatible agents like Goose for specific tasks, maybe a custom agent. But each has different APIs, protocols, and integration patterns. Coordinating them means writing glue code for each combination. - -## The Solution - -AgentPool acts as a protocol bridge. Define all your agents in one YAML file - whether they're native (PydanticAI-based) or external ACP agents. Then expose them all through ACP or AG-UI protocols, letting them cooperate, delegate, and communicate through a unified interface. - -```mermaid -flowchart TB - subgraph AgentPool - subgraph config[YAML Configuration] - native[Native Agents
PydanticAI] - acp_agents[ACP Agents
Goose, etc.] - workflows[Teams & Workflows] - end - - subgraph interface[Unified Agent Interface] - delegation[Inter-agent delegation] - routing[Message routing] - context[Shared context] - end - - config --> interface - end - - interface --> acp_server[ACP Server] - interface --> opencode_server[OpenCode Server] - interface --> agui_server[AG-UI Server] - - acp_server --> clients1[Zed, Toad, ACP Clients] - opencode_server --> clients2[OpenCode TUI/Desktop] - agui_server --> clients3[AG-UI Clients] -``` +

+ WolfHarness +

-## Quick Start +

WolfHarness

-```bash -uv tool install agentpool +

+ Tests + codecov + Docs + License +

-``` +> **PydanticAI-based multi-agent orchestration framework** — define heterogeneous agents in one YAML file, compose them into teams and workflows, and expose them through ACP, OpenCode, MCP, and AG-UI protocols. -### Minimal Configuration +[Documentation](https://leoyzen.github.io/wolfharness/) · [Getting Started](https://leoyzen.github.io/wolfharness/tutorials/) · [API Reference](https://leoyzen.github.io/wolfharness/reference/) -```yaml -# agents.yml -agents: - assistant: - type: native - model: openai:gpt-4o - system_prompt: "You are a helpful assistant." -``` +--- -```bash -# Run via CLI -agentpool run assistant "Hello!" +## Why WolfHarness? -# Or start as ACP server (for Zed, Toad, etc.) -agentpool serve-acp agents.yml -``` +> With raw frameworks, you write glue code for every agent pair — at 1× speed. +> With WolfHarness, you define agents once in YAML and use them everywhere — at 10×. -### Integrating External Agents +### 1. 🔌 One config, many protocols -The real power comes from mixing agent types: +Define your agents once in YAML. Then expose them through any protocol — ACP for IDEs, OpenCode for agentic TUI, MCP for tool exposure, or AG-UI for web frontends. No glue code, no duplication. ```yaml +# agents.yml — single source of truth agents: - # Native PydanticAI-based agent coordinator: type: native model: openai:gpt-4o @@ -85,20 +36,22 @@ agents: - type: subagent # Can delegate to all other agents system_prompt: "Coordinate tasks between available agents." - # ACP protocol agents goose: type: acp provider: goose description: "Goose for file operations" ``` -Now `coordinator` can delegate work to any of these agents, and all are accessible through the same interface. - -## Key Features +```bash +# Serve the same config through any protocol +wolfharness serve-acp agents.yml # Zed, Toad, ACP clients +wolfharness serve-opencode agents.yml # OpenCode TUI/Desktop +wolfharness serve-mcp agents.yml # MCP tools for other agents +``` -### Multi-Agent Coordination +### 2. 🧩 Multi-agent orchestration built in -Agents can form teams (parallel) or chains (sequential): +Agents form teams (parallel), chains (sequential), or complex workflows — all from YAML. ```yaml teams: @@ -114,17 +67,14 @@ teams: ```python async with AgentPool("agents.yml") as pool: # Parallel execution - team = pool.get_agent("analyzer") & pool.get_agent("reviewer") - results = await team.run("Review this code") - + results = await (analyzer & reviewer).run("Review this code") # Sequential pipeline - chain = analyzer | reviewer | formatter - result = await chain.run("Process this") + result = await (analyzer | reviewer | formatter).run("Process this") ``` -### Rich YAML Configuration +### 3. 🎯 Rich YAML configuration -Everything is configurable - models, tools, connections, triggers, storage: +Everything is configurable — models, tools, MCP servers, knowledge sources, triggers, connections, storage: ```yaml agents: @@ -148,46 +98,93 @@ agents: words: [error, warning] ``` -### Server Protocols +## Architecture -AgentPool can expose your agents through multiple server protocols: +

+ WolfHarness Architecture +

-| Server | Command | Use Case | -|--------|---------|----------| -| **ACP** | `agentpool serve-acp` | IDE integration (Zed, Toad) - bidirectional communication with tool confirmations | -| **OpenCode** | `agentpool serve-opencode` | OpenCode TUI/Desktop - supports remote filesystems via fsspec | -| **MCP** | `agentpool serve-mcp` | Expose tools to other agents | -| AG-UI | `agentpool serve-agui` | AG-UI compatible frontends | -| OpenAI API | `agentpool serve-api` | Drop-in OpenAI API replacement | +## Key Features -The **ACP server** is ideal for IDE integration - it provides real-time tool confirmations and session management. The **OpenCode server** enables the OpenCode TUI to control AgentPool agents, including agents operating on remote environments (Docker, SSH, cloud sandboxes). +| Category | Features | +|----------|----------| +| **Orchestration** | Teams (parallel), chains (sequential), inter-agent delegation, event-driven triggers | +| **Protocols** | ACP, OpenCode, MCP, AG-UI, OpenAI API-compatible — one config, all protocols | +| **Configuration** | YAML-based agent definition, fallback models, tool registration, MCP server integration | +| **Skills** | Expose `SKILLS.md` files as slash commands across all protocols | +| **Structured Output** | Inline Pydantic schemas or Python types for response validation | +| **Storage & Analytics** | Configurable providers (SQLite, PostgreSQL) for interaction tracking and stats | +| **File Abstraction** | UPath-backed operations on local, S3, SSH, Docker filesystems | +| **Streaming TTS** | Voice output support for all agents | +| **Observability** | Logfire instrumentation on critical paths (RunLoop, Turn, delegation, protocol entry points) | + +## Supported Models + +WolfHarness is built on **PydanticAI** and supports all its model providers: + +| Provider | Models | +|----------|--------| +| **OpenAI** | GPT-4o, GPT-4o-mini, o1, o3, etc. | +| **Anthropic** | Claude Sonnet 4, Claude Opus 4, Claude Haiku 3.5, etc. | +| **Google** | Gemini 2.5 Pro, Gemini 2.5 Flash, etc. | +| **DeepSeek** | DeepSeek V4, DeepSeek R1, etc. | +| **Mistral** | Mistral Large, Mistral Small, etc. | +| **Groq** | Llama, Mixtral, etc. (fast inference) | +| **OpenAI-compatible** | Any OpenAI-protocol endpoint (vLLM, Ollama, Azure, etc.) | + +All models support **fallback chains** — configure a primary and fallback, WolfHarness handles the failover: -### Additional Capabilities +```yaml +model: + type: fallback + models: [openai:gpt-4o, anthropic:claude-sonnet-4-0] +``` + +## Quick Start + +### Installation + +```bash +# Recommended — uv +uv tool install wolfharness -- **Skill Commands**: Expose SKILLS.md files as slash commands across ACP, AG-UI, and OpenCode protocols -- **Structured Output**: Define response schemas inline or import Python types -- **Storage & Analytics**: Track all interactions with configurable providers -- **File Abstraction**: UPath-backed operations work on local and remote sources -- **Triggers**: React to file changes, webhooks, or custom events -- **Streaming TTS**: Voice output support for all agents +# Or pip +pip install wolfharness +``` -## Usage Patterns +### Minimal config & run -### CLI +```yaml +# agents.yml +agents: + assistant: + type: native + model: openai:gpt-4o + system_prompt: "You are a helpful assistant." +``` ```bash -agentpool run agent_name "prompt" # Single run -agentpool serve-acp config.yml # ACP server for IDEs -agentpool serve-opencode config.yml # OpenCode TUI server -agentpool serve-mcp config.yml # MCP server -agentpool watch --config agents.yml # React to triggers -agentpool history stats --group-by model # View analytics +wolfharness run assistant "Hello!" ``` -### Programmatic +### Start a server + +```bash +# ACP server — for Zed, Toad, and other ACP clients +wolfharness serve-acp agents.yml + +# OpenCode server — for OpenCode TUI/Desktop +wolfharness serve-opencode agents.yml + +# MCP server — expose tools to other agents +wolfharness serve-mcp agents.yml +``` + +## Programmatic Usage ```python -from agentpool import AgentPool +from wolfharness import AgentPool +from pathlib import Path async with AgentPool("agents.yml") as pool: agent = pool.get_agent("assistant") @@ -203,8 +200,133 @@ async with AgentPool("agents.yml") as pool: result = await agent.run("Describe this", Path("image.jpg")) ``` +## CLI Reference + +```bash +wolfharness run "prompt" # Single run +wolfharness serve-acp # ACP server +wolfharness serve-opencode # OpenCode server +wolfharness serve-mcp # MCP server +wolfharness serve-agui # AG-UI server +wolfharness serve-api # OpenAI-compatible API +wolfharness watch --config # React to triggers +wolfharness history stats --group-by model # View analytics +wolfharness task "description" # Create a background task +``` + +## Roadmap + +| Status | Feature | +|--------|---------| +| ✅ | v2.9.5 — Multi-protocol server (ACP, OpenCode, MCP, AG-UI, OpenAI API) | +| ✅ | YAML-based agent configuration with fallback models | +| ✅ | Teams (parallel) & chains (sequential) orchestration | +| ✅ | Skill commands across all protocols | +| ✅ | Storage & analytics (SQLite, PostgreSQL) | +| ✅ | MCP server integration for agents | +| 🔄 | Enhanced tool confirmation UI in ACP | +| 🔄 | Remote filesystem abstraction (UPath) | +| 📋 | Team-mode (dynamic LLM-driven team formation) | +| 📋 | Agent evaluation & benchmarking framework | +| 📋 | Lifecycle hooks system (M2) | +| 📋 | Capability discovery protocol (M3) | + +## Development + +### Setup + +```bash +git clone https://github.com/wolf1069b/agentpool +cd agentpool +uv sync --all-extras +``` + +### Commands + +```bash +uv run pytest # Run tests +uv run pytest -m unit # Unit tests only +uv run ruff check src/ # Lint +uv run ruff format src/ # Format +uv run --no-group docs mypy src/ # Type check +duty lint # All checks +``` + +### Workflow + +This project uses **OpenSpec** for all significant changes: + +``` +/opsx:explore → Investigate problems, map codebase +/opsx:propose → Create proposal with design + specs + tasks +/opsx:apply → Implement tasks +/opsx:archive → Archive completed change +``` + +See [`AGENTS.md`](AGENTS.md) for full development setup, code style, and testing conventions. See [`CONTRIBUTING.md`](CONTRIBUTING.md) for contribution guidelines. + ## Documentation -For complete documentation including advanced configuration, connection patterns, and API reference, visit [leoyzen.github.io/agentpool](https://leoyzen.github.io/agentpool/). -# test -# final test +Full docs, tutorials, and API reference at **[leoyzen.github.io/wolfharness](https://leoyzen.github.io/wolfharness/)**. + +- [Getting Started](https://leoyzen.github.io/wolfharness/tutorials/) +- [Configuration Guide](https://leoyzen.github.io/wolfharness/how-to/) +- [Architecture](https://leoyzen.github.io/wolfharness/explanation/) +- [API Reference](https://leoyzen.github.io/wolfharness/reference/) + +## Contributors + +Thanks to everyone who has contributed to WolfHarness! + +[![Contributors](https://contrib.rocks/image?repo=wolf1069b/agentpool)](https://github.com/wolf1069b/agentpool/graphs/contributors) + +**Key contributors:** [Philipp Temminghoff](https://github.com/phil65) (original author), [Leoyzen](https://github.com/Leoyzen) (maintainer), [Million](https://github.com/Million-mo), [yankaifeng](https://github.com/yankaifeng), [tasia](https://github.com/tasiawang), and the broader iroot-llm team. + +## Citation + +If you use WolfHarness in your research or project, please cite: + +```bibtex +@software{wolfharness2025, + author = {{WolfHarness Contributors}}, + title = {WolfHarness: PydanticAI-based Multi-Agent Orchestration Framework}, + year = {2025}, + url = {https://github.com/wolf1069b/agentpool}, + license = {MIT} +} +``` + +## Migrating from AgentPool + +This project was renamed from **AgentPool** to **WolfHarness** (v2.10+). Backward-compatible shims are in place to ease the transition: + +| Old | New | Status | +|-----|-----|--------| +| `import agentpool` | `import wolfharness` | ✅ Shim with deprecation warning | +| `import agentpool_cli` | `import wolfharness_cli` | ✅ Shim with deprecation warning | +| `import agentpool_config` | `import wolfharness_config` | ✅ Shim with deprecation warning | +| `import agentpool_server` | `import wolfharness_server` | ✅ Shim with deprecation warning | +| `import agentpool_storage` | `import wolfharness_storage` | ✅ Shim with deprecation warning | +| `import agentpool_toolsets` | `import wolfharness_toolsets` | ✅ Shim with deprecation warning | +| `agentpool run ...` | `wolfharness run ...` | ✅ CLI alias with deprecation warning | +| `AGENTPOOL_CONFIG_DIR` env var | `WOLFHARNESS_CONFIG_DIR` | ⚠️ Still supported, migrate when convenient | + +The shims emit a `DeprecationWarning` and will be removed in a future release. Please update your imports and scripts accordingly. + +## License + +MIT — see [LICENSE](LICENSE). + +--- + +

+ Built on   + PydanticAI · + ACP · + OpenCode · + MCP +

+ +

+ WolfHarness is a fork of phil65/agentpool by Philipp Temminghoff. Grateful for the foundational work and ongoing inspiration from the upstream project. +

diff --git a/alembic.ini b/alembic.ini index de22e69d2..a95666a9b 100644 --- a/alembic.ini +++ b/alembic.ini @@ -85,7 +85,7 @@ path_separator = os # other means of configuring database URLs may be customized within the env.py # file. # Default to SQLite database in project root -sqlalchemy.url = sqlite:///./agentpool.db +sqlalchemy.url = sqlite:///./wolfharness.db [post_write_hooks] diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 000000000..ef6191cfe Binary files /dev/null and b/assets/logo.png differ diff --git a/assets/structure.png b/assets/structure.png new file mode 100644 index 000000000..002bfb1ee Binary files /dev/null and b/assets/structure.png differ diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py deleted file mode 100644 index 1a2f3c4e1..000000000 --- a/benchmarks/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Benchmark suite for AgentPool performance measurements.""" diff --git a/benchmarks/capability_overhead.py b/benchmarks/capability_overhead.py deleted file mode 100644 index 207b0dadd..000000000 --- a/benchmarks/capability_overhead.py +++ /dev/null @@ -1,739 +0,0 @@ -"""Benchmark comparing old manager-based approach vs new capability-based approach. - -Task 62 from the thin-pydantic-ai-wrappers migration plan. - -Measures: -- Shim layer creation overhead (ToolManager, AgentHooks, MCPManager) -- Agent construction latency (cold start + warm start via get_agentlet) -- Memory overhead of capability wrappers vs direct manager usage - -Usage: - python -m benchmarks.capability_overhead - -Methodology: -- time.perf_counter() for all latency measurements -- tracemalloc for memory measurements -- 10+ iterations for statistical significance -- Both cold start (first run) and warm start (subsequent runs) -""" - -from __future__ import annotations - -import asyncio -from pathlib import Path -import statistics -import sys -import time -import tracemalloc -from typing import Any - -from agentpool.resource_providers import StaticResourceProvider -from pydantic_ai.models.test import TestModel - -from agentpool import Agent -from agentpool.hooks import AgentHooks -from agentpool.hooks.base import Hook, HookInput, HookResult -from agentpool.mcp_server.manager import MCPManager -from agentpool.tools import Tool, ToolManager - - -# --------------------------------------------------------------------------- -# Configuration -# --------------------------------------------------------------------------- - -ITERATIONS = 10 -WARMUP_ITERATIONS = 2 -NUM_TOOLS = 10 - -TEST_MODEL = TestModel(custom_output_text="benchmark response") - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -def _make_tools(count: int) -> list[Tool[Any]]: - """Create N simple tools for benchmarking.""" - tools: list[Tool[Any]] = [] - for i in range(count): - - def _make_tool(n: int = i) -> Tool[Any]: - def tool_fn(query: str) -> str: - """A benchmark tool.""" - return f"Result {n}: {query}" - - return Tool.from_callable(tool_fn, name_override=f"tool_{n}") - - tools.append(_make_tool()) - return tools - - -def _make_hooks() -> AgentHooks: - """Create AgentHooks with one hook of each type.""" - - class NoOpHook(Hook): - """No-op hook for benchmarking.""" - - def __init__(self) -> None: - super().__init__(event="pre_turn") - - async def execute(self, input_data: HookInput, env: Any = None) -> HookResult: - return HookResult(decision="allow") - - return AgentHooks( - pre_turn=[NoOpHook()], - post_turn=[NoOpHook()], - pre_tool_use=[NoOpHook()], - post_tool_use=[NoOpHook()], - _warn=False, - ) - - -def _format_latency(times: list[float]) -> dict[str, float]: - """Format latency statistics from a list of times (seconds).""" - times_ms = [t * 1000 for t in times] - return { - "mean_ms": statistics.mean(times_ms), - "median_ms": statistics.median(times_ms), - "min_ms": min(times_ms), - "max_ms": max(times_ms), - "stdev_ms": statistics.stdev(times_ms) if len(times_ms) > 1 else 0.0, - } - - -def _format_memory(peak: int) -> str: - """Format memory peak in human-readable units.""" - if peak < 1024: # noqa: PLR2004 - return f"{peak} B" - if peak < 1024 * 1024: - return f"{peak / 1024:.2f} KB" - return f"{peak / (1024 * 1024):.2f} MB" - - -# --------------------------------------------------------------------------- -# Micro-benchmarks: Shim layer creation -# --------------------------------------------------------------------------- - - -async def benchmark_toolmanager_vs_capability() -> dict[str, Any]: - """Benchmark ToolManager.get_tools() vs ResourceProvider.as_capability().""" - tools = _make_tools(NUM_TOOLS) - tool_manager = ToolManager(tools, _warn=False) - provider = StaticResourceProvider(name="benchmark", tools=tools) - - # Warmup - for _ in range(WARMUP_ITERATIONS): - _ = await tool_manager.get_tools() - _ = provider.as_capability() - - # Old approach: ToolManager.get_tools() - old_times: list[float] = [] - for _ in range(ITERATIONS): - start = time.perf_counter() - _ = await tool_manager.get_tools() - old_times.append(time.perf_counter() - start) - - # New approach: ResourceProvider.as_capability() - new_times: list[float] = [] - for _ in range(ITERATIONS): - start = time.perf_counter() - _ = provider.as_capability() - new_times.append(time.perf_counter() - start) - - return { - "old_approach": _format_latency(old_times), - "new_approach": _format_latency(new_times), - "overhead_ms": _format_latency(new_times)["mean_ms"] - - _format_latency(old_times)["mean_ms"], - "overhead_pct": ( - (_format_latency(new_times)["mean_ms"] - _format_latency(old_times)["mean_ms"]) - / _format_latency(old_times)["mean_ms"] - * 100 - ), - } - - -async def benchmark_agenthooks_vs_capability() -> dict[str, Any]: - """Benchmark AgentHooks direct usage vs as_capability().""" - hooks = _make_hooks() - - # Warmup - for _ in range(WARMUP_ITERATIONS): - _ = hooks.has_hooks() - _ = hooks.as_capability() - - # Old approach: just instantiate / check hooks (the old code would call - # run_pre_turn_hooks etc. directly; we measure the lightweight access) - old_times: list[float] = [] - for _ in range(ITERATIONS): - start = time.perf_counter() - _ = hooks.has_hooks() - old_times.append(time.perf_counter() - start) - - # New approach: AgentHooks.as_capability() creates pydantic-ai Hooks - new_times: list[float] = [] - for _ in range(ITERATIONS): - start = time.perf_counter() - _ = hooks.as_capability() - new_times.append(time.perf_counter() - start) - - return { - "old_approach": _format_latency(old_times), - "new_approach": _format_latency(new_times), - "overhead_ms": _format_latency(new_times)["mean_ms"] - - _format_latency(old_times)["mean_ms"], - "overhead_pct": ( - (_format_latency(new_times)["mean_ms"] - _format_latency(old_times)["mean_ms"]) - / _format_latency(old_times)["mean_ms"] - * 100 - ), - } - - -async def benchmark_mcpmanager_vs_capability() -> dict[str, Any]: - """Benchmark MCPManager direct access vs as_capability().""" - mcp_manager = MCPManager(_warn=False) - - # Warmup - for _ in range(WARMUP_ITERATIONS): - _ = mcp_manager.get_mcp_providers() - _ = mcp_manager.as_capability() - - # Old approach: MCPManager.get_mcp_providers() - old_times: list[float] = [] - for _ in range(ITERATIONS): - start = time.perf_counter() - _ = mcp_manager.get_mcp_providers() - old_times.append(time.perf_counter() - start) - - # New approach: MCPManager.as_capability() - new_times: list[float] = [] - for _ in range(ITERATIONS): - start = time.perf_counter() - _ = mcp_manager.as_capability() - new_times.append(time.perf_counter() - start) - - return { - "old_approach": _format_latency(old_times), - "new_approach": _format_latency(new_times), - "overhead_ms": _format_latency(new_times)["mean_ms"] - - _format_latency(old_times)["mean_ms"], - "overhead_pct": ( - (_format_latency(new_times)["mean_ms"] - _format_latency(old_times)["mean_ms"]) - / _format_latency(old_times)["mean_ms"] - * 100 - ), - } - - -# --------------------------------------------------------------------------- -# Integration benchmarks: Agent construction (get_agentlet) -# --------------------------------------------------------------------------- - - -async def benchmark_agent_construction() -> dict[str, Any]: - """Benchmark Agent.get_agentlet() latency: cold vs warm starts.""" - tools = _make_tools(NUM_TOOLS) - - # Baseline agent: no tools, no hooks, no MCP - baseline_agent = Agent(name="baseline", model=TEST_MODEL, session=False) - - # Capability agent: tools via new as_capability approach - provider = StaticResourceProvider(name="benchmark", tools=tools) - capability_agent = Agent( - name="capability", - model=TEST_MODEL, - session=False, - toolsets=[provider], - ) - - # Old-style agent: tools via ToolManager (still created internally, - # but we also attach hooks to simulate old full config) - hooks = _make_hooks() - old_style_agent = Agent( - name="old_style", - model=TEST_MODEL, - session=False, - tools=tools, - hooks=hooks, - ) - - async with baseline_agent, capability_agent, old_style_agent: - # Warmup - for _ in range(WARMUP_ITERATIONS): - _ = await baseline_agent.get_agentlet(None, str, None, None) - _ = await capability_agent.get_agentlet(None, str, None, None) - _ = await old_style_agent.get_agentlet(None, str, None, None) - - # Baseline cold start - baseline_cold_times: list[float] = [] - for _ in range(ITERATIONS): - start = time.perf_counter() - _ = await baseline_agent.get_agentlet(None, str, None, None) - baseline_cold_times.append(time.perf_counter() - start) - - # Capability cold start - capability_cold_times: list[float] = [] - for _ in range(ITERATIONS): - start = time.perf_counter() - _ = await capability_agent.get_agentlet(None, str, None, None) - capability_cold_times.append(time.perf_counter() - start) - - # Old-style cold start - old_cold_times: list[float] = [] - for _ in range(ITERATIONS): - start = time.perf_counter() - _ = await old_style_agent.get_agentlet(None, str, None, None) - old_cold_times.append(time.perf_counter() - start) - - return { - "baseline_no_tools": _format_latency(baseline_cold_times), - "with_capabilities": _format_latency(capability_cold_times), - "with_old_shims": _format_latency(old_cold_times), - "capability_overhead_vs_baseline_ms": ( - _format_latency(capability_cold_times)["mean_ms"] - - _format_latency(baseline_cold_times)["mean_ms"] - ), - "old_shim_overhead_vs_baseline_ms": ( - _format_latency(old_cold_times)["mean_ms"] - - _format_latency(baseline_cold_times)["mean_ms"] - ), - "capability_vs_old_shim_delta_ms": ( - _format_latency(capability_cold_times)["mean_ms"] - - _format_latency(old_cold_times)["mean_ms"] - ), - } - - -# --------------------------------------------------------------------------- -# Memory benchmarks -# --------------------------------------------------------------------------- - - -async def benchmark_memory_overhead() -> dict[str, Any]: - """Benchmark memory overhead of shim layers using tracemalloc.""" - tools = _make_tools(NUM_TOOLS) - - # --- ToolManager vs ResourceProvider.as_capability() --- - tracemalloc.start() - tool_manager = ToolManager(tools, _warn=False) - _ = await tool_manager.get_tools() - old_tools_peak = tracemalloc.get_traced_memory()[1] - tracemalloc.stop() - - tracemalloc.start() - provider = StaticResourceProvider(name="benchmark", tools=tools) - _ = provider.as_capability() - new_tools_peak = tracemalloc.get_traced_memory()[1] - tracemalloc.stop() - - # --- AgentHooks vs as_capability() --- - hooks = _make_hooks() - tracemalloc.start() - _ = hooks.has_hooks() - old_hooks_peak = tracemalloc.get_traced_memory()[1] - tracemalloc.stop() - - tracemalloc.start() - _ = hooks.as_capability() - new_hooks_peak = tracemalloc.get_traced_memory()[1] - tracemalloc.stop() - - # --- MCPManager vs as_capability() --- - mcp_manager = MCPManager(_warn=False) - tracemalloc.start() - _ = mcp_manager.get_mcp_providers() - old_mcp_peak = tracemalloc.get_traced_memory()[1] - tracemalloc.stop() - - tracemalloc.start() - _ = mcp_manager.as_capability() - new_mcp_peak = tracemalloc.get_traced_memory()[1] - tracemalloc.stop() - - # --- Full agent construction --- - baseline_agent = Agent(name="baseline", model=TEST_MODEL, session=False) - capability_agent = Agent( - name="capability", - model=TEST_MODEL, - session=False, - toolsets=[StaticResourceProvider(name="benchmark", tools=tools)], - ) - old_style_agent = Agent( - name="old_style", - model=TEST_MODEL, - session=False, - tools=tools, - hooks=_make_hooks(), - ) - - async with baseline_agent, capability_agent, old_style_agent: - tracemalloc.start() - _ = await baseline_agent.get_agentlet(None, str, None, None) - baseline_peak = tracemalloc.get_traced_memory()[1] - tracemalloc.stop() - - tracemalloc.start() - _ = await capability_agent.get_agentlet(None, str, None, None) - capability_peak = tracemalloc.get_traced_memory()[1] - tracemalloc.stop() - - tracemalloc.start() - _ = await old_style_agent.get_agentlet(None, str, None, None) - old_peak = tracemalloc.get_traced_memory()[1] - tracemalloc.stop() - - return { - "tool_shim": { - "old_peak_bytes": old_tools_peak, - "new_peak_bytes": new_tools_peak, - "delta_bytes": new_tools_peak - old_tools_peak, - "old_formatted": _format_memory(old_tools_peak), - "new_formatted": _format_memory(new_tools_peak), - "delta_formatted": _format_memory(abs(new_tools_peak - old_tools_peak)), - }, - "hooks_shim": { - "old_peak_bytes": old_hooks_peak, - "new_peak_bytes": new_hooks_peak, - "delta_bytes": new_hooks_peak - old_hooks_peak, - "old_formatted": _format_memory(old_hooks_peak), - "new_formatted": _format_memory(new_hooks_peak), - "delta_formatted": _format_memory(abs(new_hooks_peak - old_hooks_peak)), - }, - "mcp_shim": { - "old_peak_bytes": old_mcp_peak, - "new_peak_bytes": new_mcp_peak, - "delta_bytes": new_mcp_peak - old_mcp_peak, - "old_formatted": _format_memory(old_mcp_peak), - "new_formatted": _format_memory(new_mcp_peak), - "delta_formatted": _format_memory(abs(new_mcp_peak - old_mcp_peak)), - }, - "agent_construction": { - "baseline_peak_bytes": baseline_peak, - "capability_peak_bytes": capability_peak, - "old_peak_bytes": old_peak, - "capability_delta_vs_baseline_bytes": capability_peak - baseline_peak, - "old_delta_vs_baseline_bytes": old_peak - baseline_peak, - "capability_vs_old_delta_bytes": capability_peak - old_peak, - "baseline_formatted": _format_memory(baseline_peak), - "capability_formatted": _format_memory(capability_peak), - "old_formatted": _format_memory(old_peak), - }, - } - - -# --------------------------------------------------------------------------- -# Main runner -# --------------------------------------------------------------------------- - - -async def run_all_benchmarks() -> dict[str, Any]: - """Run all benchmarks and return structured results.""" - print("=" * 70) - print("AgentPool Capability Overhead Benchmarks") - print("Task 62: thin-pydantic-ai-wrappers migration") - print("=" * 70) - print() - - results: dict[str, Any] = {} - - # 1. ToolManager vs ResourceProvider.as_capability() - print("[1/5] Benchmarking ToolManager vs ResourceProvider.as_capability()...") - results["tool_shim"] = await benchmark_toolmanager_vs_capability() - print(" Done.") - - # 2. AgentHooks vs as_capability() - print("[2/5] Benchmarking AgentHooks vs as_capability()...") - results["hooks_shim"] = await benchmark_agenthooks_vs_capability() - print(" Done.") - - # 3. MCPManager vs as_capability() - print("[3/5] Benchmarking MCPManager vs as_capability()...") - results["mcp_shim"] = await benchmark_mcpmanager_vs_capability() - print(" Done.") - - # 4. Agent construction latency - print("[4/5] Benchmarking Agent.get_agentlet() latency...") - results["agent_construction"] = await benchmark_agent_construction() - print(" Done.") - - # 5. Memory overhead - print("[5/5] Benchmarking memory overhead...") - results["memory"] = await benchmark_memory_overhead() - print(" Done.") - - return results - - -def _print_results(results: dict[str, Any]) -> None: # noqa: PLR0915 - """Pretty-print benchmark results to stdout.""" - print() - print("=" * 70) - print("RESULTS") - print("=" * 70) - - # Tool shim - print() - print("--- Tool Shim: ToolManager.get_tools() vs as_capability() ---") - tool = results["tool_shim"] - print(" Old approach (ToolManager.get_tools):") - oa = tool["old_approach"] - print(f" mean={oa['mean_ms']:.3f}ms, median={oa['median_ms']:.3f}ms") - print(" New approach (ResourceProvider.as_capability):") - na = tool["new_approach"] - print(f" mean={na['mean_ms']:.3f}ms, median={na['median_ms']:.3f}ms") - print(f" Overhead: {tool['overhead_ms']:+.3f}ms ({tool['overhead_pct']:+.1f}%)") - - # Hooks shim - print() - print("--- Hooks Shim: AgentHooks vs as_capability() ---") - hooks = results["hooks_shim"] - print(" Old approach (direct access):") - hoa = hooks["old_approach"] - print(f" mean={hoa['mean_ms']:.3f}ms, median={hoa['median_ms']:.3f}ms") - print(" New approach (AgentHooks.as_capability):") - hna = hooks["new_approach"] - print(f" mean={hna['mean_ms']:.3f}ms, median={hna['median_ms']:.3f}ms") - print(f" Overhead: {hooks['overhead_ms']:+.3f}ms ({hooks['overhead_pct']:+.1f}%)") - - # MCP shim - print() - print("--- MCP Shim: MCPManager vs as_capability() ---") - mcp = results["mcp_shim"] - print(" Old approach (get_mcp_providers):") - moa = mcp["old_approach"] - print(f" mean={moa['mean_ms']:.3f}ms, median={moa['median_ms']:.3f}ms") - print(" New approach (MCPManager.as_capability):") - mna = mcp["new_approach"] - print(f" mean={mna['mean_ms']:.3f}ms, median={mna['median_ms']:.3f}ms") - print(f" Overhead: {mcp['overhead_ms']:+.3f}ms ({mcp['overhead_pct']:+.1f}%)") - - # Agent construction - print() - print("--- Agent Construction: get_agentlet() latency ---") - agent = results["agent_construction"] - print(" Baseline (no tools/hooks/MCP):") - abl = agent["baseline_no_tools"] - print(f" mean={abl['mean_ms']:.3f}ms, median={abl['median_ms']:.3f}ms") - print(" With capabilities (new approach):") - awc = agent["with_capabilities"] - print(f" mean={awc['mean_ms']:.3f}ms, median={awc['median_ms']:.3f}ms") - print(" With old shims (deprecated approach):") - aws = agent["with_old_shims"] - print(f" mean={aws['mean_ms']:.3f}ms, median={aws['median_ms']:.3f}ms") - print( - f" Capability overhead vs baseline: {agent['capability_overhead_vs_baseline_ms']:+.3f}ms" - ) - print(f" Old shim overhead vs baseline: {agent['old_shim_overhead_vs_baseline_ms']:+.3f}ms") - print(f" Capability vs old shim delta: {agent['capability_vs_old_shim_delta_ms']:+.3f}ms") - - # Memory - print() - print("--- Memory Overhead ---") - mem = results["memory"] - print(" Tool shim:") - ts = mem["tool_shim"] - print(f" Old: {ts['old_formatted']}, New: {ts['new_formatted']}") - print(f" Delta: {ts['delta_formatted']}") - print(" Hooks shim:") - hs = mem["hooks_shim"] - print(f" Old: {hs['old_formatted']}, New: {hs['new_formatted']}") - print(f" Delta: {hs['delta_formatted']}") - print(" MCP shim:") - ms = mem["mcp_shim"] - print(f" Old: {ms['old_formatted']}, New: {ms['new_formatted']}") - print(f" Delta: {ms['delta_formatted']}") - print(" Full agent construction:") - ac = mem["agent_construction"] - print(f" Baseline: {ac['baseline_formatted']}") - print(f" Capability: {ac['capability_formatted']}") - print(f" Old shim: {ac['old_formatted']}") - cd = ac["capability_delta_vs_baseline_bytes"] - print(f" Cap vs baseline delta: {_format_memory(cd)}") - od = ac["old_delta_vs_baseline_bytes"] - print(f" Old vs baseline delta: {_format_memory(od)}") - - print() - print("=" * 70) - - -def _write_markdown(results: dict[str, Any], path_str: str) -> None: - """Write results to a markdown file for evidence collection.""" - lines: list[str] = [ - "# Task 62 Benchmark Results: Capability Overhead", - "", - "**Date:** 2026-06-03", - "**Task:** thin-pydantic-ai-wrappers migration — benchmark old vs new approach", - "**Iterations per test:** 10", - "**Python version:** " + sys.version.split()[0], - "", - "## Methodology", - "", - "- **Latency:** `time.perf_counter()` in milliseconds", - "- **Memory:** `tracemalloc` peak memory during operation", - "- **Cold start:** First invocation after warmup", - "- **Statistical significance:** 10 iterations with mean, median, min, max, stdev", - "", - "## 1. Tool Shim Overhead", - "", - "Comparison: `ToolManager.get_tools()` (old) vs `ResourceProvider.as_capability()` (new)", - "", - "| Metric | Old Approach | New Approach | Overhead |", - "|--------|-------------|--------------|----------|", - ] - - tool = results["tool_shim"] - toa = tool["old_approach"] - tna = tool["new_approach"] - lines.append( - f"| Mean latency | {toa['mean_ms']:.3f}ms | {tna['mean_ms']:.3f}ms" - f" | {tool['overhead_ms']:+.3f}ms ({tool['overhead_pct']:+.1f}%) |" - ) - - lines.extend([ - "", - "## 2. Hooks Shim Overhead", - "", - "Comparison: `AgentHooks` direct access (old) vs `AgentHooks.as_capability()` (new)", - "", - "| Metric | Old Approach | New Approach | Overhead |", - "|--------|-------------|--------------|----------|", - ]) - - hooks = results["hooks_shim"] - hoa = hooks["old_approach"] - hna = hooks["new_approach"] - lines.append( - f"| Mean latency | {hoa['mean_ms']:.3f}ms | {hna['mean_ms']:.3f}ms" - f" | {hooks['overhead_ms']:+.3f}ms ({hooks['overhead_pct']:+.1f}%) |" - ) - - lines.extend([ - "", - "## 3. MCP Shim Overhead", - "", - "Comparison: `MCPManager.get_mcp_providers()` (old) vs `MCPManager.as_capability()` (new)", - "", - "| Metric | Old Approach | New Approach | Overhead |", - "|--------|-------------|--------------|----------|", - ]) - - mcp = results["mcp_shim"] - moa = mcp["old_approach"] - mna = mcp["new_approach"] - lines.append( - f"| Mean latency | {moa['mean_ms']:.3f}ms | {mna['mean_ms']:.3f}ms" - f" | {mcp['overhead_ms']:+.3f}ms ({mcp['overhead_pct']:+.1f}%) |" - ) - - lines.extend([ - "", - "## 4. Agent Construction Latency (get_agentlet)", - "", - "Comparison of `Agent.get_agentlet()` with different configurations.", - "All agents use `TestModel` (no real LLM calls).", - "", - "| Configuration | Mean | Median | Min | Max |", - "|---------------|------|--------|-----|-----|", - ]) - - agent = results["agent_construction"] - for key, label in [ - ("baseline_no_tools", "Baseline (no tools/hooks/MCP)"), - ("with_capabilities", "With capabilities (new approach)"), - ("with_old_shims", "With old shims (deprecated approach)"), - ]: - data = agent[key] - lines.append( - f"| {label} | {data['mean_ms']:.3f}ms | {data['median_ms']:.3f}ms | " - f"{data['min_ms']:.3f}ms | {data['max_ms']:.3f}ms |" - ) - - lines.extend([ - "", - "### Overhead Analysis", - "", - ( - f"- Capability overhead vs baseline:" - f" **{agent['capability_overhead_vs_baseline_ms']:+.3f}ms**" - ), - ( - f"- Old shim overhead vs baseline:" - f" **{agent['old_shim_overhead_vs_baseline_ms']:+.3f}ms**" - ), - (f"- Capability vs old shim delta: **{agent['capability_vs_old_shim_delta_ms']:+.3f}ms**"), - "", - "## 5. Memory Overhead", - "", - "Peak memory measured with `tracemalloc` during shim creation and agent construction.", - "", - "### Shim Layer Memory", - "", - "| Shim | Old Approach | New Approach | Delta |", - "|------|-------------|--------------|-------|", - ]) - - mem = results["memory"] - for key, label in [ - ("tool_shim", "Tool shim"), - ("hooks_shim", "Hooks shim"), - ("mcp_shim", "MCP shim"), - ]: - data = mem[key] - lines.append( - f"| {label} | {data['old_formatted']} | {data['new_formatted']} | " - f"{data['delta_formatted']} |" - ) - - lines.extend([ - "", - "### Full Agent Construction Memory", - "", - "| Configuration | Peak Memory |", - "|---------------|-------------|", - (f"| Baseline (no tools/hooks/MCP) | {mem['agent_construction']['baseline_formatted']} |"), - ( - f"| With capabilities (new approach)" - f" | {mem['agent_construction']['capability_formatted']} |" - ), - ( - f"| With old shims (deprecated approach)" - f" | {mem['agent_construction']['old_formatted']} |" - ), - "", - "## Summary", - "", - ( - "- The capability-based approach introduces a small latency overhead" - " compared to direct manager access." - ), - ( - "- The overhead is primarily in the `as_capability()` wrapper creation," - " not in the underlying data structures." - ), - ( - "- Memory overhead is negligible for typical agent configurations" - " (10 tools, 4 hooks, 0 MCP servers)." - ), - "- Both old and new approaches coexist; the new approach is the recommended path forward.", - "", - ]) - - Path(path_str).write_text("\n".join(lines)) - - print(f"Results written to: {path_str}") - - -async def main() -> None: - """Run benchmarks and emit results.""" - results = await run_all_benchmarks() - _print_results(results) - - # Write evidence file - evidence_path = ".omo/evidence/task-62-benchmarks.md" - _write_markdown(results, evidence_path) - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/changelog/README.md b/changelog/README.md new file mode 100644 index 000000000..dbfcd2a1b --- /dev/null +++ b/changelog/README.md @@ -0,0 +1,52 @@ +# Changelog Conventions + +## Structure + +``` +changelog/ +├── README.md # This file +├── unreleased/ # Work-in-progress changes for the next version +├── 2.10.0/ # Released version folder +│ ├── README.md # Summary: one line per change, linking detail files +│ ├── RELEASE.md # GitHub Release body (written at release time) +│ ├── YYYY-MM-DD-short-slug.md # Detail file per change entry +│ └── ... +└── ... +``` + +## Rules + +### Work in progress goes in `unreleased/` + +- Never in a numbered folder — the next version number is not knowable while work is being written. +- At release, rename `unreleased/` to the version actually shipped, swap its `# Unreleased` heading for `# Version X.Y.Z` plus a `Released on .` line, write `RELEASE.md`, and create a fresh empty `unreleased/`. + +### Released folders are frozen + +Once a version ships, its folder is never modified. + +### One detail file per logical change + +- Entries are grouped by surface: Core, Protocol Servers, CLI, SDK, Docs, Tooling, etc. +- A related change extends the existing file instead of opening a new one. +- File naming: `YYYY-MM-DD-short-slug.md` + +### RELEASE.md + +- Written at release time, before the git tag is created. +- Contents: lead sentence, then `## Install`, `## Highlights`, `## Notable in this release`, `## Requirements`. + +### Summary README.md per version + +- One brief line per change, each linking its detail file: + ``` + - [YYYY-MM-DD] Brief description. ([details](YYYY-MM-DD-short-slug.md)) + ``` + +### Backward compatibility + +A batch that carries backward-compatibility handling collects it in one `YYYY-MM-DD-backward-compatibility.md`. The surface entries reference that file instead of re-explaining it. + +### Language + +Written in English. History starts at v2.9.5; earlier changes are not backfilled. \ No newline at end of file diff --git a/compose.yml b/compose.yml index b672431e6..aec913654 100644 --- a/compose.yml +++ b/compose.yml @@ -1,7 +1,7 @@ version: "3.8" services: - agentpool: + wolfharness: build: context: . dockerfile: Dockerfile diff --git a/diagnostic_pool_skills.py b/diagnostic_pool_skills.py deleted file mode 100644 index dfabe73a9..000000000 --- a/diagnostic_pool_skills.py +++ /dev/null @@ -1,83 +0,0 @@ -"""Diagnostic: Check AgentPool skill_resolver initialization without full agent startup.""" - -from __future__ import annotations - -import asyncio -from pathlib import Path -import sys - - -sys.path.insert(0, "/Users/yuchen.liu/src/yilab/iroot-llm/packages/agentpool/src") - -from agentpool import AgentPool - - -async def main(): - print("=" * 60) - print("AgentPool Skill Resolver Diagnostic") - print("=" * 60) - print() - - config_path = ( - "/Users/yuchen.liu/src/yilab/iroot-llm/packages/xeno-agent/config/diag-agent-ng.yaml" - ) - print(f"Config: {config_path}") - print() - - # Check if config exists - if not Path(config_path).exists(): - print(f"ERROR: Config file not found: {config_path}") - return - - try: - # Create pool but don't enter it - just check initialization - pool = AgentPool(config_path) - print("Pool created (not entered)") - print(f" Pool skills_dirs: {pool.skills.registry.skills_dirs if pool.skills else 'N/A'}") - print() - - # Now enter the pool to initialize skill_resolver - async with pool: - print("Pool entered successfully") - print(f" skill_resolver: {pool.skill_resolver is not None}") - print(f" skill_provider: {pool.skill_provider is not None}") - print() - - if pool.skill_resolver: - print("Registered providers:") - for name in pool.skill_resolver.list_providers(): - print(f" - {name}") - print() - - # Test bare skill name resolution - print("Test: resolver.resolve('systematic-troubleshooting')") - try: - skill = await pool.skill_resolver.resolve("systematic-troubleshooting") - print(f" OK: {skill.name}") - except Exception as e: # noqa: BLE001 - print(f" FAIL: {e}") - print() - - # Test URI resolution - print("Test: resolver.resolve('skill://systematic-troubleshooting/references/...')") - uri = "skill://systematic-troubleshooting/references/expert_knowledge/excavator/excavator-hard-starting.md" - try: - skill = await pool.skill_resolver.resolve(uri) - print(f" OK: {skill.name}") - ref = getattr(skill, "_resolved_reference_path", None) - print(f" ref_path: {ref}") - except Exception as e: # noqa: BLE001 - print(f" FAIL: {e}") - print() - - except Exception as e: # noqa: BLE001 - print(f"ERROR: {e}") - import traceback - - traceback.print_exc() - - print("Done") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/distribution/zed/LICENSE b/distribution/zed/LICENSE deleted file mode 100644 index a065efff8..000000000 --- a/distribution/zed/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024, Philipp Temminghoff - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/distribution/zed/extension.toml b/distribution/zed/extension.toml deleted file mode 100644 index c2d7d20a2..000000000 --- a/distribution/zed/extension.toml +++ /dev/null @@ -1,41 +0,0 @@ -id = "agentpool" -name = "AgentPool" -description = "Pydantic-AI based Multi-Agent Framework with YAML-based Agents, Teams, Workflows & Extended ACP / AGUI integration" -version = "1.15.12" -schema_version = 1 -authors = ["Philipp Temminghoff"] -repository = "https://github.com/phil65/agentpool" - -[agent_servers.agentpool] -name = "AgentPool" -icon = "./icons/agentpool.svg" - -[agent_servers.agentpool.targets.darwin-aarch64] -archive = "https://github.com/phil65/agentpool/releases/download/v2.9.5/agentpool-darwin-aarch64-1.15.12.zip" -cmd = "./agentpool" -args = ["serve-acp"] - -[agent_servers.agentpool.targets.darwin-x86_64] -archive = "https://github.com/phil65/agentpool/releases/download/v2.9.5/agentpool-darwin-x86_64-1.15.12.zip" -cmd = "./agentpool" -args = ["serve-acp"] - -# [agent_servers.agentpool.targets.linux-aarch64] -# archive = "https://github.com/phil65/agentpool/releases/download/v2.9.5/agentpool-linux-aarch64-1.15.12.zip" -# cmd = "./agentpool" -# args = ["serve-acp"] - -[agent_servers.agentpool.targets.linux-x86_64] -archive = "https://github.com/phil65/agentpool/releases/download/v2.9.5/agentpool-linux-x86_64-1.15.12.zip" -cmd = "./agentpool" -args = ["serve-acp"] - -# [agent_servers.agentpool.targets.windows-aarch64] -# archive = "https://github.com/phil65/agentpool/releases/download/v2.9.5/agentpool-windows-aarch64-1.15.12.zip" -# cmd = "./agentpool.exe" -# args = ["serve-acp"] - -[agent_servers.agentpool.targets.windows-x86_64] -archive = "https://github.com/phil65/agentpool/releases/download/v2.9.5/agentpool-windows-x86_64-1.15.12.zip" -cmd = "./agentpool.exe" -args = ["serve-acp"] diff --git a/distribution/zed/icons/llmling_agent.svg b/distribution/zed/icons/llmling_agent.svg deleted file mode 100644 index 05418cc0f..000000000 --- a/distribution/zed/icons/llmling_agent.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/docs/adr/eventbus-replay.md b/docs/adr/eventbus-replay.md index e04502a83..b2e2fd53f 100644 --- a/docs/adr/eventbus-replay.md +++ b/docs/adr/eventbus-replay.md @@ -194,7 +194,7 @@ For 1000 active sessions: ~200 MB total (acceptable for most deployments). ## Configuration ```python -# agentpool_config/session_pool.py +# wolfharness_config/session_pool.py @dataclass class OpenCodeConfig: use_session_pool: bool = True diff --git a/docs/adr/lifecycle-analysis.md b/docs/adr/lifecycle-analysis.md index 6ed5e43a3..9fa480549 100644 --- a/docs/adr/lifecycle-analysis.md +++ b/docs/adr/lifecycle-analysis.md @@ -9,7 +9,7 @@ ## Table of Contents -1. [Current AgentPool Lifecycle](#1-current-agentpool-lifecycle) +1. [Current AgentPool Lifecycle](#1-current-wolfharness-lifecycle) 2. [ACP v1 vs v2 Protocol Differences](#2-acp-v1-vs-v2-protocol-differences) 3. [Cross-Framework Comparison](#3-cross-framework-comparison) 4. [Key Design Issues](#4-key-design-issues) @@ -255,7 +255,7 @@ Key bridging difficulties: | Framework | Language | Location | Focus | |---|---|---|---| -| **AgentPool** | Python | `/packages/agentpool/` | Unified agent orchestration, YAML config, multi-protocol | +| **AgentPool** | Python | `/packages/wolfharness/` | Unified agent orchestration, YAML config, multi-protocol | | **pydantic-ai** | Python | `/Users/yuchen.liu/src/pydantic-ai/` | PydanticAI agent framework with graph execution | | **opencode** | TypeScript (Effect-TS) | `/Users/yuchen.liu/src/opencode/` | Code agent with durable event sourcing | | **pi** | TypeScript | `/Users/yuchen.liu/src/pi/` | Minimal event-stream agent loop | @@ -473,21 +473,21 @@ Turn should have unified interface, NativeTurn and ACPTurn through same abstract ## Appendix: Key Files Examined ### AgentPool -- `src/agentpool/delegation/pool.py` — AgentPool entry/exit lifecycle -- `src/agentpool/orchestrator/run.py` — RunHandle idle/wake/turn loop -- `src/agentpool/orchestrator/turn.py` — Turn ABC + HookAwareTurn mixin -- `src/agentpool/orchestrator/session_pool.py` — SessionPool -- `src/agentpool/orchestrator/session_controller.py` — SessionController -- `src/agentpool/orchestrator/event_bus.py` — EventBus -- `src/agentpool/orchestrator/event_mapper.py` — EventMapper -- `src/agentpool/agents/base_agent.py` — BaseAgent -- `src/agentpool/agents/context.py` — AgentRunContext + AgentContext -- `src/agentpool/agents/native_agent/turn.py` — NativeTurn -- `src/agentpool/agents/acp_agent/turn.py` — ACPTurn -- `src/agentpool/agents/native_agent/agent.py` — Native Agent -- `src/agentpool/agents/prompt_injection.py` — PromptInjectionManager -- `src/agentpool_server/mixins.py` — ProtocolEventConsumerMixin -- `src/agentpool/mcp_server/manager.py` — MCPManager +- `src/wolfharness/delegation/pool.py` — AgentPool entry/exit lifecycle +- `src/wolfharness/orchestrator/run.py` — RunHandle idle/wake/turn loop +- `src/wolfharness/orchestrator/turn.py` — Turn ABC + HookAwareTurn mixin +- `src/wolfharness/orchestrator/session_pool.py` — SessionPool +- `src/wolfharness/orchestrator/session_controller.py` — SessionController +- `src/wolfharness/orchestrator/event_bus.py` — EventBus +- `src/wolfharness/orchestrator/event_mapper.py` — EventMapper +- `src/wolfharness/agents/base_agent.py` — BaseAgent +- `src/wolfharness/agents/context.py` — AgentRunContext + AgentContext +- `src/wolfharness/agents/native_agent/turn.py` — NativeTurn +- `src/wolfharness/agents/acp_agent/turn.py` — ACPTurn +- `src/wolfharness/agents/native_agent/agent.py` — Native Agent +- `src/wolfharness/agents/prompt_injection.py` — PromptInjectionManager +- `src/wolfharness_server/mixins.py` — ProtocolEventConsumerMixin +- `src/wolfharness/mcp_server/manager.py` — MCPManager ### ACP Reference - `agent-client-protocol-schema/src/v1/` — ACP v1 schema diff --git a/docs/adr/message-history-api.md b/docs/adr/message-history-api.md index 9d5b13314..4e19c771d 100644 --- a/docs/adr/message-history-api.md +++ b/docs/adr/message-history-api.md @@ -45,7 +45,7 @@ This document specifies **new message history API methods to add to SessionPool* └─────────────────────────────────────────┘ ``` -**Key point**: `SessionPool` lives in `src/agentpool/orchestrator/core.py` and does not have message history methods yet. It has `self.sessions` (SessionController) and `self.sessions.store` (SessionStore for session metadata). Message history operations must be added to SessionPool as new methods. The storage layer is accessed via `AgentPool.storage`, which is a **`StorageManager`** (not `StorageProvider`). `StorageManager` is a proxy that forwards to configured `StorageProvider` instances. +**Key point**: `SessionPool` lives in `src/wolfharness/orchestrator/core.py` and does not have message history methods yet. It has `self.sessions` (SessionController) and `self.sessions.store` (SessionStore for session metadata). Message history operations must be added to SessionPool as new methods. The storage layer is accessed via `AgentPool.storage`, which is a **`StorageManager`** (not `StorageProvider`). `StorageManager` is a proxy that forwards to configured `StorageProvider` instances. ### Type Conversion @@ -199,7 +199,7 @@ The existing `StorageProvider` has methods that map to the new API: 3. Add pagination forwarding to `StorageManager.get_session_messages()` ```python -# In agentpool_storage/base.py (StorageProvider) +# In wolfharness_storage/base.py (StorageProvider) async def truncate_messages( self, session_id: str, @@ -230,7 +230,7 @@ async def get_session_messages( limit: Maximum number of messages to return (new parameter for Migration B). """ -# In agentpool/storage/manager.py (StorageManager) +# In wolfharness/storage/manager.py (StorageManager) async def get_session_messages( self, session_id: str, diff --git a/docs/adr/message_node_adapter.md b/docs/adr/message_node_adapter.md index 4fbd00eeb..416fcb199 100644 --- a/docs/adr/message_node_adapter.md +++ b/docs/adr/message_node_adapter.md @@ -255,7 +255,7 @@ class MessageNode[TDeps, TResult](ABC): from dataclasses import dataclass, field from typing import Any -from agentpool.messaging import ChatMessage +from wolfharness.messaging import ChatMessage @dataclass @@ -718,8 +718,8 @@ from pydantic_graph.graph_builder import Graph, GraphBuilder from pydantic_graph.step import Step, StepContext from typing_extensions import TypeVar -from agentpool.agents.events import RichAgentStreamEvent -from agentpool.messaging import ChatMessage, MessageNode +from wolfharness.agents.events import RichAgentStreamEvent +from wolfharness.messaging import ChatMessage, MessageNode StateT = TypeVar("StateT") DepsT = TypeVar("DepsT") diff --git a/docs/adr/permission-question-api.md b/docs/adr/permission-question-api.md index 2591df89f..1e90e4e16 100644 --- a/docs/adr/permission-question-api.md +++ b/docs/adr/permission-question-api.md @@ -27,7 +27,7 @@ In Migration B: ### Core Types ```python -# agentpool/models/pending_interaction.py +# wolfharness/models/pending_interaction.py from typing import Protocol from datetime import datetime @@ -47,7 +47,7 @@ class PendingPermission(Protocol): content: str created_at: datetime -# agentpool_server/opencode_server/models/question_permission.py +# wolfharness_server/opencode_server/models/question_permission.py from dataclasses import dataclass, field from datetime import datetime diff --git a/docs/adr/signal_streaming_adapters.md b/docs/adr/signal_streaming_adapters.md index 316821e7b..11f0c7bee 100644 --- a/docs/adr/signal_streaming_adapters.md +++ b/docs/adr/signal_streaming_adapters.md @@ -25,7 +25,7 @@ The migration to `pydantic-graph` replaces the ad-hoc node/graph execution with ### 2.1 Current Signal Definitions -In `src/agentpool/messaging/messagenode.py`: +In `src/wolfharness/messaging/messagenode.py`: ```python class MessageNode[TDeps, TResult](ABC): @@ -36,7 +36,7 @@ class MessageNode[TDeps, TResult](ABC): """Signal emitted when node creates a message.""" ``` -In `src/agentpool/talk/talk.py`: +In `src/wolfharness/talk/talk.py`: ```python class Talk[TTransmittedData = Any]: @@ -60,7 +60,7 @@ Inside `_GraphIterator.iter_graph()`, the lifecycle is: ### 2.3 Existing Event Types -From `src/agentpool/agents/events/events.py`: +From `src/wolfharness/agents/events/events.py`: ```python type RichAgentStreamEvent[OutputDataT] = ( @@ -522,7 +522,7 @@ PartDeltaEvent (LLM resumes streaming) ### 8.1 Adapter Layer Location The adapter should live in a new module, e.g.: -- `src/agentpool/delegation/graph_adapter.py` +- `src/wolfharness/delegation/graph_adapter.py` It wraps `GraphRun` without subclassing it, to avoid coupling to pydantic-graph internals. diff --git a/docs/explanation/2026-07-01-mcp-provider-lifecycle-architecture-design.md b/docs/explanation/2026-07-01-mcp-provider-lifecycle-architecture-design.md index c468954bc..623592825 100644 --- a/docs/explanation/2026-07-01-mcp-provider-lifecycle-architecture-design.md +++ b/docs/explanation/2026-07-01-mcp-provider-lifecycle-architecture-design.md @@ -4,7 +4,7 @@ **Status**: Draft **Author**: Sisyphus (via brainstorming session) **Branch**: `refactor/migrate-to-mcptoolset` -**Worktree**: `/Users/yuchen.liu/src/yilab/iroot-llm/packages/agentpool-fix-mcp` +**Worktree**: `/Users/yuchen.liu/src/yilab/iroot-llm/packages/wolfharness-fix-mcp` ## Problem Statement @@ -108,7 +108,7 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Literal if TYPE_CHECKING: - from agentpool_config.mcp_server import BaseMCPServerConfig + from wolfharness_config.mcp_server import BaseMCPServerConfig @dataclass(frozen=True) class McpConfigEntry: diff --git a/docs/explanation/2026-07-10-agent-pool-backdoor-cleanup-design.md b/docs/explanation/2026-07-10-agent-pool-backdoor-cleanup-design.md index c31523b3f..e47b329f3 100644 --- a/docs/explanation/2026-07-10-agent-pool-backdoor-cleanup-design.md +++ b/docs/explanation/2026-07-10-agent-pool-backdoor-cleanup-design.md @@ -57,8 +57,8 @@ from __future__ import annotations from typing import TYPE_CHECKING, Any, Protocol, runtime_checkable if TYPE_CHECKING: - from agentpool_toolsets.builtin.combined_toolset import CombinedToolsetCapability - from agentpool.skills.command_registry import SkillCommandRegistry + from wolfharness_toolsets.builtin.combined_toolset import CombinedToolsetCapability + from wolfharness.skills.command_registry import SkillCommandRegistry @runtime_checkable class SkillService(Protocol): @@ -253,7 +253,7 @@ Phase 2 and Phase 3 can run in **parallel** — both depend only on Phase 1. |---|---|---| | `agents/native_agent/agent.py` | 3 | `skill_capabilities` → `skill_service.capabilities`; `is_skill_visible_to_node` → `skill_service.is_visible_to_node` | | `delegation/base_team.py` | 3 | `skill_provider` → `skill_service.provider`; `get_skill_instructions_for_node` → `skill_service.get_instructions_for_node` | -| `agentpool_commands/utils.py` | 2 | `manifest.config_file_path` → `ctx.config_file_path` | +| `wolfharness_commands/utils.py` | 2 | `manifest.config_file_path` → `ctx.config_file_path` | | `shared/model_utils.py` | 1 | `agent.agent_pool` → `agent.host_context` | **Verification**: Core agent code no longer triggers `DeprecationWarning`. Unit tests pass. diff --git a/docs/explanation/architectural-patterns.md b/docs/explanation/architectural-patterns.md index 7adcdffe5..9d1820595 100644 --- a/docs/explanation/architectural-patterns.md +++ b/docs/explanation/architectural-patterns.md @@ -2,7 +2,7 @@ ## ProtocolEventConsumerMixin -`ProtocolEventConsumerMixin` (in `src/agentpool_server/mixins.py`) provides a reusable event consumer lifecycle for protocol servers. It extracts the common pattern of subscribing to the `EventBus`, running an async consumer loop, and cleaning up on shutdown. +`ProtocolEventConsumerMixin` (in `src/wolfharness_server/mixins.py`) provides a reusable event consumer lifecycle for protocol servers. It extracts the common pattern of subscribing to the `EventBus`, running an async consumer loop, and cleaning up on shutdown. **Why it exists**: Before this mixin, OpenCode and ACP each implemented their own event consumer loop independently. The code was duplicated, and ACP's implementation was missing features like `SpawnSessionStart` handling and recursive child subscription. The mixin centralizes the loop mechanics while letting each protocol define its own event conversion. diff --git a/docs/explanation/capabilities.md b/docs/explanation/capabilities.md index bce2b2bc9..876b33d25 100644 --- a/docs/explanation/capabilities.md +++ b/docs/explanation/capabilities.md @@ -1,6 +1,6 @@ # Capabilities (M3 — Replaces Resource Providers) -In M3, the old `ResourceProvider` hierarchy was replaced with native pydantic-ai `AbstractCapability` / `AbstractToolset` implementations. Each `AbstractCapability` produces tools, instructions, change notifications, and optionally implements `ResourceSource` for read-only data access. The old `src/agentpool/resource_providers/` directory (14 files, ~3860 LOC) was physically deleted after migration. +In M3, the old `ResourceProvider` hierarchy was replaced with native pydantic-ai `AbstractCapability` / `AbstractToolset` implementations. Each `AbstractCapability` produces tools, instructions, change notifications, and optionally implements `ResourceSource` for read-only data access. The old `src/wolfharness/resource_providers/` directory (14 files, ~3860 LOC) was physically deleted after migration. ## Capability Registry @@ -21,7 +21,7 @@ In M3, the old `ResourceProvider` hierarchy was replaced with native pydantic-ai - `AgentContext` (`capabilities/agent_context.py`) — Frozen dataclass carrying `agent_registry`, `delegation`, `session`, `scope`, `resources`, `host`. Constructed by RunLoop per-turn. - `DelegationService` (`capabilities/delegation.py`) — Protocol exposing `spawn_subagent(name, prompt)` and `get_available_agents()`. Limits tools to operations they need without exposing `AgentPool`. - `ChangeEvent` (`capabilities/change_event.py`) — Frozen dataclass for capability change notifications (`on_change()` stream). -- Entry-point registry (`capabilities/registry.py`) — Discovers custom capabilities via `agentpool.capabilities` entry-point group. +- Entry-point registry (`capabilities/registry.py`) — Discovers custom capabilities via `wolfharness.capabilities` entry-point group. - `ExtensionRegistry` (`capabilities/extension_registry.py`) — Unified capability registry with 4-level scope storage. See [ExtensionRegistry and Scope Hierarchy](#extensionregistry-and-scope-hierarchy) below. ## ExtensionRegistry and Scope Hierarchy @@ -76,5 +76,5 @@ The `ScopeLevel` enum has been reordered from `POOL > SESSION > AGENT > TURN` to ## Deleted Alongside ResourceProviders -- `src/agentpool/tools/factory.py` (194 LOC, 6 `ToolsetFactory` classes) — became dead code after all providers migrated. -- `src/agentpool/tools/manager.py` (364 LOC, `ToolManager`) — all `agent.tools.X` access migrated to direct capability references. +- `src/wolfharness/tools/factory.py` (194 LOC, 6 `ToolsetFactory` classes) — became dead code after all providers migrated. +- `src/wolfharness/tools/manager.py` (364 LOC, `ToolManager`) — all `agent.tools.X` access migrated to direct capability references. diff --git a/docs/explanation/common-patterns.md b/docs/explanation/common-patterns.md index b855649ac..1e4d48724 100644 --- a/docs/explanation/common-patterns.md +++ b/docs/explanation/common-patterns.md @@ -32,4 +32,4 @@ pytest && mypy src/ && ruff check src/ - Examples in `site/examples/*/config.yml` - Schema reference auto-generated from Pydantic models -- Validate with: `python -m agentpool_config.manifest config.yml` +- Validate with: `python -m wolfharness_config.manifest config.yml` diff --git a/docs/explanation/extending-agentpool.md b/docs/explanation/extending-agentpool.md index 5e4c54d1d..bd023ed46 100644 --- a/docs/explanation/extending-agentpool.md +++ b/docs/explanation/extending-agentpool.md @@ -3,23 +3,23 @@ ## Tool Implementation When adding new tools: -1. Create implementation in `agentpool/tool_impls//` -2. Define config model in `agentpool_config/` if complex -3. Register in appropriate toolset (`agentpool_toolsets/`) +1. Create implementation in `wolfharness/tool_impls//` +2. Define config model in `wolfharness_config/` if complex +3. Register in appropriate toolset (`wolfharness_toolsets/`) 4. Add tests in `tests/tool_impls/` ## Adding Agent Types New agent types require: -1. Config model in `agentpool/models/` (inherit from base, set `type` discriminator) -2. Implementation in `agentpool/agents/` +1. Config model in `wolfharness/models/` (inherit from base, set `type` discriminator) +2. Implementation in `wolfharness/agents/` 3. Add to `AnyAgentConfig` union in `manifest.py` 4. Update manifest loading in `pool.py` ## Server Implementation New protocol servers: -1. Inherit from `BaseServer` in `agentpool_server/base.py` +1. Inherit from `BaseServer` in `wolfharness_server/base.py` 2. Implement protocol-specific handlers 3. Use `AggregatingServer` if wrapping multiple agents -4. Add CLI command in `agentpool_cli/` +4. Add CLI command in `wolfharness_cli/` diff --git a/docs/explanation/hooks-events.md b/docs/explanation/hooks-events.md index c976859d9..4aaf87d86 100644 --- a/docs/explanation/hooks-events.md +++ b/docs/explanation/hooks-events.md @@ -2,11 +2,11 @@ ## Hooks -Hooks (`src/agentpool/hooks/`) intercept agent turns at 4 points: `pre_turn`, `post_turn`, `pre_tool_use`, `post_tool_use`. Three hook types: `CallableHook` (in-process), `CommandHook` (subprocess), `PromptHook` (LLM evaluation). Hooks run in parallel, results combined with priority: deny > ask > allow. +Hooks (`src/wolfharness/hooks/`) intercept agent turns at 4 points: `pre_turn`, `post_turn`, `pre_tool_use`, `post_tool_use`. Three hook types: `CallableHook` (in-process), `CommandHook` (subprocess), `PromptHook` (LLM evaluation). Hooks run in parallel, results combined with priority: deny > ask > allow. ### HookAwareTurn Architecture -Hooks fire through the `HookAwareTurn` mixin (`src/agentpool/orchestrator/turn.py`), which is inherited by both `NativeTurn` and `ACPTurn`. This provides a single choke point for hook execution inside `Turn.execute()`. +Hooks fire through the `HookAwareTurn` mixin (`src/wolfharness/orchestrator/turn.py`), which is inherited by both `NativeTurn` and `ACPTurn`. This provides a single choke point for hook execution inside `Turn.execute()`. **Firing flow:** @@ -83,8 +83,8 @@ capability = agent_hooks.as_capability(hook_manager) ## Events -**Event Types** (`src/agentpool/agents/events/events.py`): `RichAgentStreamEvent` union type covers streaming deltas, tool calls (start/progress/complete), run lifecycle (started/error/failed), subagent events, session resume, compaction, plan updates, and custom events. +**Event Types** (`src/wolfharness/agents/events/events.py`): `RichAgentStreamEvent` union type covers streaming deltas, tool calls (start/progress/complete), run lifecycle (started/error/failed), subagent events, session resume, compaction, plan updates, and custom events. -**EventBus** (`src/agentpool/orchestrator/core.py`): Cross-turn event streaming for protocol servers. Bounded async queues per session, replay buffers, scoped subscriptions (`"session"`, `"descendants"`, `"subtree"`, `"all"`). +**EventBus** (`src/wolfharness/orchestrator/core.py`): Cross-turn event streaming for protocol servers. Bounded async queues per session, replay buffers, scoped subscriptions (`"session"`, `"descendants"`, `"subtree"`, `"all"`). **Signal Architecture** (`anyenv.signals.Signal`): In-process type-safe pub/sub on `MessageNode` (`message_received`, `message_sent`) and `Talk` (`connection_processed`, `message_forwarded`). `SignalEmittingGraphRun` bridges pydantic-graph steps to signals. diff --git a/docs/explanation/import-patterns.md b/docs/explanation/import-patterns.md index 2091bd890..95f755e58 100644 --- a/docs/explanation/import-patterns.md +++ b/docs/explanation/import-patterns.md @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING if TYPE_CHECKING: - from agentpool.delegation import AgentPool + from wolfharness.delegation import AgentPool -# Config models are in agentpool_config to avoid circular deps -from agentpool_config.teams import TeamConfig +# Config models are in wolfharness_config to avoid circular deps +from wolfharness_config.teams import TeamConfig ``` diff --git a/docs/explanation/lifecycle-dimensions.md b/docs/explanation/lifecycle-dimensions.md index e541d0808..36f7dd0d3 100644 --- a/docs/explanation/lifecycle-dimensions.md +++ b/docs/explanation/lifecycle-dimensions.md @@ -72,7 +72,7 @@ When the `lifecycle:` section is omitted or all fields are at default, `create_d ## Factory Function ```python -from agentpool.lifecycle.factory import create_dimensions +from wolfharness.lifecycle.factory import create_dimensions trigger, journal, snapshot, comm, transport = create_dimensions( lifecycle_config, session_id="my_session", @@ -92,7 +92,7 @@ run_handle = RunHandle( ## Lifecycle Package Structure ``` -src/agentpool/lifecycle/ +src/wolfharness/lifecycle/ __init__.py — Public exports for all types and implementations types.py — RunState, Prompt, Feedback, ResumeResult, ToolExecutionRecord, EventEnvelope (plain dataclasses; diff --git a/docs/explanation/mcp-architecture.md b/docs/explanation/mcp-architecture.md index 151c17503..8d67835a1 100644 --- a/docs/explanation/mcp-architecture.md +++ b/docs/explanation/mcp-architecture.md @@ -2,18 +2,18 @@ ## Core Components -### MCPManager (`agentpool.mcp_server.manager`) +### MCPManager (`wolfharness.mcp_server.manager`) Manages MCP server **lifecycle** only. Spawns MCP server processes, wraps each in an `MCPResourceProvider`, and aggregates them into an `AggregatingResourceProvider`. Does NOT wire providers into ToolManager — that happens externally. Lives on `MessageNode` (every agent has one) and on `AgentPool` / `BaseTeam`. -### ToolManager (`agentpool.tools.manager`) +### ToolManager (`wolfharness.tools.manager`) Manages local tools + external resource providers. MCP tools become available when someone adds the MCPManager's aggregating provider to the ToolManager. -### ToolManagerBridge (`agentpool.mcp_server.tool_bridge`) +### ToolManagerBridge (`wolfharness.mcp_server.tool_bridge`) The inverse of MCPManager: exposes an agent's internal ToolManager as an HTTP MCP server. Used by wrapped agents (Claude Code, Codex, ACP) so the external process can call back into our tools. diff --git a/docs/explanation/module-structure.md b/docs/explanation/module-structure.md index db75f4f17..a18c12205 100644 --- a/docs/explanation/module-structure.md +++ b/docs/explanation/module-structure.md @@ -2,7 +2,7 @@ The codebase is organized into focused packages under `src/`: -## agentpool/ — Core Agent Framework +## wolfharness/ — Core Agent Framework - `agents/` - Agent implementations (native, ACP) - `capabilities/` - Native pydantic-ai capability implementations (MCPCapability, FunctionToolsetCapability, CombinedToolsetCapability, SubagentCapability, CodeModeCapability, FilteredToolsetCapability, AgentContext, DelegationService, ResourceSource, entry-point registry) @@ -20,11 +20,11 @@ The codebase is organized into focused packages under `src/`: - `hooks/` - Event hooks system - `observability/` - Logging and telemetry (Logfire) -## agentpool_config/ — Configuration Models +## wolfharness_config/ — Configuration Models Separated for clean imports. Contains YAML schema definitions for agents, teams, tools, MCP servers. -## agentpool_server/ — Protocol Servers +## wolfharness_server/ — Protocol Servers - `acp_server/` - Agent Communication Protocol server - `opencode_server/` - OpenCode TUI/Desktop server @@ -32,13 +32,13 @@ Separated for clean imports. Contains YAML schema definitions for agents, teams, - `openai_api_server/` - OpenAI-compatible API server - `mcp_server/` - Model Context Protocol server -## agentpool_toolsets/ — Reusable Toolset Implementations +## wolfharness_toolsets/ — Reusable Toolset Implementations - `builtin/` - Built-in toolsets (code, debug, subagent, file_edit, workers) - `mcp_discovery/` - MCP server discovery with semantic search - Specialized toolsets (composio, search, streaming, etc.) -## agentpool_storage/ — Storage Providers +## wolfharness_storage/ — Storage Providers - `sql_provider/` - SQLAlchemy-based storage - `zed_provider/` - Zed IDE storage integration @@ -47,9 +47,9 @@ Separated for clean imports. Contains YAML schema definitions for agents, teams, ## Other Packages -- `agentpool_cli/` - Command-line interface -- `agentpool_commands/` - Command implementations -- `agentpool_prompts/` - Prompt templates +- `wolfharness_cli/` - Command-line interface +- `wolfharness_commands/` - Command implementations +- `wolfharness_prompts/` - Prompt templates - `acp/` - Agent Communication Protocol implementation - `client/` - ACP client implementations - `agent/` - Agent-side protocol implementation diff --git a/docs/explanation/session-orchestration.md b/docs/explanation/session-orchestration.md index 276b0ce53..af4e6bfd8 100644 --- a/docs/explanation/session-orchestration.md +++ b/docs/explanation/session-orchestration.md @@ -97,7 +97,7 @@ During recovery, events since the last snapshot are replayed through the CommCha ## Session State Machine Mapping -`SessionData.status` (persisted, survives crashes) and `RunState` (transient, in-memory) are separate state machines with a formal mapping defined in `SessionStateMapper` (`src/agentpool/sessions/state_mapper.py`). +`SessionData.status` (persisted, survives crashes) and `RunState` (transient, in-memory) are separate state machines with a formal mapping defined in `SessionStateMapper` (`src/wolfharness/sessions/state_mapper.py`). | Scenario | SessionData.status | RunState | Valid? | |---|---|---|---| diff --git a/docs/explanation/skills-system.md b/docs/explanation/skills-system.md index 6c936662e..1a45a3f1d 100644 --- a/docs/explanation/skills-system.md +++ b/docs/explanation/skills-system.md @@ -11,12 +11,12 @@ Skills are defined as `SKILL.md` files following the [Agent Skills Spec](https:/ ## Key Files -- `src/agentpool/skills/skill.py` — `Skill` model: YAML frontmatter parsing, lazy instruction loading -- `src/agentpool/skills/registry.py` — `SkillsRegistry` auto-discovers SKILL.md files from configured paths -- `src/agentpool/skills/manager.py` — `SkillsManager` pool-level lifecycle -- `src/agentpool/skills/uri_resolver.py` — `skill://` URI scheme resolver -- `src/agentpool/skills/command.py` — `SkillCommand` wraps skills as protocol-agnostic slash commands -- `src/agentpool/skills/instruction_provider.py` — `SkillsInstructionProvider` injects skills as XML into prompts (metadata/full modes) — migrated from `resource_providers/` +- `src/wolfharness/skills/skill.py` — `Skill` model: YAML frontmatter parsing, lazy instruction loading +- `src/wolfharness/skills/registry.py` — `SkillsRegistry` auto-discovers SKILL.md files from configured paths +- `src/wolfharness/skills/manager.py` — `SkillsManager` pool-level lifecycle +- `src/wolfharness/skills/uri_resolver.py` — `skill://` URI scheme resolver +- `src/wolfharness/skills/command.py` — `SkillCommand` wraps skills as protocol-agnostic slash commands +- `src/wolfharness/skills/instruction_provider.py` — `SkillsInstructionProvider` injects skills as XML into prompts (metadata/full modes) — migrated from `resource_providers/` ## Injection Modes diff --git a/docs/explanation/special-considerations.md b/docs/explanation/special-considerations.md index e75972433..adff3efbc 100644 --- a/docs/explanation/special-considerations.md +++ b/docs/explanation/special-considerations.md @@ -26,6 +26,6 @@ Fallback models: `type: fallback, models: [primary, backup]` ## Entry Points The project uses entry points for extensibility: -- `agentpool_toolsets` - Register custom toolsets +- `wolfharness_toolsets` - Register custom toolsets - `fsspec.specs` - Filesystem implementations (ACP) - `universal_pathlib.implementations` - Path implementations diff --git a/docs/explanation/storage-observability.md b/docs/explanation/storage-observability.md index e6e9eeb5f..0c2ea8bcf 100644 --- a/docs/explanation/storage-observability.md +++ b/docs/explanation/storage-observability.md @@ -5,7 +5,7 @@ Track all agent interactions: - SQL-based with SQLModel/SQLAlchemy - Per-agent or shared database -- Analytics via CLI: `agentpool history stats` +- Analytics via CLI: `wolfharness history stats` ## Observability diff --git a/docs/explanation/tool-display-capability.md b/docs/explanation/tool-display-capability.md index 6781e4d10..4992c233d 100644 --- a/docs/explanation/tool-display-capability.md +++ b/docs/explanation/tool-display-capability.md @@ -1,8 +1,8 @@ # ToolDisplayCapability -`ToolDisplayCapability` 是 agentpool 的**全局装饰器能力** (Global Decorator Capability):在不修改任何子能力源码的前提下,对 agent 已装配的全部工具统一起作用 —— **改名** (`rename_mode`) 与 **注入 diff 富信息事件** (`emit_diff`)。它解决的核心问题是:第三方 capability(如 viking)的工具名不在协议客户端(OpenCode TUI / Zed)的渲染白名单内、工具返回不含 diff 富信息,导致客户端无法渲染文件变更的 diff 视图。 +`ToolDisplayCapability` 是 wolfharness 的**全局装饰器能力** (Global Decorator Capability):在不修改任何子能力源码的前提下,对 agent 已装配的全部工具统一起作用 —— **改名** (`rename_mode`) 与 **注入 diff 富信息事件** (`emit_diff`)。它解决的核心问题是:第三方 capability(如 viking)的工具名不在协议客户端(OpenCode TUI / Zed)的渲染白名单内、工具返回不含 diff 富信息,导致客户端无法渲染文件变更的 diff 视图。 -模式对齐 `ToolInterceptCapability`(`src/agentpool/agents/native_agent/tool_intercept.py`):独立 `AbstractCapability` 直接覆写 `get_wrapper_toolset()` 与 `wrap_tool_execute()`,作为全局中间件横切 agent 的全部工具 —— 不组合子能力、无 `capabilities` 字段。 +模式对齐 `ToolInterceptCapability`(`src/wolfharness/agents/native_agent/tool_intercept.py`):独立 `AbstractCapability` 直接覆写 `get_wrapper_toolset()` 与 `wrap_tool_execute()`,作为全局中间件横切 agent 的全部工具 —— 不组合子能力、无 `capabilities` 字段。 ## 五个正交开关 @@ -49,8 +49,8 @@ wrap_tool_execute → ctx.deps.events.tool_call_progress(title, items=[DiffConte → 客户端(Zed/OpenCode TUI)渲染 diff ``` -- `ctx.deps` 在 agentpool 中**直接是 `AgentContext`**,携带 `.events` → `StreamEventEmitter`(POC 已验证,同 fsspec 工具集 `agentpool_toolsets/fsspec_toolset/toolset.py:575` 的先例通道) -- `DiffContentItem(path, old_text, new_text)` 定义于 `src/agentpool/agents/events/events.py:203` +- `ctx.deps` 在 wolfharness 中**直接是 `AgentContext`**,携带 `.events` → `StreamEventEmitter`(POC 已验证,同 fsspec 工具集 `wolfharness_toolsets/fsspec_toolset/toolset.py:575` 的先例通道) +- `DiffContentItem(path, old_text, new_text)` 定义于 `src/wolfharness/agents/events/events.py:203` - **不依赖 metadata 通道**:`ToolReturn.metadata` 在 `process_tool_event`/`event_mapper` 构造 `ToolCallCompleteEvent` 时会被丢弃(仅 `is_error`),本能力刻意绕开该断点,改用事件注入 ## 协议区分配置 @@ -84,7 +84,7 @@ capabilities: emit_rich_for: [viking_read, viking_search, viking_find, viking_glob] ``` -- 注册:entry-point 组 `agentpool.capabilities`,key `tool_display` → `agentpool.capabilities.tool_display_capability:ToolDisplayCapability`(见 `pyproject.toml`),由 `registry.py` 发现 +- 注册:entry-point 组 `wolfharness.capabilities`,key `tool_display` → `wolfharness.capabilities.tool_display_capability:ToolDisplayCapability`(见 `pyproject.toml`),由 `registry.py` 发现 - 构造:`EntryPointCapabilityConfig(type=..., args={...}).build()` 以 `cls(**args)` 实例化 —— dataclass 字段(`rename_mode`/`name_map`/`emit_diff`/`emit_diff_for`/`emit_rich`/`emit_rich_for`)+ `id` 天然兼容 YAML 装配;`emit_rich_for` 传入的 YAML 列表在 `__post_init__` 转为 `set` ## 已知约束 diff --git a/docs/explanation/usage-examples.md b/docs/explanation/usage-examples.md index de9a4fd76..300f299b1 100644 --- a/docs/explanation/usage-examples.md +++ b/docs/explanation/usage-examples.md @@ -5,7 +5,7 @@ ### Native Agent ```python -from agentpool.agents import Agent +from wolfharness.agents import Agent def greet(name: str) -> str: """Greet someone.""" @@ -24,7 +24,7 @@ async with Agent( ### ACP Agent ```python -from agentpool.agents.acp_agent import ACPAgent +from wolfharness.agents.acp_agent import ACPAgent async with ACPAgent( command="goose", # Required: executable name @@ -56,8 +56,8 @@ agents: ### Python Code ```python -from agentpool.delegation import AgentPool -from agentpool.agents.events import ( +from wolfharness.delegation import AgentPool +from wolfharness.agents.events import ( PartDeltaEvent, ToolCallStartEvent, ToolCallCompleteEvent, diff --git a/docs/explanation/user_interaction.md b/docs/explanation/user_interaction.md index 190932332..ad854361c 100644 --- a/docs/explanation/user_interaction.md +++ b/docs/explanation/user_interaction.md @@ -34,27 +34,27 @@ AgentPool uses **InputProvider** to handle user interactions across different ex ## Providers ### StdlibInputProvider -**Location**: `agentpool/ui/stdlib_provider.py` +**Location**: `wolfharness/ui/stdlib_provider.py` **Usage**: CLI, fallback **Mechanism**: Blocking `input()` calls **Limitations**: No async, no rich UI, no multi-select ### ACPInputProvider -**Location**: `agentpool_server/acp_server/input_provider.py` +**Location**: `wolfharness_server/acp_server/input_provider.py` **Usage**: ACP clients (Goose, Codex) **Mechanism**: Maps elicitation → `request_permission()` **[HACK]** **Why hacky**: ACP lacks native elicitation, shoehorns questions into permission system **Limitations**: Max 4 options, no multi-select, wrong semantics ### OpenCodeInputProvider -**Location**: `agentpool_server/opencode_server/input_provider.py` +**Location**: `wolfharness_server/opencode_server/input_provider.py` **Usage**: OpenCode TUI/Desktop **Mechanism**: SSE events + HTTP response endpoints **Flow**: Create question → broadcast event → await HTTP reply → resolve future **Advantages**: Native questions, multi-select, unlimited options, rich descriptions ### MockInputProvider -**Location**: `agentpool/ui/mock_provider.py` +**Location**: `wolfharness/ui/mock_provider.py` **Usage**: Tests **Mechanism**: Pre-programmed responses diff --git a/docs/how-to/advanced/acp-integration.md b/docs/how-to/advanced/acp-integration.md index 6bb36afe5..82d0cf981 100644 --- a/docs/how-to/advanced/acp-integration.md +++ b/docs/how-to/advanced/acp-integration.md @@ -33,7 +33,7 @@ The key difference is that ACP agents run as **separate processes** communicatin Using uvx for one-off usage: ```bash -uvx --python 3.13 agentpool@latest serve-acp --help +uvx --python 3.13 wolfharness@latest serve-acp --help ``` ## CLI Usage @@ -43,7 +43,7 @@ uvx --python 3.13 agentpool@latest serve-acp --help Start an ACP server from a configuration file: ```bash -agentpool serve-acp agents.yml +wolfharness serve-acp agents.yml ``` ### Available Options @@ -65,9 +65,9 @@ Add this configuration to your Zed `settings.json`: "args": [ "--python", "3.13", - "agentpool[coding]@latest", + "wolfharness[coding]@latest", "serve-acp", - "https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/docs/examples/create_docs/config.yml" + "https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/docs/examples/create_docs/config.yml" ], "env": { "OPENAI_API_KEY": "your-api-key-here" @@ -88,7 +88,7 @@ This configuration: For IDEs that support ACP, the general pattern is: -1. Set the command to `agentpool` (or `uvx agentpool@latest`) +1. Set the command to `wolfharness` (or `uvx wolfharness@latest`) 2. Add `serve-acp` as the first argument 3. Specify your configuration file path 4. Add any desired CLI options @@ -102,11 +102,11 @@ Understanding AgentPool's ACP integration requires grasping a key architectural #### As an ACP Server (IDE Integration) -When you run `agentpool serve-acp`, it becomes an **ACP server** that IDEs can connect to: +When you run `wolfharness serve-acp`, it becomes an **ACP server** that IDEs can connect to: ```mermaid graph LR - A["IDE (Zed)
ACP Client"] <-->|ACP Protocol| B["agentpool
ACP Server
(serve-acp command)"] + A["IDE (Zed)
ACP Client"] <-->|ACP Protocol| B["wolfharness
ACP Server
(serve-acp command)"] ``` In this mode, AgentPool: @@ -123,7 +123,7 @@ At the same time, AgentPool can act as an **ACP client** to integrate external A ```mermaid graph LR - A["agentpool
ACP Client
(external agent)"] <-->|ACP Protocol| B["Claude Code
ACP Server
(subprocess)"] + A["wolfharness
ACP Client
(external agent)"] <-->|ACP Protocol| B["Claude Code
ACP Server
(subprocess)"] ``` In this mode, AgentPool: @@ -141,7 +141,7 @@ The real power comes when **both roles work together**: ```mermaid graph TB IDE["IDE (Zed)
ACP Client"] - LLM["agentpool
Server ↔ Pool ↔ Client"] + LLM["wolfharness
Server ↔ Pool ↔ Client"] Claude["Claude Code
ACP Server"] Pool["Agent Pool
• Internal Agents
• Teams
• Resources
• Tools"] @@ -282,7 +282,7 @@ These agents use ACP protocol but don't support MCP toolset bridging: Once configured, external ACP agents are automatically available in the agent pool: ```python -from agentpool.delegation import AgentPool +from wolfharness.delegation import AgentPool async def main(): async with AgentPool("agents.yml") as pool: @@ -472,7 +472,7 @@ Permissions are enforced at multiple levels: ### Overview -For MCP-capable ACP agents (Claude, Gemini, Auggie, Kimi), agentpool can automatically expose internal toolsets via an in-process MCP server bridge. This allows external agents to use powerful internal capabilities like subagent delegation, agent management, and custom tools. +For MCP-capable ACP agents (Claude, Gemini, Auggie, Kimi), wolfharness can automatically expose internal toolsets via an in-process MCP server bridge. This allows external agents to use powerful internal capabilities like subagent delegation, agent management, and custom tools. ### How It Works @@ -644,7 +644,7 @@ Best practices: You can reference remote configuration files directly: ```bash -agentpool serve-acp https://example.com/config.yml +wolfharness serve-acp https://example.com/config.yml ``` ### Model Provider Selection diff --git a/docs/how-to/advanced/agui-integration.md b/docs/how-to/advanced/agui-integration.md index f3b9fb9ea..d96c529e6 100644 --- a/docs/how-to/advanced/agui-integration.md +++ b/docs/how-to/advanced/agui-integration.md @@ -19,25 +19,25 @@ Unlike ACP (which uses stdio/JSON-RPC for IDE integration), AG-UI is designed fo ## AG-UI Agents: The Client Side -In agentpool, `AGUIAgent` acts as a **client** that connects **to** remote AG-UI servers. This allows you to: +In wolfharness, `AGUIAgent` acts as a **client** that connects **to** remote AG-UI servers. This allows you to: - Integrate external AG-UI agents into your agent pool -- Compose remote agents with native agentpools via connections and teams +- Compose remote agents with native wolfharnesss via connections and teams - Execute tools locally while letting remote agents decide when to use them - Maintain unified messaging and event systems !!! note "Client vs Server" - Currently, agentpool provides the **client side** (consuming AG-UI agents). - Server-side support (exposing agentpools as AG-UI endpoints) is planned for future releases. + Currently, wolfharness provides the **client side** (consuming AG-UI agents). + Server-side support (exposing wolfharnesss as AG-UI endpoints) is planned for future releases. ## Installation -No additional installation required - AG-UI support is included in agentpool: +No additional installation required - AG-UI support is included in wolfharness: ```bash -pip install agentpool +pip install wolfharness # or -uv add agentpool +uv add wolfharness ``` The `ag-ui` Python package is a dependency and provides the protocol types. @@ -47,7 +47,7 @@ The `ag-ui` Python package is a dependency and provides the protocol types. ### Connecting to an AG-UI Agent ```python -from agentpool.agents import AGUIAgent +from wolfharness.agents import AGUIAgent async def main(): # Connect to a remote AG-UI agent @@ -90,7 +90,7 @@ agents: Load and use: ```python -from agentpool import AgentPool +from wolfharness import AgentPool async def main(): async with AgentPool("agents.yml") as pool: @@ -272,7 +272,7 @@ agents: AG-UI agents emit the same events as native agents: ```python -from agentpool.agents.events import ToolCallStartEvent +from wolfharness.agents.events import ToolCallStartEvent async def tool_call_handler(ctx, event): if isinstance(event, ToolCallStartEvent): @@ -322,7 +322,7 @@ async with AGUIAgent( ## Future: AG-UI Server Support -Future versions will support exposing agentpools **as** AG-UI servers: +Future versions will support exposing wolfharnesss **as** AG-UI servers: ```yaml title="Future feature" agui_server: @@ -335,7 +335,7 @@ agui_server: This will enable: -- Frontends directly connecting to agentpools +- Frontends directly connecting to wolfharnesss - Web UI integration - Bidirectional AG-UI workflows diff --git a/docs/how-to/advanced/agui_example.yml b/docs/how-to/advanced/agui_example.yml index 7db8dc7ac..646f6adf7 100644 --- a/docs/how-to/advanced/agui_example.yml +++ b/docs/how-to/advanced/agui_example.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json # AG-UI Integration Example Configuration # This file demonstrates various AG-UI agent configurations diff --git a/docs/how-to/advanced/async.md b/docs/how-to/advanced/async.md index 75a832497..a67183ea9 100644 --- a/docs/how-to/advanced/async.md +++ b/docs/how-to/advanced/async.md @@ -110,7 +110,7 @@ await agent.stop() AgentPool supports event-driven agent operation through file watchers and other triggers. The simplest way to start event-based mode is through the CLI: ```bash -agentpool watch --config agents.yml +wolfharness watch --config agents.yml ``` This command: diff --git a/docs/how-to/advanced/db.md b/docs/how-to/advanced/db.md index 51fca76dc..0d3f6ba87 100644 --- a/docs/how-to/advanced/db.md +++ b/docs/how-to/advanced/db.md @@ -29,9 +29,9 @@ The SQLite database is stored using platformdirs: ```python # Default location: -# Linux: ~/.local/share/agentpool/history.db -# Windows: %LOCALAPPDATA%\agentpool\history.db -# macOS: ~/Library/Application Support/agentpool/history.db +# Linux: ~/.local/share/wolfharness/history.db +# Windows: %LOCALAPPDATA%\wolfharness\history.db +# macOS: ~/Library/Application Support/wolfharness/history.db ``` ## Memory Configuration @@ -45,7 +45,7 @@ Agents can be configured with sophisticated memory management: Or via code: ```python -from agentpool_config.session import MemoryConfig, SessionQuery +from wolfharness_config.session import MemoryConfig, SessionQuery # Configure memory management memory_cfg = MemoryConfig( diff --git a/docs/how-to/advanced/db_example.yml b/docs/how-to/advanced/db_example.yml index 21504f07f..15f705a69 100644 --- a/docs/how-to/advanced/db_example.yml +++ b/docs/how-to/advanced/db_example.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json agents: assistant: model: openai:gpt-5-mini diff --git a/docs/how-to/advanced/models_example.yml b/docs/how-to/advanced/models_example.yml index 10c0ac35f..e5dd76cab 100644 --- a/docs/how-to/advanced/models_example.yml +++ b/docs/how-to/advanced/models_example.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json agents: tuned_agent: model: diff --git a/docs/how-to/advanced/system-prompts.md b/docs/how-to/advanced/system-prompts.md index 3edadfe19..40bdc933b 100644 --- a/docs/how-to/advanced/system-prompts.md +++ b/docs/how-to/advanced/system-prompts.md @@ -159,9 +159,9 @@ agents: Provider implementation: ```python -from agentpool.resource_providers import ResourceProvider -from agentpool.prompts.instructions import InstructionFunc -from agentpool.agents.context import AgentContext +from wolfharness.resource_providers import ResourceProvider +from wolfharness.prompts.instructions import InstructionFunc +from wolfharness.agents.context import AgentContext class UserContextProvider(ResourceProvider): async def get_instructions(self) -> list[InstructionFunc]: @@ -255,7 +255,7 @@ If an instruction function fails, the error is logged and the instruction is ski System prompts can include callables that are evaluated when the agent context starts: ```python -from agentpool import Agent +from wolfharness import Agent async def get_weather_context(): weather = await fetch_weather() @@ -418,7 +418,7 @@ The template has access to: - `inject_tools` - tool injection mode (`"off"` or `"all"`) - `tool_usage_style` - tool usage style (`"suggestive"` or `"strict"`) -See `src/agentpool/agents/sys_prompts.py` for implementation details. +See `src/wolfharness/agents/sys_prompts.py` for implementation details. !!! info "About Prompt Engineering" By default, AgentPool does not engage in prompt engineering or manipulation. The features described diff --git a/docs/how-to/configuration/builtin-tools.md b/docs/how-to/configuration/builtin-tools.md index 7fe4eae9f..a02fa9747 100644 --- a/docs/how-to/configuration/builtin-tools.md +++ b/docs/how-to/configuration/builtin-tools.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/builtin_tools.py + - src/wolfharness_config/builtin_tools.py title: Built-in Tools description: PydanticAI built-in tool configuration icon: material/wrench @@ -26,5 +26,5 @@ These tools integrate seamlessly with the agent's capability system and can be c ## Configuration Reference /// mknodes -{{ "agentpool_config.builtin_tools.BuiltinToolConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.builtin_tools.BuiltinToolConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// diff --git a/docs/how-to/configuration/commands.md b/docs/how-to/configuration/commands.md index 5429def52..2972a00bf 100644 --- a/docs/how-to/configuration/commands.md +++ b/docs/how-to/configuration/commands.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/commands.py + - src/wolfharness_config/commands.py title: Commands description: Slash command configuration icon: material/slash-forward-box @@ -23,7 +23,7 @@ Commands are invoked with `/command-name` syntax and support parameter substitut ## Configuration Reference /// mknodes -{{ "agentpool_config.commands.CommandConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.commands.CommandConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ## Usage Notes diff --git a/docs/how-to/configuration/conditions.md b/docs/how-to/configuration/conditions.md index 60632b84a..d22813f38 100644 --- a/docs/how-to/configuration/conditions.md +++ b/docs/how-to/configuration/conditions.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/conditions.py + - src/wolfharness_config/conditions.py title: Conditions description: Conditional logic for message flow and lifecycle control icon: material/filter-variant @@ -32,7 +32,7 @@ AgentPool supports various condition types: ## Configuration Reference /// mknodes -{{ "agentpool_config.conditions.Condition" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.conditions.Condition" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ## Control Levels diff --git a/docs/how-to/configuration/connections.md b/docs/how-to/configuration/connections.md index f2d651026..d4ba9cbf7 100644 --- a/docs/how-to/configuration/connections.md +++ b/docs/how-to/configuration/connections.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/forward_targets.py + - src/wolfharness_config/forward_targets.py title: Connections description: Message routing and forwarding configuration icon: material/transit-connection @@ -29,7 +29,7 @@ AgentPool supports three connection types: ## Configuration Reference /// mknodes -{{ "agentpool_config.forward_targets.ForwardingTarget" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.forward_targets.ForwardingTarget" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ## Connection Types diff --git a/docs/how-to/configuration/event-sources.md b/docs/how-to/configuration/event-sources.md index 01acdc3b2..d54e1ff2d 100644 --- a/docs/how-to/configuration/event-sources.md +++ b/docs/how-to/configuration/event-sources.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/events.py + - src/wolfharness_config/events.py title: Event Sources description: Event source configuration for triggering agent actions icon: material/bell-ring @@ -27,7 +27,7 @@ Event sources are typically used with task configurations to create event-driven ### Event Sources /// mknodes -{{ "agentpool_config.events.EventConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.events.EventConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ### Connection Event Conditions @@ -35,7 +35,7 @@ Event sources are typically used with task configurations to create event-driven Connection events can be filtered using conditions: /// mknodes -{{ "agentpool_config.events.ConnectionEventConditionType" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.events.ConnectionEventConditionType" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ## Usage with Tasks diff --git a/docs/how-to/configuration/events.md b/docs/how-to/configuration/events.md index 2479923ac..448656ce9 100644 --- a/docs/how-to/configuration/events.md +++ b/docs/how-to/configuration/events.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/event_handlers.py + - src/wolfharness_config/event_handlers.py title: Event Handlers description: Event handler setup and configuration icon: material/bell @@ -11,5 +11,5 @@ icon: material/bell Event handlers allow you to respond to various agent events such as messages, tool calls, and state changes. /// mknodes -{{ "agentpool_config.event_handlers.EventHandlerConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.event_handlers.EventHandlerConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// diff --git a/docs/how-to/configuration/hooks.md b/docs/how-to/configuration/hooks.md index 50db2af08..06ff4db6d 100644 --- a/docs/how-to/configuration/hooks.md +++ b/docs/how-to/configuration/hooks.md @@ -18,13 +18,13 @@ Hooks allow you to intercept and customize agent behavior at key lifecycle point ## Configuration Reference /// mknodes -{{ "agentpool_config.hooks.HooksConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.hooks.HooksConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ## Hook Types /// mknodes -{{ "agentpool_config.hooks.HookConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.hooks.HookConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ## Command Hook @@ -178,8 +178,8 @@ agents: ## Programmatic Usage ```python -from agentpool import Agent -from agentpool.hooks import AgentHooks, CallableHook +from wolfharness import Agent +from wolfharness.hooks import AgentHooks, CallableHook def my_pre_tool_hook(tool_name: str, tool_input: dict, **kwargs): if tool_name == "Bash" and "rm" in tool_input.get("command", ""): diff --git a/docs/how-to/configuration/index.md b/docs/how-to/configuration/index.md index 22b6e06f4..3e3d6538c 100644 --- a/docs/how-to/configuration/index.md +++ b/docs/how-to/configuration/index.md @@ -14,7 +14,7 @@ and IDE support for YAML linters by providing an extensive, detailed schema. Here's the complete manifest structure with all available top-level sections: /// mknodes -{{ "agentpool.AgentsManifest" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", as_listitem=False) }} +{{ "wolfharness.AgentsManifest" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", as_listitem=False) }} /// ## Top-Level Sections @@ -97,10 +97,10 @@ Configs are loaded and merged in this order (later sources override earlier ones | Priority | Source | Location | Description | |----------|--------|----------|-------------| -| 1 | Global | `~/.config/agentpool/agentpool.yml` | User-wide preferences | +| 1 | Global | `~/.config/wolfharness/wolfharness.yml` | User-wide preferences | | 2 | Custom | `AGENTPOOL_CONFIG` env var | CI/deployment overrides | | 3 | Inline | `AGENTPOOL_CONFIG_CONTENT` env var | Runtime config as YAML/JSON string | -| 4 | Project | `agentpool.yml` in project root | Project-specific settings | +| 4 | Project | `wolfharness.yml` in project root | Project-specific settings | | 5 | Explicit | CLI argument | Highest precedence | | fallback | Built-in | Package defaults | Only if no agents defined elsewhere | @@ -114,7 +114,7 @@ Configs are loaded and merged in this order (later sources override earlier ones ### Project Config Discovery -Project config is discovered by searching for `agentpool.yml` (or `.yaml`, `.json`, `.jsonc`) starting from the current directory and traversing up to the nearest git repository root. +Project config is discovered by searching for `wolfharness.yml` (or `.yaml`, `.json`, `.jsonc`) starting from the current directory and traversing up to the nearest git repository root. ### Fallback Behavior @@ -127,7 +127,7 @@ The built-in fallback config (e.g., `acp_assistant.yml`) is **only loaded if no === "Global config" - ```yaml title="~/.config/agentpool/agentpool.yml" + ```yaml title="~/.config/wolfharness/wolfharness.yml" # User preferences applied everywhere model_variants: fast: @@ -139,12 +139,12 @@ The built-in fallback config (e.g., `acp_assistant.yml`) is **only loaded if no storage: provider: sql - database_url: sqlite:///~/.local/share/agentpool/history.db + database_url: sqlite:///~/.local/share/wolfharness/history.db ``` === "Project config" - ```yaml title="./agentpool.yml" + ```yaml title="./wolfharness.yml" # Project-specific agents (inherits global model_variants and storage) agents: coder: @@ -184,14 +184,14 @@ Use these commands to inspect config resolution: ```bash # Show which configs are found and loaded -agentpool config show +wolfharness config show # Show standard config paths -agentpool config paths +wolfharness config paths # Create a starter config file -agentpool config init # In current project -agentpool config init global # In global config dir +wolfharness config init # In current project +wolfharness config init global # In global config dir ``` ## File-Level Inheritance (INHERIT) @@ -226,7 +226,7 @@ AgentPool supports UPaths (universal-pathlib) for `INHERIT`, allowing pointing t You can get IDE linter support by adding this line at the top of your YAML: ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json ``` !!! note @@ -237,7 +237,7 @@ You can get IDE linter support by adding this line at the top of your YAML: Load a manifest in your code: ```python -from agentpool import AgentPool +from wolfharness import AgentPool async with AgentPool("agents.yml") as pool: agent = pool.get_agent("analyzer") diff --git a/docs/how-to/configuration/knowledge.md b/docs/how-to/configuration/knowledge.md index 4813cc44b..1a88d3ea9 100644 --- a/docs/how-to/configuration/knowledge.md +++ b/docs/how-to/configuration/knowledge.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/knowledge.py + - src/wolfharness_config/knowledge.py title: Knowledge Sources description: Knowledge source configuration and management icon: material/book-open-variant diff --git a/docs/how-to/configuration/mcp.md b/docs/how-to/configuration/mcp.md index 03386a2f6..6dec3aecd 100644 --- a/docs/how-to/configuration/mcp.md +++ b/docs/how-to/configuration/mcp.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/mcp_server.py + - src/wolfharness_config/mcp_server.py title: MCP Servers description: MCP server configuration and integration icon: material/server-network @@ -31,7 +31,7 @@ Servers can use simple string syntax (e.g., `"python -m mcp_server"`) or detaile ## Configuration Reference /// mknodes -{{ "agentpool_config.mcp_server.MCPServerConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.mcp_server.MCPServerConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ## Configuration Notes diff --git a/docs/how-to/configuration/node-types/acp-agents.md b/docs/how-to/configuration/node-types/acp-agents.md index 977090464..73cec2c24 100644 --- a/docs/how-to/configuration/node-types/acp-agents.md +++ b/docs/how-to/configuration/node-types/acp-agents.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool/models/acp_agents.py + - src/wolfharness/models/acp_agents.py title: ACP Agents description: External ACP agent integration icon: material/link-variant @@ -34,7 +34,7 @@ These agents can be configured to work alongside AgentPool agents, enabling hybr ## Configuration Reference /// mknodes -{{ "agentpool.models.acp_agents.ACPAgentConfigTypes" | union_to_markdown(display_mode="yaml", header_style="pymdownx", as_listitem=False, wrapped_in="agentname") }} +{{ "wolfharness.models.acp_agents.ACPAgentConfigTypes" | union_to_markdown(display_mode="yaml", header_style="pymdownx", as_listitem=False, wrapped_in="agentname") }} /// ## Configuration Notes diff --git a/docs/how-to/configuration/node-types/agent.md b/docs/how-to/configuration/node-types/agent.md index 267d2439b..2acbeeca2 100644 --- a/docs/how-to/configuration/node-types/agent.md +++ b/docs/how-to/configuration/node-types/agent.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/nodes.py + - src/wolfharness_config/nodes.py title: Agent description: Agent configuration options icon: material/robot @@ -27,7 +27,7 @@ Agent configuration includes: ## Configuration Reference /// mknodes -{{ "agentpool.models.agents.NativeAgentConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", as_listitem=False) }} +{{ "wolfharness.models.agents.NativeAgentConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", as_listitem=False) }} /// ## Configuration Inheritance diff --git a/docs/how-to/configuration/node-types/agui-agents.md b/docs/how-to/configuration/node-types/agui-agents.md index cde93cfda..3ffdbfa32 100644 --- a/docs/how-to/configuration/node-types/agui-agents.md +++ b/docs/how-to/configuration/node-types/agui-agents.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool/models/agui_agents.py + - src/wolfharness/models/agui_agents.py title: AG-UI Agents description: AG-UI protocol agent integration icon: material/monitor diff --git a/docs/how-to/configuration/node-types/claude-code-agents.md b/docs/how-to/configuration/node-types/claude-code-agents.md index ef9249e71..a9fd6771f 100644 --- a/docs/how-to/configuration/node-types/claude-code-agents.md +++ b/docs/how-to/configuration/node-types/claude-code-agents.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool/models/claude_code_agents.py + - src/wolfharness/models/claude_code_agents.py title: Claude Code Agents description: Native Claude Agent SDK integration icon: material/robot-outline diff --git a/docs/how-to/configuration/node-types/codex-agents.md b/docs/how-to/configuration/node-types/codex-agents.md index 074ffae51..fedeec06a 100644 --- a/docs/how-to/configuration/node-types/codex-agents.md +++ b/docs/how-to/configuration/node-types/codex-agents.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool/models/codex_agents.py + - src/wolfharness/models/codex_agents.py title: Codex Agents description: Codex app-server integration icon: material/code-braces @@ -147,7 +147,7 @@ agents: Then use structured output programmatically: ```python -from agentpool import AgentPool +from wolfharness import AgentPool from pydantic import BaseModel class BugReport(BaseModel): @@ -199,7 +199,7 @@ Codex supports three reasoning effort levels that can be changed at runtime: Example runtime mode switching: ```python -from agentpool import AgentPool +from wolfharness import AgentPool async with AgentPool("config.yml") as pool: agent = pool.get_agents()["my_codex"] @@ -233,7 +233,7 @@ await agent.set_mode("always", category_id="approval_policy") Codex provides access to various models. The agent can dynamically fetch available models: ```python -from agentpool import AgentPool +from wolfharness import AgentPool async with AgentPool("config.yml") as pool: agent = pool.get_agents()["my_codex"] diff --git a/docs/how-to/configuration/node-types/team.md b/docs/how-to/configuration/node-types/team.md index 620159174..015e072ec 100644 --- a/docs/how-to/configuration/node-types/team.md +++ b/docs/how-to/configuration/node-types/team.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/teams.py + - src/wolfharness_config/teams.py title: Teams description: Team configuration and setup icon: material/account-group diff --git a/docs/how-to/configuration/observability.md b/docs/how-to/configuration/observability.md index b00e55d99..1e47bca5e 100644 --- a/docs/how-to/configuration/observability.md +++ b/docs/how-to/configuration/observability.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/observability.py + - src/wolfharness_config/observability.py title: Observability description: Monitoring and tracing configuration icon: material/chart-line @@ -25,7 +25,7 @@ These integrations provide automatic instrumentation of agent operations, captur ## Configuration Reference /// mknodes -{{ "agentpool_config.observability.ObservabilityProviderConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.observability.ObservabilityProviderConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ## Key Features diff --git a/docs/how-to/configuration/path-resolution.md b/docs/how-to/configuration/path-resolution.md index 8aa3a8a9d..278483a59 100644 --- a/docs/how-to/configuration/path-resolution.md +++ b/docs/how-to/configuration/path-resolution.md @@ -2,8 +2,8 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/paths.py - - src/agentpool_config/context.py + - src/wolfharness_config/paths.py + - src/wolfharness_config/context.py title: Configuration Path Resolution description: How relative paths are resolved in configuration files icon: material/map-marker-path @@ -49,7 +49,7 @@ skills: ```bash # Force all paths to resolve to a specific directory export AGENTPOOL_CONFIG_DIR=/custom/path -agentpool serve-acp agents.yml +wolfharness serve-acp agents.yml ``` ### Legacy Mode @@ -57,7 +57,7 @@ agentpool serve-acp agents.yml ```bash # Revert to CWD-relative resolution (pre-RFC-0009 behavior) export AGENTPOOL_LEGACY_PATHS=1 -agentpool serve-acp agents.yml +wolfharness serve-acp agents.yml ``` ## Implementation Details @@ -73,14 +73,14 @@ agentpool serve-acp agents.yml Paths resolved relative to CWD: ```bash cd /home/user/project -agentpool serve-acp agents.yml # ./skills relative to CWD +wolfharness serve-acp agents.yml # ./skills relative to CWD ``` **After (vX.Z):** Paths resolve relative to config file: ```bash cd /home/user/anywhere -agentpool serve-acp /home/user/project/agents.yml # ./skills relative to config dir +wolfharness serve-acp /home/user/project/agents.yml # ./skills relative to config dir ``` To maintain old behavior, set `AGENTPOOL_LEGACY_PATHS=1`. diff --git a/docs/how-to/configuration/prompt-hubs.md b/docs/how-to/configuration/prompt-hubs.md index 7f68110fe..7ed9f3280 100644 --- a/docs/how-to/configuration/prompt-hubs.md +++ b/docs/how-to/configuration/prompt-hubs.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/prompt_hubs.py + - src/wolfharness_config/prompt_hubs.py title: Prompt Hubs description: External prompt hub integration icon: material/library @@ -24,7 +24,7 @@ These integrations allow you to fetch prompts from these services by identifiers ## Configuration Reference /// mknodes -{{ "agentpool_config.prompt_hubs.PromptHubConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.prompt_hubs.PromptHubConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ## Configuration Notes diff --git a/docs/how-to/configuration/prompts.md b/docs/how-to/configuration/prompts.md index 05442893c..11cb20a0b 100644 --- a/docs/how-to/configuration/prompts.md +++ b/docs/how-to/configuration/prompts.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/system_prompts.py + - src/wolfharness_config/system_prompts.py title: System Prompts description: System prompt configuration and library icon: material/format-text @@ -37,7 +37,7 @@ System prompts can be categorized by their purpose: ## Configuration Reference /// mknodes -{{ "agentpool_config.system_prompts.PromptConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.system_prompts.PromptConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ## Complete Example diff --git a/docs/how-to/configuration/prompts_example.yml b/docs/how-to/configuration/prompts_example.yml index de1119550..a466a6e1d 100644 --- a/docs/how-to/configuration/prompts_example.yml +++ b/docs/how-to/configuration/prompts_example.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json prompts: # Define reusable system prompts system_prompts: diff --git a/docs/how-to/configuration/resources.md b/docs/how-to/configuration/resources.md index d354ce238..8f412ef9e 100644 --- a/docs/how-to/configuration/resources.md +++ b/docs/how-to/configuration/resources.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/loaders.py + - src/wolfharness_config/loaders.py title: Resources description: Resource loader configuration icon: material/file-multiple @@ -25,7 +25,7 @@ Resources are loaded on-demand when agents request them, supporting parameteriza ## Configuration Reference -For the full resource type reference, see the `agentpool_config.loaders.Resource` schema documentation. +For the full resource type reference, see the `wolfharness_config.loaders.Resource` schema documentation. ## Key Features @@ -62,9 +62,9 @@ ResourceProviders can now provide dynamic instructions that are re-evaluated on ResourceProviders can implement the `get_instructions()` method to return instruction functions: ```python -from agentpool.resource_providers import ResourceProvider -from agentpool.prompts.instructions import InstructionFunc -from agentpool.agents.context import AgentContext +from wolfharness.resource_providers import ResourceProvider +from wolfharness.prompts.instructions import InstructionFunc +from wolfharness.agents.context import AgentContext class MyProvider(ResourceProvider): async def get_instructions(self) -> list[InstructionFunc]: diff --git a/docs/how-to/configuration/responses.yml b/docs/how-to/configuration/responses.yml index 578425427..08e1ded61 100644 --- a/docs/how-to/configuration/responses.yml +++ b/docs/how-to/configuration/responses.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json responses: WebResult: response_schema: diff --git a/docs/how-to/configuration/session.md b/docs/how-to/configuration/session.md index f8b62680b..dcb6ecd91 100644 --- a/docs/how-to/configuration/session.md +++ b/docs/how-to/configuration/session.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/session.py + - src/wolfharness_config/session.py title: Sessions description: Session management and configuration icon: material/account-clock diff --git a/docs/how-to/configuration/skill-uri-usage.md b/docs/how-to/configuration/skill-uri-usage.md index 6cb01a627..d9975b39b 100644 --- a/docs/how-to/configuration/skill-uri-usage.md +++ b/docs/how-to/configuration/skill-uri-usage.md @@ -42,7 +42,7 @@ When you use a bare skill name, AgentPool searches all skill sources (local skills first, then MCP providers) in priority order: ```python -from agentpool import AgentPool +from wolfharness import AgentPool async with AgentPool("config.yml") as pool: agent = pool.get_agent("assistant") diff --git a/docs/how-to/configuration/skills.md b/docs/how-to/configuration/skills.md index 6ca20e935..c32ad4aeb 100644 --- a/docs/how-to/configuration/skills.md +++ b/docs/how-to/configuration/skills.md @@ -24,7 +24,7 @@ Skills injection allows you to: skills: # Skill discovery paths paths: - - ~/.config/agentpool/skills + - ~/.config/wolfharness/skills - ./skills # Include default AgentPool skills (default: true) @@ -87,7 +87,7 @@ With `inject: all` (or matcher-selected skills), full content is also injected: # Global skills configuration skills: paths: - - ~/.config/agentpool/skills + - ~/.config/wolfharness/skills - ./project-skills include_default: true diff --git a/docs/how-to/configuration/storage.md b/docs/how-to/configuration/storage.md index dee632998..a72a3b045 100644 --- a/docs/how-to/configuration/storage.md +++ b/docs/how-to/configuration/storage.md @@ -2,7 +2,7 @@ sync: agent: doc_sync_agent dependencies: - - src/agentpool_config/storage.py + - src/wolfharness_config/storage.py title: Storage description: Database and storage setup icon: material/database @@ -13,7 +13,7 @@ The storage configuration defines how agent interactions, messages, and tool usa ## Configuration Reference /// mknodes -{{ "agentpool_config.storage.StorageProviderConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.storage.StorageProviderConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ## Overview diff --git a/docs/how-to/configuration/storage_example.yml b/docs/how-to/configuration/storage_example.yml index 705d2eb55..89670ffa6 100644 --- a/docs/how-to/configuration/storage_example.yml +++ b/docs/how-to/configuration/storage_example.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json storage: # Global settings agents: ["planner", "executor"] diff --git a/docs/how-to/configuration/tasks.md b/docs/how-to/configuration/tasks.md index 2c329f4f3..7121f2682 100644 --- a/docs/how-to/configuration/tasks.md +++ b/docs/how-to/configuration/tasks.md @@ -129,7 +129,7 @@ All tasks are available through the agent pool: job = pool.get_job("analyze_code") # Register new task -from agentpool_config.task import Job +from wolfharness_config.task import Job job = Job( name="new_task", description="A new task", diff --git a/docs/how-to/configuration/toolsets/code-mode.md b/docs/how-to/configuration/toolsets/code-mode.md index 4b84213c9..b1aca24c4 100644 --- a/docs/how-to/configuration/toolsets/code-mode.md +++ b/docs/how-to/configuration/toolsets/code-mode.md @@ -27,5 +27,5 @@ Instead of calling tools directly, the agent generates Python code that invokes ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.CodeModeToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.CodeModeToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// diff --git a/docs/how-to/configuration/toolsets/code.md b/docs/how-to/configuration/toolsets/code.md index 32a42997c..f5d27a28e 100644 --- a/docs/how-to/configuration/toolsets/code.md +++ b/docs/how-to/configuration/toolsets/code.md @@ -20,8 +20,8 @@ agents: ## Available Tools ```python exec="true" -from agentpool_toolsets.builtin.code import CodeTools -from agentpool.docs.utils import generate_tool_docs +from wolfharness_toolsets.builtin.code import CodeTools +from wolfharness.docs.utils import generate_tool_docs toolset = CodeTools() print(generate_tool_docs(toolset)) @@ -30,5 +30,5 @@ print(generate_tool_docs(toolset)) ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.CodeToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.CodeToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// diff --git a/docs/how-to/configuration/toolsets/composio.md b/docs/how-to/configuration/toolsets/composio.md index 097917a56..4f9361e3d 100644 --- a/docs/how-to/configuration/toolsets/composio.md +++ b/docs/how-to/configuration/toolsets/composio.md @@ -23,7 +23,7 @@ agents: ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.ComposioToolSetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets") }} +{{ "wolfharness_config.toolsets.ComposioToolSetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets") }} /// ## Available Apps diff --git a/docs/how-to/configuration/toolsets/config-creation.md b/docs/how-to/configuration/toolsets/config-creation.md index 9a7f106da..a80747bfe 100644 --- a/docs/how-to/configuration/toolsets/config-creation.md +++ b/docs/how-to/configuration/toolsets/config-creation.md @@ -20,8 +20,8 @@ agents: ## Available Tools ```python exec="true" -from agentpool_toolsets.config_creation import ConfigCreationTools -from agentpool.docs.utils import generate_tool_docs +from wolfharness_toolsets.config_creation import ConfigCreationTools +from wolfharness.docs.utils import generate_tool_docs toolset = ConfigCreationTools() print(generate_tool_docs(toolset)) @@ -36,5 +36,5 @@ print(generate_tool_docs(toolset)) ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.ConfigCreationToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.ConfigCreationToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// diff --git a/docs/how-to/configuration/toolsets/custom.md b/docs/how-to/configuration/toolsets/custom.md index ee4edc4ec..7595eab36 100644 --- a/docs/how-to/configuration/toolsets/custom.md +++ b/docs/how-to/configuration/toolsets/custom.md @@ -21,7 +21,7 @@ agents: ## Creating a Custom Toolset ```python -from agentpool.resource_providers import ResourceProvider +from wolfharness.resource_providers import ResourceProvider class MyCustomToolset(ResourceProvider): async def get_tools(self): @@ -37,5 +37,5 @@ class MyCustomToolset(ResourceProvider): ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.CustomToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.CustomToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// diff --git a/docs/how-to/configuration/toolsets/entry-points.md b/docs/how-to/configuration/toolsets/entry-points.md index 7ca9fb050..1850d95a2 100644 --- a/docs/how-to/configuration/toolsets/entry-points.md +++ b/docs/how-to/configuration/toolsets/entry-points.md @@ -32,5 +32,5 @@ The toolset then discovers and loads these tools automatically. ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.EntryPointToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets") }} +{{ "wolfharness_config.toolsets.EntryPointToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets") }} /// diff --git a/docs/how-to/configuration/toolsets/execution.md b/docs/how-to/configuration/toolsets/execution.md index bbfa46c94..73f8f4ca6 100644 --- a/docs/how-to/configuration/toolsets/execution.md +++ b/docs/how-to/configuration/toolsets/execution.md @@ -56,8 +56,8 @@ Execute on remote machines via SSH or other protocols. ## Available Tools ```python exec="true" -from agentpool_toolsets.builtin.execution_environment import ProcessManagementTools -from agentpool.docs.utils import generate_tool_docs +from wolfharness_toolsets.builtin.execution_environment import ProcessManagementTools +from wolfharness.docs.utils import generate_tool_docs toolset = ProcessManagementTools() print(generate_tool_docs(toolset)) @@ -80,7 +80,7 @@ tools: ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.ProcessManagementToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.ProcessManagementToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// ## Security Considerations diff --git a/docs/how-to/configuration/toolsets/file-access.md b/docs/how-to/configuration/toolsets/file-access.md index a1e33e451..f6b53fc9a 100644 --- a/docs/how-to/configuration/toolsets/file-access.md +++ b/docs/how-to/configuration/toolsets/file-access.md @@ -62,8 +62,8 @@ tools: ## Available Tools ```python exec="true" -from agentpool_toolsets.fsspec_toolset import FSSpecTools -from agentpool.docs.utils import generate_tool_docs +from wolfharness_toolsets.fsspec_toolset import FSSpecTools +from wolfharness.docs.utils import generate_tool_docs toolset = FSSpecTools() print(generate_tool_docs(toolset)) @@ -72,7 +72,7 @@ print(generate_tool_docs(toolset)) ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.FSSpecToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.FSSpecToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// ## Examples diff --git a/docs/how-to/configuration/toolsets/import-tools.md b/docs/how-to/configuration/toolsets/import-tools.md index ec5e1acf6..2d2e092c9 100644 --- a/docs/how-to/configuration/toolsets/import-tools.md +++ b/docs/how-to/configuration/toolsets/import-tools.md @@ -39,7 +39,7 @@ Each tool supports these options: ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.ImportToolsToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.ImportToolsToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// ## Use Cases diff --git a/docs/how-to/configuration/toolsets/notifications.md b/docs/how-to/configuration/toolsets/notifications.md index 6cc2b8933..d20915d2d 100644 --- a/docs/how-to/configuration/toolsets/notifications.md +++ b/docs/how-to/configuration/toolsets/notifications.md @@ -25,8 +25,8 @@ agents: ## Available Tools ```python exec="true" -from agentpool_toolsets.notifications import NotificationsTools -from agentpool.docs.utils import generate_tool_docs +from wolfharness_toolsets.notifications import NotificationsTools +from wolfharness.docs.utils import generate_tool_docs toolset = NotificationsTools() print(generate_tool_docs(toolset)) @@ -42,5 +42,5 @@ print(generate_tool_docs(toolset)) ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.NotificationsToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.NotificationsToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// diff --git a/docs/how-to/configuration/toolsets/openapi.md b/docs/how-to/configuration/toolsets/openapi.md index d94af0daf..32b4600a3 100644 --- a/docs/how-to/configuration/toolsets/openapi.md +++ b/docs/how-to/configuration/toolsets/openapi.md @@ -59,7 +59,7 @@ Each OpenAPI operation becomes a tool with: ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.OpenAPIToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets") }} +{{ "wolfharness_config.toolsets.OpenAPIToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets") }} /// ## Tips diff --git a/docs/how-to/configuration/toolsets/remote-code-mode.md b/docs/how-to/configuration/toolsets/remote-code-mode.md index 62dcf243a..ce5997017 100644 --- a/docs/how-to/configuration/toolsets/remote-code-mode.md +++ b/docs/how-to/configuration/toolsets/remote-code-mode.md @@ -23,5 +23,5 @@ agents: ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.RemoteCodeModeToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.RemoteCodeModeToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// diff --git a/docs/how-to/configuration/toolsets/search.md b/docs/how-to/configuration/toolsets/search.md index b4c551de4..fe16514b0 100644 --- a/docs/how-to/configuration/toolsets/search.md +++ b/docs/how-to/configuration/toolsets/search.md @@ -69,8 +69,8 @@ tools: ## Available Tools ```python exec="true" -from agentpool_toolsets.search_toolset import SearchTools -from agentpool.docs.utils import generate_tool_docs +from wolfharness_toolsets.search_toolset import SearchTools +from wolfharness.docs.utils import generate_tool_docs toolset = SearchTools() print(generate_tool_docs(toolset)) @@ -79,7 +79,7 @@ print(generate_tool_docs(toolset)) ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.SearchToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.SearchToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// ## Environment Variables diff --git a/docs/how-to/configuration/toolsets/skills.md b/docs/how-to/configuration/toolsets/skills.md index ef7442509..d685dd822 100644 --- a/docs/how-to/configuration/toolsets/skills.md +++ b/docs/how-to/configuration/toolsets/skills.md @@ -35,9 +35,9 @@ pool loads skills. Call them directly; no separate toolset is needed. ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.SkillsToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.SkillsToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// /// mknodes -{{ "agentpool_config.toolsets.SkillsToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.SkillsToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// diff --git a/docs/how-to/configuration/toolsets/subagent.md b/docs/how-to/configuration/toolsets/subagent.md index 61352e38c..2dfa31fd3 100644 --- a/docs/how-to/configuration/toolsets/subagent.md +++ b/docs/how-to/configuration/toolsets/subagent.md @@ -20,8 +20,8 @@ agents: ## Available Tools ```python exec="true" -from agentpool_toolsets.builtin.subagent_tools import SubagentTools -from agentpool.docs.utils import generate_tool_docs +from wolfharness_toolsets.builtin.subagent_tools import SubagentTools +from wolfharness.docs.utils import generate_tool_docs toolset = SubagentTools() print(generate_tool_docs(toolset)) @@ -30,7 +30,7 @@ print(generate_tool_docs(toolset)) ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.SubagentToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.SubagentToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// ## Example Workflow diff --git a/docs/how-to/configuration/toolsets/user-interaction.md b/docs/how-to/configuration/toolsets/user-interaction.md index 01a088289..5331a4daf 100644 --- a/docs/how-to/configuration/toolsets/user-interaction.md +++ b/docs/how-to/configuration/toolsets/user-interaction.md @@ -50,4 +50,4 @@ Supported question types: The tool returns the user's answers through the agent tool result. Agents can then use the answers to decide next steps or personalize their response. -For implementation details, see `agentpool_toolsets.builtin.question_tools`. +For implementation details, see `wolfharness_toolsets.builtin.question_tools`. diff --git a/docs/how-to/configuration/toolsets/vfs.md b/docs/how-to/configuration/toolsets/vfs.md index 2c2a8d1a3..e9b8b6a2d 100644 --- a/docs/how-to/configuration/toolsets/vfs.md +++ b/docs/how-to/configuration/toolsets/vfs.md @@ -33,8 +33,8 @@ agents: ## Available Tools ```python exec="true" -from agentpool_toolsets.vfs_toolset import VFSTools -from agentpool.docs.utils import generate_tool_docs +from wolfharness_toolsets.vfs_toolset import VFSTools +from wolfharness.docs.utils import generate_tool_docs toolset = VFSTools() print(generate_tool_docs(toolset)) @@ -61,7 +61,7 @@ vfs_read("code/src", recursive=True) ## Configuration Reference /// mknodes -{{ "agentpool_config.toolsets.VFSToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} +{{ "wolfharness_config.toolsets.VFSToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets", header_level=3) }} /// ## When to Use VFS vs File Access diff --git a/docs/how-to/configuration/toolsets/workers.md b/docs/how-to/configuration/toolsets/workers.md index 3f8a5e5e0..77cb8a1ac 100644 --- a/docs/how-to/configuration/toolsets/workers.md +++ b/docs/how-to/configuration/toolsets/workers.md @@ -36,7 +36,7 @@ This creates tools `ask_code_reviewer` and `ask_researcher` for the manager agen ## Toolset Configuration /// mknodes -{{ "agentpool_config.toolsets.WorkersToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets") }} +{{ "wolfharness_config.toolsets.WorkersToolsetConfig" | schema_to_markdown(display_mode="yaml", header_style="pymdownx", wrapped_in="toolsets") }} /// ## Worker Types @@ -101,7 +101,7 @@ tools: ## Worker Configuration Reference /// mknodes -{{ "agentpool_config.workers.WorkerConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} +{{ "wolfharness_config.workers.WorkerConfig" | union_to_markdown(display_mode="yaml", header_style="pymdownx") }} /// ## Example: Manager with Specialized Workers diff --git a/docs/how-to/programmatic-usage/injection.md b/docs/how-to/programmatic-usage/injection.md index 36d2fe5b8..085f82c18 100644 --- a/docs/how-to/programmatic-usage/injection.md +++ b/docs/how-to/programmatic-usage/injection.md @@ -229,7 +229,7 @@ async def shared_analysis( The connection between your YAML manifest and the injection system is made through the AgentPool: ```python -from agentpool import AgentPool, AgentsManifest +from wolfharness import AgentPool, AgentsManifest # 1. Define your agents in YAML manifest = """ diff --git a/docs/how-to/programmatic-usage/run-interface.md b/docs/how-to/programmatic-usage/run-interface.md index 97faa8312..19f464654 100644 --- a/docs/how-to/programmatic-usage/run-interface.md +++ b/docs/how-to/programmatic-usage/run-interface.md @@ -5,7 +5,7 @@ description: Agent and team run interface # Run Interface -The run interface provides a consistent way to interact with all message handlers (Agents, Teams, TeamRuns) in agentpool. +The run interface provides a consistent way to interact with all message handlers (Agents, Teams, TeamRuns) in wolfharness. It serves both as a messaging protocol and a public API. ## Core Methods diff --git a/docs/how-to/programmatic-usage/task-monitoring.md b/docs/how-to/programmatic-usage/task-monitoring.md index 62012c6ad..eba4aaaa2 100644 --- a/docs/how-to/programmatic-usage/task-monitoring.md +++ b/docs/how-to/programmatic-usage/task-monitoring.md @@ -86,7 +86,7 @@ stats.error_log # Any errors that occurred ### Example: Monitored Execution ```python -from agentpool import AgentPool +from wolfharness import AgentPool async def main(): async with AgentPool() as pool: diff --git a/docs/how-to/programmatic-usage/team.md b/docs/how-to/programmatic-usage/team.md index 01ad2c7bc..d277f30ca 100644 --- a/docs/how-to/programmatic-usage/team.md +++ b/docs/how-to/programmatic-usage/team.md @@ -19,7 +19,7 @@ Teams in AgentPool allow you to organize and orchestrate multiple agents as a gr ### Direct Creation ```python -from agentpool.delegation import Team +from wolfharness.delegation import Team team = Team( agents=[agent1, agent2, agent3], @@ -62,7 +62,7 @@ for agent_name, error in team_response.errors.items(): For sequential execution, use `TeamRun` instead: ```python -from agentpool import TeamRun +from wolfharness import TeamRun # Create sequential pipeline run = TeamRun([agent1, agent2, agent3]) diff --git a/docs/how-to/programmatic-usage/tools.md b/docs/how-to/programmatic-usage/tools.md index 56b4f5451..fa6d1da18 100644 --- a/docs/how-to/programmatic-usage/tools.md +++ b/docs/how-to/programmatic-usage/tools.md @@ -20,7 +20,7 @@ The `ToolManager` is a central component that manages the lifecycle and availabi ### 1. Tool Registration and Access ```python -from agentpool.tools import ToolManager +from wolfharness.tools import ToolManager diff --git a/docs/how-to/servers/acp-server.md b/docs/how-to/servers/acp-server.md index 8a3b489ca..6ba78fa2a 100644 --- a/docs/how-to/servers/acp-server.md +++ b/docs/how-to/servers/acp-server.md @@ -22,10 +22,10 @@ ACP is a standardized JSON-RPC 2.0 protocol that provides: ```bash # Using uvx (no installation required) -uvx --python 3.13 agentpool@latest serve-acp config.yml +uvx --python 3.13 wolfharness@latest serve-acp config.yml # Or with installed package -agentpool serve-acp config.yml +wolfharness serve-acp config.yml ``` See [`serve-acp`](../../reference/cli/serve-acp.md) for all CLI options. @@ -43,7 +43,7 @@ Add to your Zed `settings.json`: "command": "uvx", "args": [ "--python", "3.13", - "agentpool[coding]@latest", + "wolfharness[coding]@latest", "serve-acp", "path/to/config.yml" ], @@ -59,7 +59,7 @@ Add to your Zed `settings.json`: For IDEs that support ACP: -1. Set command to `agentpool` or `uvx agentpool@latest` +1. Set command to `wolfharness` or `uvx wolfharness@latest` 2. Add `serve-acp` as first argument 3. Specify your configuration file 4. Add CLI options as needed diff --git a/docs/how-to/servers/agui-server.md b/docs/how-to/servers/agui-server.md index 209ed66e5..6632c071a 100644 --- a/docs/how-to/servers/agui-server.md +++ b/docs/how-to/servers/agui-server.md @@ -22,10 +22,10 @@ GET http://localhost:8002/ -> List all agents ```bash # Run with default settings -agentpool serve-agui config.yml +wolfharness serve-agui config.yml # Custom host and port -agentpool serve-agui config.yml --host 0.0.0.0 --port 8002 +wolfharness serve-agui config.yml --host 0.0.0.0 --port 8002 ``` See [`serve-agui`](../../reference/cli/serve-agui.md) for all CLI options. @@ -34,8 +34,8 @@ See [`serve-agui`](../../reference/cli/serve-agui.md) for all CLI options. ```python import anyio -from agentpool import AgentPool -from agentpool_server.agui_server import AGUIServer +from wolfharness import AgentPool +from wolfharness_server.agui_server import AGUIServer async def main(): diff --git a/docs/how-to/servers/index.md b/docs/how-to/servers/index.md index 43cea52ee..f528af0e1 100644 --- a/docs/how-to/servers/index.md +++ b/docs/how-to/servers/index.md @@ -12,11 +12,11 @@ AgentPool can expose agents through multiple server protocols, enabling integrat | Server | Protocol | Use Case | CLI Command | |--------|----------|----------|-------------| -| [ACP Server](acp-server.md) | Agent Communication Protocol | IDE integration (Zed, etc.) | `agentpool serve-acp` | -| [OpenCode Server](opencode-server.md) | OpenCode REST + SSE | OpenCode TUI/Desktop | `agentpool serve-opencode` | -| [MCP Server](mcp-server.md) | Model Context Protocol | Expose tools to other agents | `agentpool serve-mcp` | -| [AG-UI Server](agui-server.md) | AG-UI Protocol | AG-UI compatible clients | `agentpool serve-agui` | -| [OpenAI API Server](openai-api-server.md) | OpenAI API | Drop-in OpenAI replacement | `agentpool serve-api` | +| [ACP Server](acp-server.md) | Agent Communication Protocol | IDE integration (Zed, etc.) | `wolfharness serve-acp` | +| [OpenCode Server](opencode-server.md) | OpenCode REST + SSE | OpenCode TUI/Desktop | `wolfharness serve-opencode` | +| [MCP Server](mcp-server.md) | Model Context Protocol | Expose tools to other agents | `wolfharness serve-mcp` | +| [AG-UI Server](agui-server.md) | AG-UI Protocol | AG-UI compatible clients | `wolfharness serve-agui` | +| [OpenAI API Server](openai-api-server.md) | OpenAI API | Drop-in OpenAI replacement | `wolfharness serve-api` | ## Architecture Overview @@ -113,19 +113,19 @@ You can run multiple servers simultaneously: ```bash # Terminal 1: ACP for IDE -agentpool serve-acp config.yml +wolfharness serve-acp config.yml # Terminal 2: OpenCode for TUI -agentpool serve-opencode config.yml --port 4096 +wolfharness serve-opencode config.yml --port 4096 # Terminal 3: MCP for tool sharing -agentpool serve-mcp config.yml +wolfharness serve-mcp config.yml # Terminal 4: AG-UI for custom frontends -agentpool serve-agui config.yml --port 8002 +wolfharness serve-agui config.yml --port 8002 # Terminal 5: OpenAI API for SDK compatibility -agentpool serve-api config.yml --port 8000 +wolfharness serve-api config.yml --port 8000 ``` ### Common Configuration diff --git a/docs/how-to/servers/mcp-server.md b/docs/how-to/servers/mcp-server.md index 44fd92b3c..ffb8892dd 100644 --- a/docs/how-to/servers/mcp-server.md +++ b/docs/how-to/servers/mcp-server.md @@ -21,10 +21,10 @@ MCP is a standardized protocol for AI tool integration: ```bash # Expose tools from a pool -agentpool serve-mcp config.yml +wolfharness serve-mcp config.yml # Or expose specific toolsets -agentpool serve-mcp config.yml --toolset file_access --toolset search +wolfharness serve-mcp config.yml --toolset file_access --toolset search ``` See [`serve-mcp`](../../reference/cli/serve-mcp.md) for all CLI options. @@ -37,7 +37,7 @@ Expose your custom tools to Claude Code: ```bash # Start MCP server -agentpool serve-mcp tools.yml --transport sse --port 3001 +wolfharness serve-mcp tools.yml --transport sse --port 3001 ``` Configure Claude Code's `mcp.json`: @@ -45,7 +45,7 @@ Configure Claude Code's `mcp.json`: ```json { "mcpServers": { - "agentpool": { + "wolfharness": { "url": "http://localhost:3001/sse" } } @@ -80,8 +80,8 @@ External agents can now delegate to your experts via MCP. Expose custom Python functions: ```python -from agentpool import Agent -from agentpool.tools import tool +from wolfharness import Agent +from wolfharness.tools import tool @tool def analyze_data(data: str) -> str: @@ -93,7 +93,7 @@ agent = Agent("analyzer", model="...", tools=[analyze_data]) ``` ```bash -agentpool serve-mcp --config agent.yml +wolfharness serve-mcp --config agent.yml ``` ## Exposed Capabilities @@ -165,7 +165,7 @@ graph LR For subprocess communication: ```bash -agentpool serve-mcp config.yml --transport stdio +wolfharness serve-mcp config.yml --transport stdio ``` Used when the client spawns the server as a subprocess. @@ -175,7 +175,7 @@ Used when the client spawns the server as a subprocess. For HTTP-based communication: ```bash -agentpool serve-mcp config.yml --transport sse --port 3001 +wolfharness serve-mcp config.yml --transport sse --port 3001 ``` diff --git a/docs/how-to/servers/openai-api-server.md b/docs/how-to/servers/openai-api-server.md index 5302b18b3..74c98f6ed 100644 --- a/docs/how-to/servers/openai-api-server.md +++ b/docs/how-to/servers/openai-api-server.md @@ -22,10 +22,10 @@ POST /v1/responses -> Responses API ```bash # Run with default settings -agentpool serve-api config.yml +wolfharness serve-api config.yml # Custom host and port -agentpool serve-api config.yml --host 0.0.0.0 --port 8000 +wolfharness serve-api config.yml --host 0.0.0.0 --port 8000 ``` See [`serve-api`](../../reference/cli/serve-api.md) for all CLI options. @@ -34,8 +34,8 @@ See [`serve-api`](../../reference/cli/serve-api.md) for all CLI options. ```python import anyio -from agentpool import AgentPool -from agentpool_server.openai_api_server import OpenAIAPIServer +from wolfharness import AgentPool +from wolfharness_server.openai_api_server import OpenAIAPIServer async def main(): @@ -76,13 +76,13 @@ Returns available agents as OpenAI-compatible models: "id": "assistant", "object": "model", "created": 0, - "owned_by": "agentpool" + "owned_by": "wolfharness" }, { "id": "coder", "object": "model", "created": 0, - "owned_by": "agentpool" + "owned_by": "wolfharness" } ] } diff --git a/docs/how-to/servers/opencode-server.md b/docs/how-to/servers/opencode-server.md index 9a4c5fc64..895d47b48 100644 --- a/docs/how-to/servers/opencode-server.md +++ b/docs/how-to/servers/opencode-server.md @@ -21,7 +21,7 @@ The OpenCode API protocol can be used by any compatible client to interact with ```bash # Start the OpenCode server -agentpool serve-opencode config.yml --port 4096 +wolfharness serve-opencode config.yml --port 4096 ``` See [`serve-opencode`](../../reference/cli/serve-opencode.md) for all CLI options. @@ -218,8 +218,8 @@ Connect to `/global/event` or `/event` to receive events. ## Programmatic Usage ```python -from agentpool_server.opencode_server.server import OpenCodeServer -from agentpool import Agent +from wolfharness_server.opencode_server.server import OpenCodeServer +from wolfharness import Agent async def main(): agent = Agent("assistant", model="openai:gpt-4o") @@ -250,7 +250,7 @@ Current limitations: - `fork` not yet implemented - Symbol search returns empty (LSP not integrated) -See [ENDPOINTS.md](https://github.com/Million-mo/agentpool/blob/main/src/agentpool_server/opencode_server/ENDPOINTS.md) for full implementation status. +See [ENDPOINTS.md](https://github.com/Million-mo/wolfharness/blob/main/src/wolfharness_server/opencode_server/ENDPOINTS.md) for full implementation status. ## See Also diff --git a/docs/index.md b/docs/index.md index 970a8ef4e..bdf1e8725 100644 --- a/docs/index.md +++ b/docs/index.md @@ -65,7 +65,7 @@ Everything is a MessageNode - enabling seamless composition: ## License -MIT License - see [LICENSE](https://github.com/Leoyzen/agentpool/blob/main/LICENSE) for details. +MIT License - see [LICENSE](https://github.com/Leoyzen/wolfharness/blob/main/LICENSE) for details. ## Documentation @@ -95,7 +95,7 @@ agents: ### Python Usage ```python -from agentpool import AgentPool +from wolfharness import AgentPool async def main(): async with AgentPool("agents.yml") as pool: diff --git a/agentpool-session-pool/docs/ops/acp-handler.md b/docs/ops/acp-handler.md similarity index 95% rename from agentpool-session-pool/docs/ops/acp-handler.md rename to docs/ops/acp-handler.md index 3460fb83e..6c853d580 100644 --- a/agentpool-session-pool/docs/ops/acp-handler.md +++ b/docs/ops/acp-handler.md @@ -1,6 +1,6 @@ # ACP Handler Ops Playbook -Operational runbook for the `ACPProtocolHandler` (`agentpool_server.acp_server.handler`). +Operational runbook for the `ACPProtocolHandler` (`wolfharness_server.acp_server.handler`). ## Feature Flag Toggle @@ -27,7 +27,7 @@ agents: ### Check at runtime ```python -from agentpool_server.acp_server.handler import ACPProtocolHandler +from wolfharness_server.acp_server.handler import ACPProtocolHandler handler = ACPProtocolHandler(agent_pool, event_converter, client) enabled = handler._should_use_session_pool() diff --git a/agentpool-session-pool/docs/ops/opencode-handler.md b/docs/ops/opencode-handler.md similarity index 96% rename from agentpool-session-pool/docs/ops/opencode-handler.md rename to docs/ops/opencode-handler.md index 57a587ce9..9a1417659 100644 --- a/agentpool-session-pool/docs/ops/opencode-handler.md +++ b/docs/ops/opencode-handler.md @@ -1,6 +1,6 @@ # OpenCode Handler Ops Playbook -Operational runbook for the `OpenCodeProtocolHandler` (`agentpool_server.opencode_server.handler`). +Operational runbook for the `OpenCodeProtocolHandler` (`wolfharness_server.opencode_server.handler`). ## SSE Connection Troubleshooting @@ -22,7 +22,7 @@ Operational runbook for the `OpenCodeProtocolHandler` (`agentpool_server.opencod 3. **Verify events are being published:** ```python - from agentpool.orchestrator.metrics import MetricsCollector + from wolfharness.orchestrator.metrics import MetricsCollector collector = MetricsCollector(session_pool) metrics = await collector.get_metrics() print(metrics.event_bus_queue_depth.get(session_id, 0)) @@ -30,7 +30,7 @@ Operational runbook for the `OpenCodeProtocolHandler` (`agentpool_server.opencod 4. **Verify SSE broadcast is working:** ```python - from agentpool_server.opencode_server.models.events import SessionIdleEvent + from wolfharness_server.opencode_server.models.events import SessionIdleEvent await state.broadcast_event(SessionIdleEvent.create(session_id)) # Client should receive this immediately ``` diff --git a/agentpool-session-pool/docs/ops/session-pool.md b/docs/ops/session-pool.md similarity index 77% rename from agentpool-session-pool/docs/ops/session-pool.md rename to docs/ops/session-pool.md index 862a69c58..f7c7db4c9 100644 --- a/agentpool-session-pool/docs/ops/session-pool.md +++ b/docs/ops/session-pool.md @@ -4,23 +4,23 @@ Operational runbook for the `SessionPool` orchestration layer. ## Dashboard Compatibility -All Prometheus metric names use the `agentpool_` prefix and identical label names to the pre-SessionPool Grafana dashboards. **No dashboard changes are required.** +All Prometheus metric names use the `wolfharness_` prefix and identical label names to the pre-SessionPool Grafana dashboards. **No dashboard changes are required.** | Metric | Type | Description | |--------|------|-------------| -| `agentpool_sessions_total` | gauge | Active sessions | -| `agentpool_active_turns_total` | gauge | Turns in progress | -| `agentpool_auto_resume_total` | counter | Auto-resume iterations | -| `agentpool_event_bus_subscribers` | gauge | Subscribers per session (`session_id` label) | -| `agentpool_session_lifetime_seconds` | gauge | Average closed-session lifetime | -| `agentpool_turn_latency_ms` | summary | Turn latency p99 (`quantile="0.99"`) | +| `wolfharness_sessions_total` | gauge | Active sessions | +| `wolfharness_active_turns_total` | gauge | Turns in progress | +| `wolfharness_auto_resume_total` | counter | Auto-resume iterations | +| `wolfharness_event_bus_subscribers` | gauge | Subscribers per session (`session_id` label) | +| `wolfharness_session_lifetime_seconds` | gauge | Average closed-session lifetime | +| `wolfharness_turn_latency_ms` | summary | Turn latency p99 (`quantile="0.99"`) | Call `metrics.to_prometheus()` on a `SessionPoolMetrics` snapshot to emit these lines for scraping. ## Startup ```python -from agentpool.orchestrator import SessionPool +from wolfharness.orchestrator import SessionPool session_pool = SessionPool(agent_pool) await session_pool.start() @@ -53,7 +53,7 @@ assert session_pool.event_bus is not None ### Readiness (Recommended) ```python -from agentpool.orchestrator.metrics import MetricsCollector +from wolfharness.orchestrator.metrics import MetricsCollector collector = MetricsCollector(session_pool) metrics = await collector.get_metrics() @@ -94,7 +94,7 @@ print(f"Event bus subscribers: {metrics.event_bus_queue_depth}") **Diagnosis:** -- `agentpool_event_bus_subscribers` gauge will show high counts for specific sessions. +- `wolfharness_event_bus_subscribers` gauge will show high counts for specific sessions. - Check consumer task logs — look for "Event consumer cancelled" or uncaught exceptions. **Remediation:** @@ -137,18 +137,18 @@ print(metrics.to_prometheus()) Example output: ```text -# TYPE agentpool_sessions_total gauge -agentpool_sessions_total 42 -# TYPE agentpool_active_turns_total gauge -agentpool_active_turns_total 3 -# TYPE agentpool_auto_resume_total counter -agentpool_auto_resume_total 17 -# TYPE agentpool_event_bus_subscribers gauge -agentpool_event_bus_subscribers{session_id="sess_abc"} 2 -# TYPE agentpool_session_lifetime_seconds gauge -agentpool_session_lifetime_seconds 1245.300 -# TYPE agentpool_turn_latency_ms summary -agentpool_turn_latency_ms{quantile="0.99"} 150.000 +# TYPE wolfharness_sessions_total gauge +wolfharness_sessions_total 42 +# TYPE wolfharness_active_turns_total gauge +wolfharness_active_turns_total 3 +# TYPE wolfharness_auto_resume_total counter +wolfharness_auto_resume_total 17 +# TYPE wolfharness_event_bus_subscribers gauge +wolfharness_event_bus_subscribers{session_id="sess_abc"} 2 +# TYPE wolfharness_session_lifetime_seconds gauge +wolfharness_session_lifetime_seconds 1245.300 +# TYPE wolfharness_turn_latency_ms summary +wolfharness_turn_latency_ms{quantile="0.99"} 150.000 ``` ## Emergency Procedures diff --git a/docs/records/acp-protocol-gap-analysis.md b/docs/records/acp-protocol-gap-analysis.md index 75831117b..64d49fe94 100644 --- a/docs/records/acp-protocol-gap-analysis.md +++ b/docs/records/acp-protocol-gap-analysis.md @@ -22,9 +22,9 @@ AgentPool's ACP implementation covers **most v1 stable features** but has severa This analysis was produced by: -1. **Code-level verification** of AgentPool schema definitions in `packages/agentpool/src/acp/schema/` -2. **Protocol interface audit** of `packages/agentpool/src/acp/agent/protocol.py` and `packages/agentpool/src/acp/client/protocol.py` -3. **Server implementation review** of `packages/agentpool/src/agentpool_server/acp_server/` +1. **Code-level verification** of AgentPool schema definitions in `packages/wolfharness/src/acp/schema/` +2. **Protocol interface audit** of `packages/wolfharness/src/acp/agent/protocol.py` and `packages/wolfharness/src/acp/client/protocol.py` +3. **Server implementation review** of `packages/wolfharness/src/wolfharness_server/acp_server/` 4. **Cross-reference** with ACP spec Rust types in `packages/agent-client-protocol/src/v1/` and `src/v2/` 5. **Documentation review** of ACP protocol docs in `packages/agent-client-protocol/docs/` @@ -58,7 +58,7 @@ All claims below include specific file paths and line numbers for traceability. - `src/acp/schema/messages.py:34` — `AgentMethod` includes `"session/close"` in the Literal - `src/acp/agent/protocol.py:57` — Interface method is `stop_session()` -- `src/agentpool_server/acp_server/acp_agent.py:843` — Implementation is `stop_session()` +- `src/wolfharness_server/acp_server/acp_agent.py:843` — Implementation is `stop_session()` - `src/acp/bridge/bridge.py:143-146` — Bridge correctly maps `"session/close"` → `stop_session()` **Note:** The bridge handles the wire protocol mapping, so external clients using `session/close` work correctly. However, internal code and type names use `stop`, which is confusing and inconsistent with the spec. @@ -94,7 +94,7 @@ This means the capability can never be advertised to clients, despite the method The spec defines `providers/list`, `providers/set`, `providers/disable` as **native agent methods** with typed responses (`ListProvidersResponse`, `SetProvidersResponse`, `DisableProvidersResponse`). AgentPool implements them in `ext_method()` returning raw dicts: ```python -# src/agentpool_server/acp_server/acp_agent.py:875-898 +# src/wolfharness_server/acp_server/acp_agent.py:875-898 async def ext_method(self, method: str, params: dict[str, Any]) -> dict[str, Any]: match method: case "providers/list": @@ -110,7 +110,7 @@ async def ext_method(self, method: str, params: dict[str, Any]) -> dict[str, Any **Evidence of partial schema support:** - `src/acp/schema/providers.py` — Defines `ProviderInfo`, `ProviderStatus` - `src/acp/schema/capabilities.py:272` — `providers: bool` capability flag -- `src/agentpool_server/acp_server/provider_router.py` — Full provider management logic +- `src/wolfharness_server/acp_server/provider_router.py` — Full provider management logic --- @@ -224,7 +224,7 @@ The spec defines `$/cancel_request` as a protocol-level method to cancel in-flig **Status:** Confirmed missing **Impact:** AgentPool cannot act as MCP proxy over ACP -The spec defines `mcp/connect`, `mcp/message`, `mcp/disconnect` for tunneling MCP through ACP. AgentPool has MCP server support (`src/agentpool/mcp_server/`) but no MCP-over-ACP bridge. +The spec defines `mcp/connect`, `mcp/message`, `mcp/disconnect` for tunneling MCP through ACP. AgentPool has MCP server support (`src/wolfharness/mcp_server/`) but no MCP-over-ACP bridge. **Evidence:** - `src/acp/schema/messages.py:22-35` — No `mcp/*` methods in `AgentMethod` @@ -420,26 +420,26 @@ This document was reviewed by an Oracle agent with full codebase access. Key cor Key files referenced in this analysis: **Schema Definitions:** -- `packages/agentpool/src/acp/schema/base.py` — Base models, `_meta` handling -- `packages/agentpool/src/acp/schema/messages.py` — `AgentMethod`, `ClientMethod` enums -- `packages/agentpool/src/acp/schema/client_requests.py` — All client→agent request types -- `packages/agentpool/src/acp/schema/agent_responses.py` — All agent→client response types -- `packages/agentpool/src/acp/schema/session_updates.py` — Session update notification types -- `packages/agentpool/src/acp/schema/tool_call.py` — Tool call types, `ToolCallLocation` -- `packages/agentpool/src/acp/schema/client_responses.py` — Client response types, terminal -- `packages/agentpool/src/acp/schema/elicitation.py` — Elicitation types -- `packages/agentpool/src/acp/schema/providers.py` — Provider types -- `packages/agentpool/src/acp/schema/capabilities.py` — Capability flags -- `packages/agentpool/src/acp/schema/notifications.py` — Notification types +- `packages/wolfharness/src/acp/schema/base.py` — Base models, `_meta` handling +- `packages/wolfharness/src/acp/schema/messages.py` — `AgentMethod`, `ClientMethod` enums +- `packages/wolfharness/src/acp/schema/client_requests.py` — All client→agent request types +- `packages/wolfharness/src/acp/schema/agent_responses.py` — All agent→client response types +- `packages/wolfharness/src/acp/schema/session_updates.py` — Session update notification types +- `packages/wolfharness/src/acp/schema/tool_call.py` — Tool call types, `ToolCallLocation` +- `packages/wolfharness/src/acp/schema/client_responses.py` — Client response types, terminal +- `packages/wolfharness/src/acp/schema/elicitation.py` — Elicitation types +- `packages/wolfharness/src/acp/schema/providers.py` — Provider types +- `packages/wolfharness/src/acp/schema/capabilities.py` — Capability flags +- `packages/wolfharness/src/acp/schema/notifications.py` — Notification types **Protocol Interfaces:** -- `packages/agentpool/src/acp/agent/protocol.py` — Agent-side protocol interface -- `packages/agentpool/src/acp/client/protocol.py` — Client-side protocol interface +- `packages/wolfharness/src/acp/agent/protocol.py` — Agent-side protocol interface +- `packages/wolfharness/src/acp/client/protocol.py` — Client-side protocol interface **Server Implementation:** -- `packages/agentpool/src/agentpool_server/acp_server/acp_agent.py` — ACP agent protocol implementation -- `packages/agentpool/src/agentpool_server/acp_server/provider_router.py` — Provider management -- `packages/agentpool/src/acp/bridge/bridge.py` — ACP bridge (stdio → HTTP) +- `packages/wolfharness/src/wolfharness_server/acp_server/acp_agent.py` — ACP agent protocol implementation +- `packages/wolfharness/src/wolfharness_server/acp_server/provider_router.py` — Provider management +- `packages/wolfharness/src/acp/bridge/bridge.py` — ACP bridge (stdio → HTTP) **ACP Spec Reference:** - `packages/agent-client-protocol/src/v1/` — Rust v1 stable types diff --git a/docs/records/bugs/BUG-001-run-stream-break-error.md b/docs/records/bugs/BUG-001-run-stream-break-error.md index 8ba21cb49..645f980d9 100644 --- a/docs/records/bugs/BUG-001-run-stream-break-error.md +++ b/docs/records/bugs/BUG-001-run-stream-break-error.md @@ -43,7 +43,7 @@ CancelledError: Cancelled via cancel scope ### Where the Bug Occurs -**File**: `/Users/yuchen.liu/src/yilab/iroot-llm/packages/agentpool/src/agentpool/agents/native_agent/agent.py` +**File**: `/Users/yuchen.liu/src/yilab/iroot-llm/packages/wolfharness/src/wolfharness/agents/native_agent/agent.py` **Lines**: 829-845 @@ -88,13 +88,13 @@ agent.run_stream() ### Test Script Location -`/Users/yuchen.liu/src/yilab/iroot-llm/packages/agentpool/tests/test_break_behavior.py` +`/Users/yuchen.liu/src/yilab/iroot-llm/packages/wolfharness/tests/test_break_behavior.py` ### Minimal Reproduction ```python import asyncio -from agentpool import Agent +from wolfharness import Agent from pydantic_ai.models.test import TestModel async def test_break(): @@ -165,7 +165,7 @@ But this loses the ability to interrupt mid-execution. ### Deep Dive Areas -1. **merge_queue_into_iterator** (`/Users/yuchen.liu/src/yilab/iroot-llm/packages/agentpool/src/agentpool/utils/streams.py`) +1. **merge_queue_into_iterator** (`/Users/yuchen.liu/src/yilab/iroot-llm/packages/wolfharness/src/wolfharness/utils/streams.py`) - How are tasks spawned? - How is cancellation propagated? - Can we make scope exit task-aware? @@ -186,10 +186,10 @@ But this loses the ability to interrupt mid-execution. | File | Lines | Purpose | |------|-------|---------| -| `agentpool/agents/native_agent/agent.py` | 808-895 | Native agent stream with GeneratorExit handling | -| `agentpool/agents/native_agent/agent.py` | 829-845 | merge_queue_into_iterator usage | -| `agentpool/utils/streams.py` | ~ | merge_queue_into_iterator implementation | -| `agentpool/agents/base_agent.py` | 566-648 | run_stream() top-level loop | +| `wolfharness/agents/native_agent/agent.py` | 808-895 | Native agent stream with GeneratorExit handling | +| `wolfharness/agents/native_agent/agent.py` | 829-845 | merge_queue_into_iterator usage | +| `wolfharness/utils/streams.py` | ~ | merge_queue_into_iterator implementation | +| `wolfharness/agents/base_agent.py` | 566-648 | run_stream() top-level loop | ### Key Code Segments @@ -263,12 +263,12 @@ The bug was fixed by isolating the entire `agentlet.iter()` iteration in a backg ### Changes Made -1. **`src/agentpool/utils/streams.py`**: Enhanced `merge_queue_into_iterator` with: +1. **`src/wolfharness/utils/streams.py`**: Enhanced `merge_queue_into_iterator` with: - `shutdown_event` for cooperative cancellation - `except GeneratorExit` handler to signal graceful shutdown - Task-aware cleanup that uses `asyncio.shield` to prevent CancelScope issues -2. **`src/agentpool/agents/native_agent/agent.py`**: Refactored `_stream_events()` to: +2. **`src/wolfharness/agents/native_agent/agent.py`**: Refactored `_stream_events()` to: - Run the entire `agentlet.iter()` iteration in a background task - Yield events via a queue from the consumer task - Properly signal cancellation and cleanup diff --git a/docs/reference/acp-meta-field-reference.md b/docs/reference/acp-meta-field-reference.md index ce8ad2d19..b6a112a6c 100644 --- a/docs/reference/acp-meta-field-reference.md +++ b/docs/reference/acp-meta-field-reference.md @@ -6,7 +6,7 @@ icon: material/file-document ## Overview -The Agent Client Protocol (ACP) includes a `_meta` field (called `field_meta` in agentpool's Python implementation) on all message types for extensibility. This field allows clients and agents to pass custom metadata that isn't part of the core protocol. +The Agent Client Protocol (ACP) includes a `_meta` field (called `field_meta` in wolfharness's Python implementation) on all message types for extensibility. This field allows clients and agents to pass custom metadata that isn't part of the core protocol. ## Protocol Specification diff --git a/docs/reference/api/agent.md b/docs/reference/api/agent.md index 27e82af5a..51ff520d3 100644 --- a/docs/reference/api/agent.md +++ b/docs/reference/api/agent.md @@ -4,4 +4,4 @@ icon: material/robot # Agent API Reference -::: agentpool.agents.native_agent.agent +::: wolfharness.agents.native_agent.agent diff --git a/docs/reference/api/agentpool.md b/docs/reference/api/agentpool.md index 73da4bfe4..f9f213f6b 100644 --- a/docs/reference/api/agentpool.md +++ b/docs/reference/api/agentpool.md @@ -4,4 +4,4 @@ icon: material/package # AgentPool API Reference -::: agentpool.delegation.pool.AgentPool +::: wolfharness.delegation.pool.AgentPool diff --git a/docs/reference/api/eventbus.md b/docs/reference/api/eventbus.md index 3515bc2b8..b4de2d483 100644 --- a/docs/reference/api/eventbus.md +++ b/docs/reference/api/eventbus.md @@ -6,8 +6,8 @@ icon: material/transit-connection-variant ## EventBus -::: agentpool.orchestrator.event_bus.EventBus +::: wolfharness.orchestrator.event_bus.EventBus ## SessionController -::: agentpool.orchestrator.session_controller.SessionController +::: wolfharness.orchestrator.session_controller.SessionController diff --git a/docs/reference/api/messagenode.md b/docs/reference/api/messagenode.md index 7df089db4..b0eaafe26 100644 --- a/docs/reference/api/messagenode.md +++ b/docs/reference/api/messagenode.md @@ -4,4 +4,4 @@ icon: material/message # MessageNode API Reference -::: agentpool.messaging.messagenode.MessageNode +::: wolfharness.messaging.messagenode.MessageNode diff --git a/docs/reference/cli/add.md b/docs/reference/cli/add.md index f34882526..983e6aed7 100644 --- a/docs/reference/cli/add.md +++ b/docs/reference/cli/add.md @@ -9,11 +9,11 @@ icon: material/plus Register a new agent configuration file. ```bash -agentpool add +wolfharness add ``` For a full list of options, run: ```bash -agentpool add --help +wolfharness add --help ``` diff --git a/docs/reference/cli/config.md b/docs/reference/cli/config.md index 2555c8a54..9f67a5bbb 100644 --- a/docs/reference/cli/config.md +++ b/docs/reference/cli/config.md @@ -10,9 +10,9 @@ The `config` command group helps you understand and manage AgentPool's layered c AgentPool automatically discovers and merges configuration from multiple sources: -1. **Global config** (`~/.config/agentpool/agentpool.yml`) +1. **Global config** (`~/.config/wolfharness/wolfharness.yml`) 2. **Custom config** (`AGENTPOOL_CONFIG` environment variable) -3. **Project config** (`agentpool.yml` in project/git root) +3. **Project config** (`wolfharness.yml` in project/git root) 4. **Explicit config** (CLI argument) These commands help you inspect which configs are being loaded and create new ones. @@ -23,13 +23,13 @@ The `config` command group includes the following commands: ```bash # Show current configuration -agentpool config show [config_path] +wolfharness config show [config_path] # Show config search paths -agentpool config paths +wolfharness config paths # Initialize a new configuration -agentpool config init [path] [--force] +wolfharness config init [path] [--force] ``` ### config show @@ -38,13 +38,13 @@ Display the current configuration, showing which config files are found and what ```bash # Show merged configuration -agentpool config show +wolfharness config show # Show with a specific explicit config -agentpool config show my-agents.yml +wolfharness config show my-agents.yml # Output as YAML -agentpool config show --format yaml +wolfharness config show --format yaml ``` ### config paths @@ -52,7 +52,7 @@ agentpool config show --format yaml Display the paths AgentPool searches for configuration files. ```bash -agentpool config paths +wolfharness config paths ``` ### config init @@ -61,16 +61,16 @@ Create a new configuration file. ```bash # Create a starter config in current project -agentpool config init +wolfharness config init # Create global config for user-wide preferences -agentpool config init global +wolfharness config init global # Create at a specific path -agentpool config init ./configs/my-agents.yml +wolfharness config init ./configs/my-agents.yml # Overwrite existing config -agentpool config init --force +wolfharness config init --force ``` ## Examples @@ -79,36 +79,36 @@ agentpool config init --force ```bash # Show which config files are found and what they contain -agentpool config show +wolfharness config show # Show with a specific explicit config included -agentpool config show my-agents.yml +wolfharness config show my-agents.yml # Output as YAML for scripting -agentpool config show --format yaml +wolfharness config show --format yaml ``` ### View Config Paths ```bash # Show where AgentPool looks for config files -agentpool config paths +wolfharness config paths ``` ### Create New Config ```bash # Create a starter config in current project -agentpool config init +wolfharness config init # Create a global config for user-wide preferences -agentpool config init global +wolfharness config init global # Create at a specific path -agentpool config init ./configs/my-agents.yml +wolfharness config init ./configs/my-agents.yml # Overwrite existing config -agentpool config init --force +wolfharness config init --force ``` ## Use Cases @@ -118,10 +118,10 @@ agentpool config init --force Create a global config to set preferences that apply to all projects: ```bash -agentpool config init global +wolfharness config init global ``` -Then edit `~/.config/agentpool/agentpool.yml`: +Then edit `~/.config/wolfharness/wolfharness.yml`: ```yaml # Global preferences @@ -135,7 +135,7 @@ model_variants: storage: provider: sql - database_url: sqlite:///~/.local/share/agentpool/history.db + database_url: sqlite:///~/.local/share/wolfharness/history.db ``` ### Project-Specific Agents @@ -143,10 +143,10 @@ storage: Create a project config that inherits global settings: ```bash -agentpool config init +wolfharness config init ``` -Then edit `./agentpool.yml`: +Then edit `./wolfharness.yml`: ```yaml agents: @@ -163,7 +163,7 @@ agents: If your agent isn't behaving as expected, check which configs are being loaded: ```bash -agentpool config show +wolfharness config show ``` This shows: diff --git a/docs/reference/cli/history.md b/docs/reference/cli/history.md index ba9aa9e19..dcbd209a9 100644 --- a/docs/reference/cli/history.md +++ b/docs/reference/cli/history.md @@ -9,11 +9,11 @@ icon: material/history View and analyze agent interaction history. ```bash -agentpool history stats --group-by model +wolfharness history stats --group-by model ``` For a full list of options, run: ```bash -agentpool history --help +wolfharness history --help ``` diff --git a/docs/reference/cli/index.md b/docs/reference/cli/index.md index 177d2b6b1..ec6ae2b87 100644 --- a/docs/reference/cli/index.md +++ b/docs/reference/cli/index.md @@ -14,9 +14,9 @@ This avoids the need to pass the config file path each time you want to run a co The CLI maintains an "active agent file" setting which determines which agents are available for commands like `run`, `task`, or `watch`. You can: -- Add agent files with `agentpool add ` -- Set the active file with `agentpool set ` -- List agents from the active config with `agentpool list` +- Add agent files with `wolfharness add ` +- Set the active file with `wolfharness set ` +- List agents from the active config with `wolfharness list` Most commands will use the currently active agent file by default, but can be overridden with the `--config` option. @@ -68,14 +68,14 @@ Most commands will use the currently active agent file by default, but can be ov ### Option 1: Automatic Config Discovery -AgentPool automatically discovers config files. Just create `agentpool.yml` in your project: +AgentPool automatically discovers config files. Just create `wolfharness.yml` in your project: ```bash # Create a starter config -agentpool config init +wolfharness config init # Edit the config, then run -agentpool run myagent "Hello" +wolfharness run myagent "Hello" ``` ### Option 2: Named Configurations @@ -85,20 +85,20 @@ For managing multiple config files: 1. Add and activate an agent configuration: ```bash - agentpool add myconfig agents.yml - agentpool set myconfig + wolfharness add myconfig agents.yml + wolfharness set myconfig ``` 2. List available agents: ```bash - agentpool list + wolfharness list ``` 3. Run a prompt with an agent: ```bash - agentpool run analyzer "Analyze this text" + wolfharness run analyzer "Analyze this text" ``` ## Command Examples @@ -107,61 +107,61 @@ For managing multiple config files: ```bash # Run a single agent with a prompt -agentpool run myagent "Analyze this" +wolfharness run myagent "Analyze this" # Run a team -agentpool run myteam "Process this" +wolfharness run myteam "Process this" # Show detailed output with costs -agentpool run myagent "Hello" --detail full --costs +wolfharness run myagent "Hello" --detail full --costs ``` ### Executing Tasks ```bash # Execute a defined task -agentpool task docs write_api_docs +wolfharness task docs write_api_docs # Execute with additional prompt -agentpool task docs write_api_docs --prompt "Include code examples" +wolfharness task docs write_api_docs --prompt "Include code examples" ``` ### Server Commands ```bash # ACP server for IDE integration (Zed, Toad) -agentpool serve-acp config.yml +wolfharness serve-acp config.yml # OpenCode server for OpenCode TUI/Desktop -agentpool serve-opencode config.yml --port 4096 +wolfharness serve-opencode config.yml --port 4096 # MCP server (stdio transport) -agentpool serve-mcp config.yml +wolfharness serve-mcp config.yml # MCP server with SSE transport -agentpool serve-mcp config.yml --transport sse --port 3001 +wolfharness serve-mcp config.yml --transport sse --port 3001 # AG-UI server -agentpool serve-agui config.yml --port 8002 +wolfharness serve-agui config.yml --port 8002 # OpenAI-compatible API server -agentpool serve-api config.yml --port 8000 +wolfharness serve-api config.yml --port 8000 ``` ### History Commands ```bash # Show last 5 conversations -agentpool history show -n 5 +wolfharness history show -n 5 # Show conversations from last 24 hours -agentpool history show --period 24h +wolfharness history show --period 24h # Show stats grouped by model -agentpool history stats --period 1w --group-by model +wolfharness history stats --period 1w --group-by model # Clear history for specific agent -agentpool history reset --agent myagent +wolfharness history reset --agent myagent ``` ## Global Options diff --git a/docs/reference/cli/list.md b/docs/reference/cli/list.md index 1d03a7946..e1ceb81ef 100644 --- a/docs/reference/cli/list.md +++ b/docs/reference/cli/list.md @@ -9,11 +9,11 @@ icon: material/format-list-bulleted Show available agents from the configuration. ```bash -agentpool list +wolfharness list ``` For a full list of options, run: ```bash -agentpool list --help +wolfharness list --help ``` diff --git a/docs/reference/cli/run.md b/docs/reference/cli/run.md index 180f68501..ffdb8289b 100644 --- a/docs/reference/cli/run.md +++ b/docs/reference/cli/run.md @@ -6,10 +6,10 @@ icon: material/play # run -Run a node with prompts using the `agentpool run` command. +Run a node with prompts using the `wolfharness run` command. ```bash -agentpool run "prompt text" +wolfharness run "prompt text" ``` The `run` command executes a single prompt against a configured agent. @@ -18,17 +18,17 @@ The `run` command executes a single prompt against a configured agent. ```bash # Simple run -agentpool run assistant "Hello!" +wolfharness run assistant "Hello!" # With streaming output -agentpool run assistant "Tell me a story" --stream +wolfharness run assistant "Tell me a story" --stream # With explicit config file -agentpool run assistant "Hello!" --config my-agents.yml +wolfharness run assistant "Hello!" --config my-agents.yml ``` For a full list of options, run: ```bash -agentpool run --help +wolfharness run --help ``` \ No newline at end of file diff --git a/docs/reference/cli/serve-acp.md b/docs/reference/cli/serve-acp.md index b1ab821d0..2a307235a 100644 --- a/docs/reference/cli/serve-acp.md +++ b/docs/reference/cli/serve-acp.md @@ -9,21 +9,21 @@ icon: material/server Start the Agent Communication Protocol (ACP) server to expose agents to ACP-compatible clients. ```bash -agentpool serve-acp config.yml +wolfharness serve-acp config.yml ``` For basic usage: ```bash # Start with default config -agentpool serve-acp agents.yml +wolfharness serve-acp agents.yml # Listen on specific host and port -agentpool serve-acp agents.yml --host 0.0.0.0 --port 8321 +wolfharness serve-acp agents.yml --host 0.0.0.0 --port 8321 ``` For a full list of options, run: ```bash -agentpool serve-acp --help +wolfharness serve-acp --help ``` diff --git a/docs/reference/cli/serve-agui.md b/docs/reference/cli/serve-agui.md index daee1f82d..27a4b36d3 100644 --- a/docs/reference/cli/serve-agui.md +++ b/docs/reference/cli/serve-agui.md @@ -9,11 +9,11 @@ icon: material/monitor Start the AG-UI protocol server to expose agents to AG-UI compatible frontends. ```bash -agentpool serve-agui config.yml +wolfharness serve-agui config.yml ``` For a full list of options, run: ```bash -agentpool serve-agui --help +wolfharness serve-agui --help ``` diff --git a/docs/reference/cli/serve-api.md b/docs/reference/cli/serve-api.md index 8688a59ba..63a5a0ebd 100644 --- a/docs/reference/cli/serve-api.md +++ b/docs/reference/cli/serve-api.md @@ -9,11 +9,11 @@ icon: material/api Start an OpenAI-compatible API server that exposes agents through a drop-in OpenAI API replacement. ```bash -agentpool serve-api config.yml +wolfharness serve-api config.yml ``` For a full list of options, run: ```bash -agentpool serve-api --help +wolfharness serve-api --help ``` diff --git a/docs/reference/cli/serve-mcp.md b/docs/reference/cli/serve-mcp.md index dbb8c7228..09f5d0d51 100644 --- a/docs/reference/cli/serve-mcp.md +++ b/docs/reference/cli/serve-mcp.md @@ -9,11 +9,11 @@ icon: material/tools Start the MCP (Model Context Protocol) server to expose agent tools to other MCP-compatible clients. ```bash -agentpool serve-mcp config.yml +wolfharness serve-mcp config.yml ``` For a full list of options, run: ```bash -agentpool serve-mcp --help +wolfharness serve-mcp --help ``` diff --git a/docs/reference/cli/serve-opencode.md b/docs/reference/cli/serve-opencode.md index 082271e81..34a9b7022 100644 --- a/docs/reference/cli/serve-opencode.md +++ b/docs/reference/cli/serve-opencode.md @@ -9,11 +9,11 @@ icon: material/code-braces Start the OpenCode server to expose agents to the OpenCode TUI/Desktop interface. ```bash -agentpool serve-opencode config.yml +wolfharness serve-opencode config.yml ``` For a full list of options, run: ```bash -agentpool serve-opencode --help +wolfharness serve-opencode --help ``` diff --git a/docs/reference/cli/set.md b/docs/reference/cli/set.md index 4c23d99d7..a51ca2695 100644 --- a/docs/reference/cli/set.md +++ b/docs/reference/cli/set.md @@ -9,11 +9,11 @@ icon: material/file-cog Set the active configuration file. ```bash -agentpool set +wolfharness set ``` For a full list of options, run: ```bash -agentpool set --help +wolfharness set --help ``` diff --git a/docs/reference/cli/task.md b/docs/reference/cli/task.md index f4646413b..ba9d9b669 100644 --- a/docs/reference/cli/task.md +++ b/docs/reference/cli/task.md @@ -9,11 +9,11 @@ icon: material/clipboard-check Execute a defined task from the configuration. ```bash -agentpool task +wolfharness task ``` For a full list of options, run: ```bash -agentpool task --help +wolfharness task --help ``` diff --git a/docs/reference/cli/watch.md b/docs/reference/cli/watch.md index 8841db93a..993231345 100644 --- a/docs/reference/cli/watch.md +++ b/docs/reference/cli/watch.md @@ -9,11 +9,11 @@ icon: material/eye Watch for triggers and react automatically based on configured event sources. ```bash -agentpool watch --config agents.yml +wolfharness watch --config agents.yml ``` For a full list of options, run: ```bash -agentpool watch --help +wolfharness watch --help ``` diff --git a/docs/reference/core-concepts/agent-pool.md b/docs/reference/core-concepts/agent-pool.md index 07c1894a3..ee7899dfa 100644 --- a/docs/reference/core-concepts/agent-pool.md +++ b/docs/reference/core-concepts/agent-pool.md @@ -35,7 +35,7 @@ agents: ``` ```python -from agentpool import AgentPool +from wolfharness import AgentPool from myapp.config import AppConfig # Your dependency type async def main(): diff --git a/docs/reference/core-concepts/basic-agent.md b/docs/reference/core-concepts/basic-agent.md index 950222c0b..d43e6d68a 100644 --- a/docs/reference/core-concepts/basic-agent.md +++ b/docs/reference/core-concepts/basic-agent.md @@ -80,7 +80,7 @@ await agent.run_in_background(get_prompt) ## Agents with output types ```python -from agentpool import Agent +from wolfharness import Agent from pydantic import BaseModel class AnalysisResult(BaseModel): diff --git a/docs/reference/core-concepts/events.md b/docs/reference/core-concepts/events.md index 42f9f6a2a..6df091ceb 100644 --- a/docs/reference/core-concepts/events.md +++ b/docs/reference/core-concepts/events.md @@ -179,10 +179,10 @@ Run agents in event-watching mode to handle events: ```bash # Start watching with default configuration -agentpool watch agents.yml +wolfharness watch agents.yml # With specific log level -agentpool watch agents.yml --log-level DEBUG +wolfharness watch agents.yml --log-level DEBUG ``` The agents will: diff --git a/docs/reference/core-concepts/mcp.md b/docs/reference/core-concepts/mcp.md index 040844aac..7d28f6e5e 100644 --- a/docs/reference/core-concepts/mcp.md +++ b/docs/reference/core-concepts/mcp.md @@ -38,7 +38,7 @@ agents: ### In Agent Constructor ```python -from agentpool import Agent, StdioMCPServerConfig +from wolfharness import Agent, StdioMCPServerConfig # Create agent with MCP servers agent = Agent( diff --git a/docs/reference/js/run_code_config.js b/docs/reference/js/run_code_config.js index a194b3f83..9df840bc2 100644 --- a/docs/reference/js/run_code_config.js +++ b/docs/reference/js/run_code_config.js @@ -1 +1 @@ -window.mkdocs_run_deps = ["agentpool"]; +window.mkdocs_run_deps = ["wolfharness"]; diff --git a/docs/rfcs/RFC-0034-background-task-redesign.md b/docs/rfcs/RFC-0034-background-task-redesign.md index 5bd490346..30ff03ff2 100644 --- a/docs/rfcs/RFC-0034-background-task-redesign.md +++ b/docs/rfcs/RFC-0034-background-task-redesign.md @@ -44,7 +44,7 @@ related_rfcs: ### 1.1 Summary -This RFC proposes a fundamental redesign of the BackgroundTask system, migrating it from the xeno-agent business layer into agentpool as a first-class core infrastructure, while preserving xeno-agent-specific provider customizations. The redesign replaces the legacy string-based task ID API with a structured `TaskHandle` object pattern aligned with MCP SEP-1686, introduces configurable session-end lifecycle policies, and hard-cuts over from the old API without a compatibility layer. +This RFC proposes a fundamental redesign of the BackgroundTask system, migrating it from the xeno-agent business layer into wolfharness as a first-class core infrastructure, while preserving xeno-agent-specific provider customizations. The redesign replaces the legacy string-based task ID API with a structured `TaskHandle` object pattern aligned with MCP SEP-1686, introduces configurable session-end lifecycle policies, and hard-cuts over from the old API without a compatibility layer. ### 1.2 Why This Matters Now @@ -53,14 +53,14 @@ The current BackgroundTask implementation lives entirely in `xeno-agent` and suf 1. **Fire-and-forget bug**: The `_notify_parent` callback uses `asyncio.create_task()` without `cancel_and_drain`, causing exceptions to be silently discarded when the parent session has ended. 2. **`parent_session_id` empty string bug**: Prevents auto-resume of background task completion notifications. 3. **String ID API**: The legacy API returns raw strings (`task_id`) with no structured handle, making it impossible to chain operations or attach metadata. -4. **No upstream standard**: Each downstream project reinvents background task patterns; agentpool lacks a unified abstraction. +4. **No upstream standard**: Each downstream project reinvents background task patterns; wolfharness lacks a unified abstraction. These issues block reliable multi-agent delegation workflows and create support burden. ### 1.3 Expected Outcome After implementation: -- **Unified infrastructure**: `BackgroundTaskManager` and `TaskHandle` are core agentpool primitives. +- **Unified infrastructure**: `BackgroundTaskManager` and `TaskHandle` are core wolfharness primitives. - **Structured API**: All background task operations return `TaskHandle` objects with typed methods (`status`, `result()`, `cancel()`). - **Session lifecycle integration**: Configurable `session_end_policy` controls what happens to background tasks when their parent session ends. - **SEP-1686 alignment**: API surface is compatible with MCP task semantics, enabling future protocol-native task support. @@ -78,7 +78,7 @@ The BackgroundTask system currently consists of three layers: |-------|----------|---------------| | **Core types** | `xeno_agent/task/types.py` | `BackgroundTask` dataclass, `TaskHandle` dataclass, `TaskStatus` literal | | **Lifecycle manager** | `xeno_agent/task/manager.py` | `BackgroundTaskManager` — semaphore, timeout, cancellation, cleanup | -| **Provider integration** | `xeno_agent/agentpool/resource_providers/background_task_provider.py` | Tool definitions (`task`, `background_output`, `background_cancel`) | +| **Provider integration** | `xeno_agent/wolfharness/resource_providers/background_task_provider.py` | Tool definitions (`task`, `background_output`, `background_cancel`) | The existing `BackgroundTaskProvider` exposes three tools: @@ -104,7 +104,7 @@ Key problems with this design: ### 2.2 Historical Context -The BackgroundTask system was initially designed as a xeno-agent-specific augmentation to agentpool's `subagent_tools.py`. The original RFC (RFC-0001-v2) explicitly stated: "xeno-agent layer优先:先在业务层验证,成熟后考虑 upstream 到 agentpool." After 3 months of production validation with 130+ tests, the pattern has proven stable enough to upstream. +The BackgroundTask system was initially designed as a xeno-agent-specific augmentation to wolfharness's `subagent_tools.py`. The original RFC (RFC-0001-v2) explicitly stated: "xeno-agent layer优先:先在业务层验证,成熟后考虑 upstream 到 wolfharness." After 3 months of production validation with 130+ tests, the pattern has proven stable enough to upstream. ### 2.3 Glossary @@ -113,7 +113,7 @@ The BackgroundTask system was initially designed as a xeno-agent-specific augmen | **BackgroundTask** | Serializable dataclass representing a task's metadata and lifecycle state | | **TaskHandle** | Runtime object wrapping an `asyncio.Task` with structured query/cancel methods | | **TaskStatus** | Literal union: `pending`, `running`, `cancelling`, `completed`, `error`, `cancelled`, `timed_out` | -| **SessionPool** | agentpool's session orchestration layer (`SessionPool` + `SessionController`) | +| **SessionPool** | wolfharness's session orchestration layer (`SessionPool` + `SessionController`) | | **session_end_policy** | Configuration controlling background task behavior on parent session end | | **SEP-1686** | MCP Specification Enhancement Proposal for asynchronous task tools | | **fire-and-forget** | Pattern of spawning async work without awaiting or cleanup; explicitly avoided | @@ -123,7 +123,7 @@ The BackgroundTask system was initially designed as a xeno-agent-specific augmen - **RFC-0021**: Introduced `AgentRunContext` for per-call state isolation; BackgroundTask redesign must respect per-run context boundaries. - **RFC-0026**: Per-session agent isolation ensures background tasks do not share `MessageHistory` across concurrent subagents. -- **RFC-0001 (agentpool)**: Workers and Teams session management establishes `SpawnSessionStart` patterns that background tasks must emit consistently. +- **RFC-0001 (wolfharness)**: Workers and Teams session management establishes `SpawnSessionStart` patterns that background tasks must emit consistently. --- @@ -137,7 +137,7 @@ The BackgroundTask system was initially designed as a xeno-agent-specific augmen 3. **Empty `parent_session_id`**: Line 379 of `background_task_provider.py` falls back to `getattr(ctx.node, 'session_id', '')` — an empty string prevents `SessionPool.inject_prompt()` from routing the notification correctly. -4. **No upstream abstraction**: Every downstream project that wants background tasks must copy xeno-agent's implementation. There is no agentpool-native primitive. +4. **No upstream abstraction**: Every downstream project that wants background tasks must copy xeno-agent's implementation. There is no wolfharness-native primitive. 5. **String-based API**: Returning raw string IDs makes it impossible for the LLM to introspect task state without making another tool call. @@ -163,7 +163,7 @@ The BackgroundTask system was initially designed as a xeno-agent-specific augmen ### 4.1 Goals (In Scope) -1. **Upstream core infrastructure**: `BackgroundTaskManager`, `TaskHandle`, and `TaskStatus` become agentpool core primitives. +1. **Upstream core infrastructure**: `BackgroundTaskManager`, `TaskHandle`, and `TaskStatus` become wolfharness core primitives. 2. **Structured API**: Replace string-ID returns with `TaskHandle` objects exposing `.status`, `.result()`, `.cancel()`. 3. **Session lifecycle integration**: Introduce `session_end_policy` with `cancel`, `keep`, and `notify` strategies. 4. **SEP-1686 alignment**: API signatures and semantics match MCP task tool patterns. @@ -174,16 +174,16 @@ The BackgroundTask system was initially designed as a xeno-agent-specific augmen 1. **Not**: Implementing MCP server-side task support (SEP-1686 server changes are a separate effort). 2. **Not**: Persistent task storage across process restarts. -3. **Not**: Distributed task execution across multiple agentpool instances. +3. **Not**: Distributed task execution across multiple wolfharness instances. 4. **Not**: Changing the underlying LLM provider concurrency model. 5. **Not**: Adding new event types beyond what already exists (`SpawnSessionStart`, `SubAgentEvent`, `StreamCompleteEvent`). ### 4.3 Success Criteria -- [ ] `TaskHandle` is importable from `agentpool.tasks`. -- [ ] `BackgroundTaskManager` is importable from `agentpool.tasks`. +- [ ] `TaskHandle` is importable from `wolfharness.tasks`. +- [ ] `BackgroundTaskManager` is importable from `wolfharness.tasks`. - [ ] `session_end_policy` is configurable per `AgentPool` or per session. -- [ ] xeno-agent's `BackgroundTaskProvider` delegates to agentpool core. +- [ ] xeno-agent's `BackgroundTaskProvider` delegates to wolfharness core. - [ ] All 124 xeno-agent background task tests pass with new API. - [ ] No `asyncio.create_task()` without matching `cancel_and_drain` pattern. - [ ] Pydantic-AI `cancel_and_drain` is used in all cleanup paths. @@ -209,15 +209,15 @@ This section documents the four confirmed design decisions that govern the archi ### Q1: Where does the BackgroundTask infrastructure live? -**Decision: C — Hybrid approach: agentpool core infrastructure + xeno-agent specific Provider** +**Decision: C — Hybrid approach: wolfharness core infrastructure + xeno-agent specific Provider** **Rationale**: -The core lifecycle manager (`BackgroundTaskManager`), types (`TaskHandle`, `BackgroundTask`), and session integration belong in agentpool so all downstream projects benefit. However, the specific tool schemas, prompt formatting, and xeno-agent-specific behaviors (e.g., `load_skills` injection, XML prompt formatting) remain in xeno-agent's `BackgroundTaskProvider`. +The core lifecycle manager (`BackgroundTaskManager`), types (`TaskHandle`, `BackgroundTask`), and session integration belong in wolfharness so all downstream projects benefit. However, the specific tool schemas, prompt formatting, and xeno-agent-specific behaviors (e.g., `load_skills` injection, XML prompt formatting) remain in xeno-agent's `BackgroundTaskProvider`. **Scope split**: -| Component | agentpool (core) | xeno-agent (provider) | +| Component | wolfharness (core) | xeno-agent (provider) | |-----------|-----------------|----------------------| | `TaskHandle` | ✅ | ❌ | | `BackgroundTask` dataclass | ✅ | ❌ | @@ -233,8 +233,8 @@ The core lifecycle manager (`BackgroundTaskManager`), types (`TaskHandle`, `Back **Trade-offs**: - **Pro**: Downstream projects (xeno-rag, xeno-serve) can reuse core infrastructure. -- **Pro**: agentpool can integrate background tasks with `SessionPool` natively. -- **Con**: Slightly more complex import graph; xeno-agent depends on agentpool tasks. +- **Pro**: wolfharness can integrate background tasks with `SessionPool` natively. +- **Con**: Slightly more complex import graph; xeno-agent depends on wolfharness tasks. - **Con**: Core changes require coordinated releases. ### Q2: What is the API pattern for task handles? @@ -255,7 +255,7 @@ status = await background_output(task_id="bg_abc123", block=False) **New API** (SEP-1686 style): ```python -from agentpool.tasks import TaskHandle +from wolfharness.tasks import TaskHandle # Returns a structured handle handle: TaskHandle = await run_background_task(agent_mode="expert", prompt="analyze") @@ -292,7 +292,7 @@ await handle.cancel() **Rationale**: -A single hardcoded behavior cannot satisfy all use cases. Industrial diagnostics (`xeno-agent`) often needs `notify` so the fault expert receives completion prompts. Batch processing jobs need `keep`. Default agentpool behavior should be `cancel` for safety. +A single hardcoded behavior cannot satisfy all use cases. Industrial diagnostics (`xeno-agent`) often needs `notify` so the fault expert receives completion prompts. Batch processing jobs need `keep`. Default wolfharness behavior should be `cancel` for safety. **Implementation hook**: @@ -327,7 +327,7 @@ for task in task_manager.get_tasks_by_session(session_id): **Migration scope**: - `xeno-agent` tests: 124 test cases updated. -- `xeno-agent` provider: `BackgroundTaskProvider` rewritten to delegate to agentpool core. +- `xeno-agent` provider: `BackgroundTaskProvider` rewritten to delegate to wolfharness core. - `diag-agent.yaml`: Tool schema references updated. **Trade-offs**: @@ -376,10 +376,10 @@ for task in task_manager.get_tasks_by_session(session_id): ### 7.2 Component Design -#### 7.2.1 `agentpool.tasks` Module (New) +#### 7.2.1 `wolfharness.tasks` Module (New) ```python -# agentpool/tasks/__init__.py +# wolfharness/tasks/__init__.py from __future__ import annotations from dataclasses import dataclass, field @@ -458,10 +458,10 @@ class TaskHandle: ... ``` -#### 7.2.2 `BackgroundTaskManager` (agentpool core) +#### 7.2.2 `BackgroundTaskManager` (wolfharness core) ```python -# agentpool/tasks/manager.py +# wolfharness/tasks/manager.py from __future__ import annotations import asyncio @@ -476,7 +476,7 @@ from .types import BackgroundTask, TaskHandle, TaskStatus, TERMINAL_STATES class BackgroundTaskManager: """Manages background task lifecycle, concurrency, timeout, and cleanup. - This is the agentpool-core equivalent of xeno-agent's + This is the wolfharness-core equivalent of xeno-agent's ``BackgroundTaskManager``, with these key differences: 1. Uses ``cancel_and_drain`` from pydantic-ai for all cleanup paths. @@ -576,10 +576,10 @@ def create_task(..., parent_session_id: str | None = None, ...) -> TaskHandle: ## 8. API Design -### 8.1 agentpool Core API +### 8.1 wolfharness Core API ```python -# agentpool/tasks/__init__.py +# wolfharness/tasks/__init__.py from dataclasses import dataclass from datetime import datetime @@ -644,7 +644,7 @@ class BackgroundTaskManager: ### 8.2 xeno-agent Provider API (New Tools) ```python -# xeno_agent/agentpool/resource_providers/background_task_provider.py +# xeno_agent/wolfharness/resource_providers/background_task_provider.py async def run_background_task( ctx: AgentContext, @@ -704,7 +704,7 @@ agents: session_end_policy: notify # cancel | keep | notify tools: - type: custom - import_path: xeno_agent.agentpool.resource_providers.background_task_provider.XenoBackgroundTaskProvider + import_path: xeno_agent.wolfharness.resource_providers.background_task_provider.XenoBackgroundTaskProvider enabled_tools: - run_background_task - task_status @@ -721,9 +721,9 @@ agents: The `SessionController.close_session()` method is the hook point for policy enforcement: ```python -# agentpool/sessions/controller.py +# wolfharness/sessions/controller.py -from agentpool.tasks import BackgroundTaskManager +from wolfharness.tasks import BackgroundTaskManager class SessionController: def __init__(self, ..., task_manager: BackgroundTaskManager): @@ -859,9 +859,9 @@ status = handle.status # Query current status await handle.cancel() # Request cancellation ``` -### 11.2 agentpool-to-SEP-1686 Mapping +### 11.2 wolfharness-to-SEP-1686 Mapping -| SEP-1686 Concept | agentpool Equivalent | Notes | +| SEP-1686 Concept | wolfharness Equivalent | Notes | |-----------------|----------------------|-------| | `@tool(task=True)` | `run_background_task()` tool | Explicit tool, not decorator | | `TaskHandle.result()` | `TaskHandle.result()` | Direct equivalent | @@ -871,11 +871,11 @@ await handle.cancel() # Request cancellation ### 11.3 Future MCP Server Integration -When agentpool implements an MCP server with SEP-1686 support: +When wolfharness implements an MCP server with SEP-1686 support: ```python -# Future: agentpool MCP server -from agentpool.tasks import BackgroundTaskManager +# Future: wolfharness MCP server +from wolfharness.tasks import BackgroundTaskManager class AgentPoolMCPServer: def __init__(self, task_manager: BackgroundTaskManager): @@ -913,8 +913,8 @@ The following test files in `xeno-agent` must be updated: ### 12.2 Migration Checklist -- [ ] **Phase 0**: Create agentpool `tasks` module with `TaskHandle`, `BackgroundTask`, `BackgroundTaskManager`. -- [ ] **Phase 0**: Port `BackgroundTaskManager` from xeno-agent to agentpool, adding `cancel_and_drain` compliance. +- [ ] **Phase 0**: Create wolfharness `tasks` module with `TaskHandle`, `BackgroundTask`, `BackgroundTaskManager`. +- [ ] **Phase 0**: Port `BackgroundTaskManager` from xeno-agent to wolfharness, adding `cancel_and_drain` compliance. - [ ] **Phase 1**: Add `session_end_policy` to `SessionConfig` and enforcement in `SessionController`. - [ ] **Phase 2**: Rewrite xeno-agent `BackgroundTaskProvider`: - [ ] Replace `task()` with `run_background_task()` returning `TaskHandle`. @@ -946,20 +946,20 @@ The following test files in `xeno-agent` must be updated: ## 13. Implementation Plan -### Phase 0: agentpool Core (Week 1) +### Phase 0: wolfharness Core (Week 1) **Deliverables**: -- `agentpool/tasks/types.py` — `TaskStatus`, `BackgroundTask`, `TaskHandle` -- `agentpool/tasks/manager.py` — `BackgroundTaskManager` with `cancel_and_drain` -- `agentpool/tasks/__init__.py` — Public exports +- `wolfharness/tasks/types.py` — `TaskStatus`, `BackgroundTask`, `TaskHandle` +- `wolfharness/tasks/manager.py` — `BackgroundTaskManager` with `cancel_and_drain` +- `wolfharness/tasks/__init__.py` — Public exports - Unit tests for core manager (semaphore, timeout, cancellation, cleanup) **Files Modified**: -- `src/agentpool/tasks/` (new directory) -- `src/agentpool/sessions/controller.py` (session_end_policy hook) -- `src/agentpool/sessions/config.py` (session_end_policy field) +- `src/wolfharness/tasks/` (new directory) +- `src/wolfharness/sessions/controller.py` (session_end_policy hook) +- `src/wolfharness/sessions/config.py` (session_end_policy field) -**Rollback**: Delete `src/agentpool/tasks/` directory. +**Rollback**: Delete `src/wolfharness/tasks/` directory. ### Phase 1: Session Integration (Week 1-2) @@ -969,9 +969,9 @@ The following test files in `xeno-agent` must be updated: - `BackgroundTaskManager` session association methods **Files Modified**: -- `src/agentpool/sessions/config.py` -- `src/agentpool/sessions/controller.py` -- `src/agentpool/tasks/manager.py` +- `src/wolfharness/sessions/config.py` +- `src/wolfharness/sessions/controller.py` +- `src/wolfharness/tasks/manager.py` **Rollback**: Revert session controller changes. @@ -983,7 +983,7 @@ The following test files in `xeno-agent` must be updated: - Empty string `parent_session_id` fix **Files Modified**: -- `src/xeno_agent/agentpool/resource_providers/background_task_provider.py` +- `src/xeno_agent/wolfharness/resource_providers/background_task_provider.py` **Rollback**: Restore from git. @@ -995,14 +995,14 @@ The following test files in `xeno-agent` must be updated: - New tests for `TaskHandle` methods **Files Modified**: -- `tests/agentpool/resource_providers/test_background_task_*.py` +- `tests/wolfharness/resource_providers/test_background_task_*.py` **Rollback**: Restore from git. ### Dependencies -- agentpool Phase 0 must complete before xeno-agent Phase 2. -- agentpool Phase 1 must complete before xeno-agent test additions for `session_end_policy`. +- wolfharness Phase 0 must complete before xeno-agent Phase 2. +- wolfharness Phase 1 must complete before xeno-agent test additions for `session_end_policy`. --- @@ -1028,7 +1028,7 @@ The following test files in `xeno-agent` must be updated: - Owner: Performance - Status: Open -5. **Should agentpool expose a `@background_task` decorator for tool functions?** +5. **Should wolfharness expose a `@background_task` decorator for tool functions?** - Context: Would allow declarative background task registration. - Owner: API design - Status: Open @@ -1054,7 +1054,7 @@ The following test files in `xeno-agent` must be updated: ### Key Discussion Points -1. **Why not Option A (all in agentpool)?** Would force xeno-agent's XML formatting and skill-loading into core, creating inappropriate coupling. +1. **Why not Option A (all in wolfharness)?** Would force xeno-agent's XML formatting and skill-loading into core, creating inappropriate coupling. 2. **Why not Option B (all in xeno-agent)?** Defeats the purpose of upstreaming proven infrastructure. 3. **Why not keep string IDs?** String parsing is error-prone and incompatible with MCP SEP-1686. 4. **Why not a compatibility layer?** Doubles maintenance burden for a single-consumer API. @@ -1062,11 +1062,11 @@ The following test files in `xeno-agent` must be updated: ### Conditions on Approval - [ ] At least 2 code reviewers approve -- [ ] agentpool core tests demonstrate 100% manager coverage +- [ ] wolfharness core tests demonstrate 100% manager coverage - [ ] All 124 xeno-agent tests pass with new API - [ ] Session-end policy tests cover all 3 variants - [ ] No `asyncio.create_task()` without matching cleanup in changed code -- [ ] Documentation updated (agentpool tasks module, xeno-agent migration guide) +- [ ] Documentation updated (wolfharness tasks module, xeno-agent migration guide) --- @@ -1077,11 +1077,11 @@ The following test files in `xeno-agent` must be updated: 1. **RFC-0001-v2 (xeno-agent)** — Original background task RFC Location: `packages/xeno-agent/docs/rfcs/RFC-0001-async-task-background-task-v2.md` -2. **RFC-0021 (agentpool)** — Agent Concurrent Execution Safety - Location: `packages/agentpool/docs/rfcs/implemented/RFC-0021-agent-concurrent-execution-safety.md` +2. **RFC-0021 (wolfharness)** — Agent Concurrent Execution Safety + Location: `packages/wolfharness/docs/rfcs/implemented/RFC-0021-agent-concurrent-execution-safety.md` 3. **BackgroundTaskProvider Implementation** - Location: `packages/xeno-agent/src/xeno_agent/agentpool/resource_providers/background_task_provider.py` + Location: `packages/xeno-agent/src/xeno_agent/wolfharness/resource_providers/background_task_provider.py` 4. **Research Findings** Location: `.omo/notepads/background-task-provider/learnings.md` @@ -1101,10 +1101,10 @@ The following test files in `xeno-agent` must be updated: |-----------|------| | xeno-agent BackgroundTaskManager | `packages/xeno-agent/src/xeno_agent/task/manager.py` | | xeno-agent BackgroundTask types | `packages/xeno-agent/src/xeno_agent/task/types.py` | -| xeno-agent BackgroundTaskProvider | `packages/xeno-agent/src/xeno_agent/agentpool/resource_providers/background_task_provider.py` | +| xeno-agent BackgroundTaskProvider | `packages/xeno-agent/src/xeno_agent/wolfharness/resource_providers/background_task_provider.py` | | Pydantic-AI cancel_and_drain | `packages/pydantic-ai/pydantic_ai_slim/pydantic_ai/_utils.py:223-240` | -| AgentPool SessionController | `packages/agentpool/src/agentpool/sessions/controller.py` | -| AgentPool SessionConfig | `packages/agentpool/src/agentpool/sessions/config.py` | +| AgentPool SessionController | `packages/wolfharness/src/wolfharness/sessions/controller.py` | +| AgentPool SessionConfig | `packages/wolfharness/src/wolfharness/sessions/config.py` | --- diff --git a/docs/rfcs/accepted/RFC-0001-unified-run-tracking.md b/docs/rfcs/accepted/RFC-0001-unified-run-tracking.md index 6115b94fc..c31f28c74 100644 --- a/docs/rfcs/accepted/RFC-0001-unified-run-tracking.md +++ b/docs/rfcs/accepted/RFC-0001-unified-run-tracking.md @@ -21,7 +21,7 @@ The proposal introduces `RunHandle` as a first-class ephemeral runtime object tr ### Current Architecture -AgentPool's session orchestration lives in `src/agentpool/orchestrator/core.py`, combining `SessionController` (session CRUD) and `TurnRunner` (turn execution + manual queue management). Key components: +AgentPool's session orchestration lives in `src/wolfharness/orchestrator/core.py`, combining `SessionController` (session CRUD) and `TurnRunner` (turn execution + manual queue management). Key components: - **`SessionState`**: Long-lived session metadata holding `turn_lock` (asyncio.Lock) and `active_run_ctx` (manually-synchronized pointer to `AgentRunContext`) - **`AgentRunContext`**: Ephemeral per-run container with `injection_manager` (`PromptInjectionManager`) diff --git a/docs/rfcs/accepted/RFC-0022-opencode-v144-global-event-protocol.md b/docs/rfcs/accepted/RFC-0022-opencode-v144-global-event-protocol.md index e9c019356..e6254bb84 100644 --- a/docs/rfcs/accepted/RFC-0022-opencode-v144-global-event-protocol.md +++ b/docs/rfcs/accepted/RFC-0022-opencode-v144-global-event-protocol.md @@ -19,7 +19,7 @@ related_rfcs: OpenCode v1.4.4 introduced a breaking change to the SSE event protocol. The TUI now subscribes to `/global/event` (instead of `/event`) and expects events in a new `GlobalEvent` envelope format with `directory` routing field. Without this field, the TUI cannot route events to the correct project context and silently drops all SSE events, resulting in a completely non-functional UI despite the server processing messages successfully. -This RFC proposes updating agentpool's `/global/event` SSE output to conform to the new `GlobalEvent` protocol, ensuring compatibility with OpenCode v1.4.4+ while maintaining backward compatibility with v1.4.3 clients via the unchanged `/event` endpoint. +This RFC proposes updating wolfharness's `/global/event` SSE output to conform to the new `GlobalEvent` protocol, ensuring compatibility with OpenCode v1.4.4+ while maintaining backward compatibility with v1.4.3 clients via the unchanged `/event` endpoint. > **Review Status**: This RFC has been reviewed by Oracle and Metis against the actual OpenCode v1.4.4 source at `~/src/opencode`. Key corrections applied: (1) `directory` must use `working_dir` not `base_path` to match the `/path` endpoint, (2) `workspace` field is optional in the SDK and should be omitted for single-directory servers, (3) `server.connected`/`server.heartbeat` must NOT be wrapped in GlobalEvent, (4) SyncEvent support is unnecessary for basic TUI functionality. @@ -118,8 +118,8 @@ AgentPool's `/global/event` endpoint produces events that lack the `directory` r ### Impact of Inaction -- **Critical**: All users on OpenCode v1.4.4+ cannot use agentpool's `serve-opencode` at all -- **Blocking**: agentpool is effectively incompatible with the current OpenCode release +- **Critical**: All users on OpenCode v1.4.4+ cannot use wolfharness's `serve-opencode` at all +- **Blocking**: wolfharness is effectively incompatible with the current OpenCode release - **Risk**: As OpenCode auto-updates, the user base on v1.4.4+ will only grow - **No workaround**: Pinning to v1.4.3 is not sustainable (security updates, bug fixes) @@ -140,7 +140,7 @@ AgentPool's `/global/event` endpoint produces events that lack the `directory` r 1. Rewriting the entire event system — only the serialization layer changes 2. Supporting the OpenCode Desktop app (`packages/app`) — uses same protocol but different SDK entry point -3. Adding workspace-level isolation (multi-workspace) — agentpool serves a single directory; `workspace` field omitted +3. Adding workspace-level isolation (multi-workspace) — wolfharness serves a single directory; `workspace` field omitted 4. Protocol versioning or negotiation — not needed for this change 5. Changing the `/event` endpoint behavior (backward compat preserved by default) 6. SyncEvent emission — TUI discards sync events in `useEvent()`; not needed for basic TUI functionality @@ -186,7 +186,7 @@ Add `directory`, `project`, and `workspace` fields directly in the `_serialize_e - `_serialize_event()` gains awareness of server state (currently pure function) - `project_id` computation happens on every event (though lightweight) -- `workspace` field is intentionally omitted — agentpool doesn't have a workspace concept +- `workspace` field is intentionally omitted — wolfharness doesn't have a workspace concept **Evaluation Against Criteria** @@ -208,7 +208,7 @@ Add `directory`, `project`, and `workspace` fields directly in the `_serialize_e | Risk | Likelihood | Impact | Mitigation | |------|------------|--------|------------| -| `workspace` field semantics unclear | Medium | Low | Omit `workspace` entirely; document that agentpool doesn't support workspaces | +| `workspace` field semantics unclear | Medium | Low | Omit `workspace` entirely; document that wolfharness doesn't support workspaces | | OpenCode changes protocol again | Low | Medium | Centralized serialization makes updates easy | --- @@ -434,7 +434,7 @@ class GlobalEventFactory: # symlinked paths won't match and events get dropped. self._directory = state.working_dir self._project = helpers.compute_project_id(state.working_dir) - # workspace is intentionally omitted (None) — agentpool + # workspace is intentionally omitted (None) — wolfharness # doesn't have workspaces, and workspace=project_id would # be wrong (WorkspaceID format is 'wrk_xxx', not a git SHA) @@ -623,7 +623,7 @@ No new endpoints. Changes are limited to the SSE data format: - Owner: yuchen.liu - Status: Open (investigation needed) -3. **Should agentpool support `directory: "global"` for cross-project events?** +3. **Should wolfharness support `directory: "global"` for cross-project events?** - Context: OpenCode uses `directory: "global"` for events that should be delivered regardless of project context (e.g., `workspace.status`). AgentPool currently doesn't emit such events, but future features (like multi-agent status broadcasting) might need it. - Owner: yuchen.liu - Status: Open (not needed for Phase 1) diff --git a/docs/rfcs/draft/RFC-0015-multiple-questions-elicitation.md b/docs/rfcs/draft/RFC-0015-multiple-questions-elicitation.md index 4cfb881ae..6fa199ee1 100644 --- a/docs/rfcs/draft/RFC-0015-multiple-questions-elicitation.md +++ b/docs/rfcs/draft/RFC-0015-multiple-questions-elicitation.md @@ -19,7 +19,7 @@ references: ## Overview -This RFC proposes extending agentpool's OpenCode Server to support multi-question elicitation through the MCP Elicitation protocol. Currently, the `OpenCodeInputProvider` only supports single-question elicitation with enum/array schemas. This limitation prevents tools like `question_for_user` (defined in RFC-0010) from presenting multiple questions in a single interaction. +This RFC proposes extending wolfharness's OpenCode Server to support multi-question elicitation through the MCP Elicitation protocol. Currently, the `OpenCodeInputProvider` only supports single-question elicitation with enum/array schemas. This limitation prevents tools like `question_for_user` (defined in RFC-0010) from presenting multiple questions in a single interaction. The proposal involves extending `_handle_question_elicitation` to support `object` type schemas with multiple properties, where each property represents a separate question. @@ -39,7 +39,7 @@ The proposal involves extending `_handle_question_elicitation` to support `objec ### Current State -The agentpool OpenCode Server (`agentpool_server/opencode_server/`) provides user interaction capabilities through two main input providers: +The wolfharness OpenCode Server (`wolfharness_server/opencode_server/`) provides user interaction capabilities through two main input providers: 1. **OpenCodeInputProvider**: Handles elicitation via OpenCode protocol (SSE events) 2. **ACPInputProvider**: Handles elicitation via ACP protocol (permission requests) @@ -47,7 +47,7 @@ The agentpool OpenCode Server (`agentpool_server/opencode_server/`) provides use The current `OpenCodeInputProvider._handle_question_elicitation()` implementation: ```python -# Current limitation (agentpool_server/opencode_server/input_provider.py) +# Current limitation (wolfharness_server/opencode_server/input_provider.py) async def _handle_question_elicitation(self, params, schema): match schema: case {"type": "array", "items": {"enum": [...]}}: # Multi-select single question @@ -70,7 +70,7 @@ async def _handle_question_elicitation(self, params, schema): Importantly, the OpenCode data models already support multiple questions: ```python -# agentpool_server/opencode_server/models/question.py +# wolfharness_server/opencode_server/models/question.py class QuestionRequest: questions: list[QuestionInfo] # ✅ Already supports list @@ -164,7 +164,7 @@ When a tool sends an elicitation request with an object schema containing multip ### Implementation Location -**Primary File**: `src/agentpool_server/opencode_server/input_provider.py` +**Primary File**: `src/wolfharness_server/opencode_server/input_provider.py` The implementation extends `OpenCodeInputProvider._handle_question_elicitation()` to support `object` type schemas with multiple properties. @@ -273,7 +273,7 @@ content = {key: answers[i] for i, key in enumerate(properties.keys())} #### 1. Schema Parsing Extension ```python -# agentpool_server/opencode_server/input_provider.py +# wolfharness_server/opencode_server/input_provider.py async def _handle_question_elicitation( self, @@ -311,8 +311,8 @@ async def _handle_multi_question( properties: dict[str, dict[str, Any]], ) -> types.ElicitResult | types.ErrorData: """Handle object schema with multiple properties as multiple questions.""" - from agentpool_server.opencode_server.models import QuestionInfo, QuestionOption - from agentpool_server.opencode_server.models.events import QuestionAskedEvent + from wolfharness_server.opencode_server.models import QuestionInfo, QuestionOption + from wolfharness_server.opencode_server.models.events import QuestionAskedEvent question_id = self._generate_permission_id() questions: list[QuestionInfo] = [] @@ -359,7 +359,7 @@ def _property_to_question( prop_schema: dict[str, Any], ) -> QuestionInfo: """Convert a JSON Schema property to QuestionInfo.""" - from agentpool_server.opencode_server.models import QuestionInfo, QuestionOption + from wolfharness_server.opencode_server.models import QuestionInfo, QuestionOption title = prop_schema.get("title", key) description = prop_schema.get("description", "") @@ -443,7 +443,7 @@ def resolve_question(self, question_id: str, answers: list[list[str]]) -> bool: 4. Add unit tests for multi-question scenarios **Files Modified**: -- `agentpool_server/opencode_server/input_provider.py` +- `wolfharness_server/opencode_server/input_provider.py` ### Phase 2: Testing & Validation @@ -494,9 +494,9 @@ def resolve_question(self, question_id: str, answers: list[list[str]]) -> bool: ### Code References -- `/packages/agentpool/src/agentpool_server/opencode_server/input_provider.py` -- `/packages/agentpool/src/agentpool_server/opencode_server/models/question.py` -- `/packages/agentpool/src/agentpool_server/opencode_server/state.py` +- `/packages/wolfharness/src/wolfharness_server/opencode_server/input_provider.py` +- `/packages/wolfharness/src/wolfharness_server/opencode_server/models/question.py` +- `/packages/wolfharness/src/wolfharness_server/opencode_server/state.py` ### Protocol References diff --git a/docs/rfcs/draft/RFC-0016-skill-slash-commands.md b/docs/rfcs/draft/RFC-0016-skill-slash-commands.md index f8bd1a6f4..803ec73b3 100644 --- a/docs/rfcs/draft/RFC-0016-skill-slash-commands.md +++ b/docs/rfcs/draft/RFC-0016-skill-slash-commands.md @@ -34,7 +34,7 @@ This RFC proposes a unified architecture to expose **Skills** as **Slash Command ### Current State -**Skills System** (`src/agentpool/skills/`): +**Skills System** (`src/wolfharness/skills/`): - Skills are defined in `SKILL.md` files with YAML frontmatter containing `name`, `description`, `allowed-tools`, etc. - `Skill` class models skill metadata with validation per Agent Skills Spec - `SkillsRegistry` auto-discovers skills from directories (e.g., `~/.claude/skills/`) @@ -46,13 +46,13 @@ This RFC proposes a unified architecture to expose **Skills** as **Slash Command - `CommandInputHint`: Text input specification for commands - ACP agents can expose capabilities including slash commands -**OpenCode Protocol** (`src/agentpool_server/opencode_server/`): +**OpenCode Protocol** (`src/wolfharness_server/opencode_server/`): - Uses `slashed` library for command handling - Has `SkillMetadata` TypedDict in tool_metadata.py - Commands defined with name, description, usage, and category - Supports streaming command output -**AG-UI Protocol** (`src/agentpool_server/agui_server/`): +**AG-UI Protocol** (`src/wolfharness_server/agui_server/`): - HTTP-based protocol with event streaming - Agents expose tools and capabilities via HTTP endpoints - Currently no native slash command support @@ -333,7 +333,7 @@ All protocols (OpenCode/ACP/AG-UI) use existing tool exposure #### 1. SkillCommand (Protocol-Agnostic) ```python -# src/agentpool/skills/command.py +# src/wolfharness/skills/command.py from __future__ import annotations @@ -341,7 +341,7 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Callable, Coroutine, ParamSpec if TYPE_CHECKING: - from agentpool.skills.skill import Skill + from wolfharness.skills.skill import Skill P = ParamSpec("P") @@ -383,21 +383,21 @@ class SkillCommand: #### 2. SkillCommandRegistry ```python -# src/agentpool/skills/command_registry.py +# src/wolfharness/skills/command_registry.py from __future__ import annotations from typing import TYPE_CHECKING -from agentpool.log import get_logger -from agentpool.skills.command import SkillCommand -from agentpool.utils.baseregistry import BaseRegistry +from wolfharness.log import get_logger +from wolfharness.skills.command import SkillCommand +from wolfharness.utils.baseregistry import BaseRegistry if TYPE_CHECKING: from collections.abc import Callable - from agentpool.skills.skill import Skill - from agentpool.skills.registry import SkillsRegistry + from wolfharness.skills.skill import Skill + from wolfharness.skills.registry import SkillsRegistry logger = get_logger(__name__) @@ -505,14 +505,14 @@ class SkillCommandRegistry(BaseRegistry[str, SkillCommand]): @property def _error_class(self) -> type[Exception]: - from agentpool.tools.exceptions import ToolError + from wolfharness.tools.exceptions import ToolError return ToolError ``` #### 3. Protocol Bridges -**OpenCode Bridge** (`src/agentpool_server/opencode_server/skill_bridge.py`): +**OpenCode Bridge** (`src/wolfharness_server/opencode_server/skill_bridge.py`): **⚠️ CRITICAL**: OpenCode uses **native slashed Commands** for `/command-name` execution, NOT MCP Prompts. MCP Prompts are read-only templates that cannot execute commands or modify state. @@ -526,9 +526,9 @@ from typing import TYPE_CHECKING from slashed import Command, CommandContext if TYPE_CHECKING: - from agentpool.agents.opencode_agent import OpenCodeAgent - from agentpool.skills.command import SkillCommand - from agentpool.skills.manager import SkillsManager + from wolfharness.agents.opencode_agent import OpenCodeAgent + from wolfharness.skills.command import SkillCommand + from wolfharness.skills.manager import SkillsManager class SkillCommandWrapper(Command): @@ -634,7 +634,7 @@ class OpenCodeSkillBridge: return self._commands.get(name) ``` -**ACP Bridge** (`src/agentpool_server/acp_server/commands/skill_commands.py`): +**ACP Bridge** (`src/wolfharness_server/acp_server/commands/skill_commands.py`): ```python """Bridge between SkillCommandRegistry and ACP server.""" @@ -646,7 +646,7 @@ from typing import TYPE_CHECKING from acp.schema.slash_commands import AvailableCommand if TYPE_CHECKING: - from agentpool.skills.command import SkillCommand + from wolfharness.skills.command import SkillCommand class ACPSkillBridge: @@ -700,7 +700,7 @@ class AgentCapabilities(AnnotatedObject): """ ``` -**AG-UI Bridge** (`src/agentpool_server/agui_server/skill_tools.py`): +**AG-UI Bridge** (`src/wolfharness_server/agui_server/skill_tools.py`): **⚠️ CRITICAL**: AG-UI is **tool-oriented** with no native slash command concept. Skills must be exposed as **tools**. @@ -714,8 +714,8 @@ from typing import TYPE_CHECKING, Any from ag_ui import Tool, UserMessage if TYPE_CHECKING: - from agentpool.skills.command import SkillCommand - from agentpool.skills.manager import SkillsManager + from wolfharness.skills.command import SkillCommand + from wolfharness.skills.manager import SkillsManager class AGUISkillToolAdapter: @@ -794,7 +794,7 @@ class AGUISkillBridge: **SkillCommand Config** (optional enhancement): ```python -# src/agentpool_config/skill_commands.py +# src/wolfharness_config/skill_commands.py from __future__ import annotations @@ -879,7 +879,7 @@ Therefore, skill commands must be implemented as: async def _setup_skill_commands(self) -> None: """Setup skill command registry with optional skills support.""" - from agentpool.skills.command_registry import SkillCommandRegistry + from wolfharness.skills.command_registry import SkillCommandRegistry # SkillsRegistry may be None if no skill_dirs configured skills_registry = getattr(self, '_skills', None) @@ -938,12 +938,12 @@ def get_tools(self) -> list[AGUITool]: **OpenCode Server Integration**: ```python -# In agentpool_server/opencode_server/server.py +# In wolfharness_server/opencode_server/server.py async def _setup_skill_commands(self) -> None: """Setup skill command bridge with OpenCode's native slashed system.""" - from agentpool.skills.command_registry import SkillCommandRegistry - from agentpool_server.opencode_server.skill_bridge import OpenCodeSkillBridge + from wolfharness.skills.command_registry import SkillCommandRegistry + from wolfharness_server.opencode_server.skill_bridge import OpenCodeSkillBridge from slashed import CommandStore # Initialize command registry (watches SkillsRegistry for changes) @@ -1004,11 +1004,11 @@ This provides true slash command UX with full execution capabilities. **ACP Server Integration**: ```python -# In agentpool_server/acp_server/session.py or agent.py +# In wolfharness_server/acp_server/session.py or agent.py async def _get_capabilities(self) -> AgentCapabilities: """Get agent capabilities including skill commands.""" - from agentpool_server.acp_server.commands.skill_commands import ACPSkillBridge + from wolfharness_server.acp_server.commands.skill_commands import ACPSkillBridge bridge = ACPSkillBridge() @@ -1037,17 +1037,17 @@ async def _get_capabilities(self) -> AgentCapabilities: ### Phase 1: Core Foundation (Weeks 1-2) -1. **Create SkillCommand dataclass** (`src/agentpool/skills/command.py`) +1. **Create SkillCommand dataclass** (`src/wolfharness/skills/command.py`) - Define protocol-agnostic command representation - Add validation methods -2. **Create SkillCommandRegistry** (`src/agentpool/skills/command_registry.py`) +2. **Create SkillCommandRegistry** (`src/wolfharness/skills/command_registry.py`) - Implement watcher pattern for skills changes - Add callback registration mechanism - Add dependency resolution for skills (handle depends-on field) - Unit tests with mocked SkillsRegistry -3. **Integrate with AgentPool** (`src/agentpool/delegation/pool.py`) +3. **Integrate with AgentPool** (`src/wolfharness/delegation/pool.py`) - Add `skill_commands` property to AgentPool - Initialize registry during pool startup @@ -1061,7 +1061,7 @@ async def _get_capabilities(self) -> AgentCapabilities: **Strategy**: Implement ACP Bridge first as it has the cleanest mapping. -1. **Create ACPSkillBridge** (`src/agentpool_server/acp_server/commands/skill_commands.py`) +1. **Create ACPSkillBridge** (`src/wolfharness_server/acp_server/commands/skill_commands.py`) - Map SkillCommand to AvailableCommand - Handle capability updates via `AvailableCommandsUpdate` @@ -1069,7 +1069,7 @@ async def _get_capabilities(self) -> AgentCapabilities: - Add `slash_commands` field to `AgentCapabilities` - Update JSON schema validation -3. **Integrate with ACPServer** (`src/agentpool_server/acp_server/server.py`) +3. **Integrate with ACPServer** (`src/wolfharness_server/acp_server/server.py`) - Include skill slash commands in agent capabilities - Handle command execution via session/prompt mechanism @@ -1081,7 +1081,7 @@ async def _get_capabilities(self) -> AgentCapabilities: ### Phase 3: AG-UI Bridge (Weeks 3-5) -1. **Create AGUISkillBridge** (`src/agentpool_server/agui_server/skill_tools.py`) +1. **Create AGUISkillBridge** (`src/wolfharness_server/agui_server/skill_tools.py`) - Create `AGUISkillToolAdapter` for tool format conversion - Handle OpenAI function format conversion @@ -1101,7 +1101,7 @@ async def _get_capabilities(self) -> AgentCapabilities: **⚠️ CRITICAL**: OpenCode Bridge uses **native slashed Commands** (NOT MCP Prompts). -1. **Create OpenCodeSkillBridge** (`src/agentpool_server/opencode_server/skill_bridge.py`) +1. **Create OpenCodeSkillBridge** (`src/wolfharness_server/opencode_server/skill_bridge.py`) - Create `SkillCommandWrapper` extending slashed `Command` class - Implement `execute()` method for skill loading - Integrate with OpenCode's `CommandStore` @@ -1111,7 +1111,7 @@ async def _get_capabilities(self) -> AgentCapabilities: - Handle bash/fsspec argument substitution: `$1`, `$2`, `$@`, `$ARGUMENTS` - Implement `inject_skill_context()` in OpenCodeAgent -3. **Integrate with OpenCodeServer** (`src/agentpool_server/opencode_server/server.py`) +3. **Integrate with OpenCodeServer** (`src/wolfharness_server/opencode_server/server.py`) - Register bridge during server initialization - Make CommandStore available to GET /command endpoint - Wire up command execution in agent routes @@ -1334,7 +1334,7 @@ aliases: ["myalias", "ms"] # Alternative access names **Schema Addition**: ```python -# agentpool_config/skill_commands.py +# wolfharness_config/skill_commands.py class SkillSlashConfig(Schema): """Configuration for skill slash command exposure.""" @@ -1473,19 +1473,19 @@ allowed-tools: [read,grep] # Enforced on invocation ### File Paths Reference ``` -src/agentpool/skills/ +src/wolfharness/skills/ ├── command.py # NEW: SkillCommand dataclass ├── command_registry.py # NEW: SkillCommandRegistry └── ... # existing files -src/agentpool_server/opencode_server/ +src/wolfharness_server/opencode_server/ ├── skill_bridge.py # NEW: OpenCodeSkillBridge └── server.py # MODIFY: integration -src/agentpool_server/acp_server/ +src/wolfharness_server/acp_server/ └── commands/ └── skill_commands.py # NEW: ACPSkillBridge -src/agentpool_config/ +src/wolfharness_config/ └── skill_commands.py # NEW: Optional config schema ``` diff --git a/docs/rfcs/draft/RFC-0017-opencode-command-skill-support.md b/docs/rfcs/draft/RFC-0017-opencode-command-skill-support.md index 78d932e01..fb0fe181f 100644 --- a/docs/rfcs/draft/RFC-0017-opencode-command-skill-support.md +++ b/docs/rfcs/draft/RFC-0017-opencode-command-skill-support.md @@ -21,7 +21,7 @@ The current OpenCode server `/session/{id}/command` endpoint only executes MCP P ## Problem Statement -### Current Implementation (src/agentpool_server/opencode_server/routes/session_routes.py) +### Current Implementation (src/wolfharness_server/opencode_server/routes/session_routes.py) ```python @router.post("/{session_id}/command") @@ -219,7 +219,7 @@ class UnifiedCommandExecutor: ### Implementation Details -**Modified File**: `src/agentpool_server/opencode_server/routes/session_routes.py` +**Modified File**: `src/wolfharness_server/opencode_server/routes/session_routes.py` **New Helper Function**: @@ -300,7 +300,7 @@ async def execute_command( **CommandStore Integration**: ```python -# In src/agentpool_server/opencode_server/server.py +# In src/wolfharness_server/opencode_server/server.py async def _setup_skill_commands(self) -> None: """Setup command store with skills.""" diff --git a/docs/rfcs/draft/RFC-0018-simulation-framework.md b/docs/rfcs/draft/RFC-0018-simulation-framework.md index b9da773c1..4827c2414 100644 --- a/docs/rfcs/draft/RFC-0018-simulation-framework.md +++ b/docs/rfcs/draft/RFC-0018-simulation-framework.md @@ -732,7 +732,7 @@ Without storage, simulation runs but no trajectory is recorded. **Step 1: SimulationInputProvider** ```python -# File: src/agentpool/simulation/input_provider.py +# File: src/wolfharness/simulation/input_provider.py class SimulationInputProvider(InputProvider): """Step 1 implementation - core blocking mechanism.""" @@ -766,9 +766,9 @@ class SimulationInputProvider(InputProvider): **Step 2: ElicitationRequestEvent** ```python -# File: src/agentpool/simulation/events.py +# File: src/wolfharness/simulation/events.py from dataclasses import dataclass -from agentpool.models import CustomEvent +from wolfharness.models import CustomEvent @dataclass(frozen=True) class ElicitationRequestEvent(CustomEvent): @@ -783,7 +783,7 @@ class ElicitationRequestEvent(CustomEvent): **Step 3: SimulationToolProvider** ```python -# File: src/agentpool/simulation/tool_provider.py +# File: src/wolfharness/simulation/tool_provider.py class SimulationToolProvider(ResourceProvider): """Basic tools for Sim Agent.""" @@ -864,7 +864,7 @@ async def demo_simulation(): - Timeout/deep parameters in YAML 2. **CLI Commands** - - `agentpool simulate --sim-agent X --target Y` + - `wolfharness simulate --sim-agent X --target Y` - Batch simulation runner - Trajectory export @@ -1022,13 +1022,13 @@ async def cooperative_simulation(sim_agent, target_agent): ```bash # Run single simulation -agentpool simulate \ +wolfharness simulate \ --sim-agent engineer_sim \ --target diagnosis \ --scenario scenarios/motor_failure.yml # Batch execution -agentpool simulate-batch \ +wolfharness simulate-batch \ --sim-agent engineer_sim \ --target diagnosis \ --scenarios-dir scenarios/ \ @@ -1036,9 +1036,9 @@ agentpool simulate-batch \ --parallel 4 # View trajectories -agentpool history view --agent diagnosis --session +wolfharness history view --agent diagnosis --session # Evaluate results -agentpool simulate-eval results/ --criteria criteria.yml +wolfharness simulate-eval results/ --criteria criteria.yml ``` diff --git a/docs/rfcs/draft/RFC-0019-mcp-server-display-name-separation.md b/docs/rfcs/draft/RFC-0019-mcp-server-display-name-separation.md index 27ed3ab7d..03cbf1288 100644 --- a/docs/rfcs/draft/RFC-0019-mcp-server-display-name-separation.md +++ b/docs/rfcs/draft/RFC-0019-mcp-server-display-name-separation.md @@ -17,17 +17,17 @@ Currently, MCP servers in AgentPool are displayed with auto-generated identifier The MCP server naming follows this chain: -1. **MCPManager initialization** (`src/agentpool/delegation/pool.py:149`): +1. **MCPManager initialization** (`src/wolfharness/delegation/pool.py:149`): ```python self.mcp = MCPManager(name="pool_mcp", servers=servers, owner="pool") ``` -2. **Provider name construction** (`src/agentpool/mcp_server/manager.py:137`): +2. **Provider name construction** (`src/wolfharness/mcp_server/manager.py:137`): ```python name=f"{self.name}_{config.client_id}" ``` -3. **Client ID generation** (`src/agentpool_config/mcp_server.py`): +3. **Client ID generation** (`src/wolfharness_config/mcp_server.py`): - StreamableHTTP: `f"streamable_http_{self.url}"` - SSE: `f"sse_{self.url}"` - Stdio: `f"{self.command}_{args}"` @@ -162,7 +162,7 @@ The MCP server naming follows this chain: ### Changes Required -#### 1. Config Layer (`src/agentpool_config/mcp_server.py`) +#### 1. Config Layer (`src/wolfharness_config/mcp_server.py`) Add `display_name` property to base or each config class: @@ -182,7 +182,7 @@ Apply to: - `SSEMCPServerConfig` - `StreamableHTTPMCPServerConfig` -#### 2. Manager Layer (`src/agentpool/mcp_server/manager.py`) +#### 2. Manager Layer (`src/wolfharness/mcp_server/manager.py`) Update provider name construction (line 137): @@ -194,7 +194,7 @@ name=f"{self.name}_{config.client_id}" name=f"{self.name}_{config.display_name}" ``` -#### 3. API Layer (`src/agentpool_server/opencode_server/routes/agent_routes.py`) +#### 3. API Layer (`src/wolfharness_server/opencode_server/routes/agent_routes.py`) Update MCP status response (line 178): diff --git a/docs/rfcs/draft/RFC-0024-agent-stateless-refactor.md b/docs/rfcs/draft/RFC-0024-agent-stateless-refactor.md index 622a19ce7..14e226c84 100644 --- a/docs/rfcs/draft/RFC-0024-agent-stateless-refactor.md +++ b/docs/rfcs/draft/RFC-0024-agent-stateless-refactor.md @@ -19,7 +19,7 @@ related_rfcs: ## Overview -This RFC proposes refactoring `BaseAgent` to be stateless with respect to sessions: move session-scoped state (`conversation`, `_input_provider`, `session_id`) off the agent instance and into parameters passed at call time. This aligns agentpool's agent model with pydantic-ai's design (where the agent is a stateless worker and conversation persistence is the caller's responsibility), and enables Phase 3's shared-agent architecture where a single `BaseAgent` instance serves all sessions. +This RFC proposes refactoring `BaseAgent` to be stateless with respect to sessions: move session-scoped state (`conversation`, `_input_provider`, `session_id`) off the agent instance and into parameters passed at call time. This aligns wolfharness's agent model with pydantic-ai's design (where the agent is a stateless worker and conversation persistence is the caller's responsibility), and enables Phase 3's shared-agent architecture where a single `BaseAgent` instance serves all sessions. ## Background & Context @@ -42,7 +42,7 @@ Key design elements: 2. **`deps`** — Caller-injected business dependencies, per-call, NOT per-agent 3. **`GraphAgentState`** — Internal framework state, created per-run, returned via `AgentRunResult`, NOT stored on the agent -### agentpool's Current Misalignment +### wolfharness's Current Misalignment `BaseAgent` holds session-scoped state as **instance variables**, making the agent stateful: @@ -74,7 +74,7 @@ This coupling forces each session to have its own agent instance, incurring MCP - **Resource waste**: 5 concurrent sessions × 2 MCP servers = 10 subprocesses, ~50–250MB - **Architecture fragility**: New session-scoped state added to `BaseAgent` automatically becomes shared-state risk -- **pydantic-ai misalignment**: agentpool's agent model diverges from the framework it's built on +- **pydantic-ai misalignment**: wolfharness's agent model diverges from the framework it's built on ## Goals & Non-Goals @@ -210,7 +210,7 @@ iterator = agent.run_stream( | `session_routes.py:1437` | `agent.conversation.compact()` | `state.compact_messages(session_id)` | | `session_routes.py:564,599` | `agent.conversation.chat_messages` (read) | `state.messages[session_id]` (read) | -**After refactor, `self.conversation` is REMOVED from `BaseAgent`** (hard cut — no dual-path deprecation). All callers must pass `message_history=` explicitly to `run_stream()`. This includes CLI usage (`agentpool run`), which must manage its own message history list. +**After refactor, `self.conversation` is REMOVED from `BaseAgent`** (hard cut — no dual-path deprecation). All callers must pass `message_history=` explicitly to `run_stream()`. This includes CLI usage (`wolfharness run`), which must manage its own message history list. #### 1a. Non-Mechanical `self.conversation` Edge Cases @@ -423,7 +423,7 @@ Each phase is independently revertable. If `_active_run_ctx` registry proves pro - Status: **Resolved** — per-instance dict, NOT ClassVar (avoids cross-agent-type collision as identified by Oracle/Metis review). ClassVar would cause `ACPAgent` and `AGUIAgent` to share the same dict, leading to `interrupt()` canceling the wrong agent type's run. 2. **Backward compatibility for `self.conversation`**: Should `BaseAgent.conversation` still exist as a fallback for non-server callers? - - Context: Direct agent usage (e.g., `agentpool run`) doesn't have a server managing message history. + - Context: Direct agent usage (e.g., `wolfharness run`) doesn't have a server managing message history. - Status: **Resolved** — hard cut, no dual-path. Remove `self.conversation` as fallback entirely. All callers must pass `message_history=` explicitly. Dual-path (deprecation warning) creates maintenance burden and masks migration errors, as identified by Metis review. 3. **`SessionState` dataclass**: Should the server consolidate per-session state into a single `SessionState` container? @@ -472,6 +472,6 @@ Each phase is independently revertable. If `_active_run_ctx` registry proves pro ### Key Source Files -- `packages/agentpool/src/agentpool/agents/base_agent.py` — `BaseAgent`, session-scoped instance variables -- `packages/agentpool/src/agentpool/agents/agent.py` — `Agent`, `_run_stream_once()`, `self.conversation` references -- `packages/agentpool/src/agentpool/running/run_context.py` — `AgentRunContext`, per-run isolation +- `packages/wolfharness/src/wolfharness/agents/base_agent.py` — `BaseAgent`, session-scoped instance variables +- `packages/wolfharness/src/wolfharness/agents/agent.py` — `Agent`, `_run_stream_once()`, `self.conversation` references +- `packages/wolfharness/src/wolfharness/running/run_context.py` — `AgentRunContext`, per-run isolation diff --git a/docs/rfcs/draft/RFC-0025-shared-agent-architecture.md b/docs/rfcs/draft/RFC-0025-shared-agent-architecture.md index 81ccb23b6..f5ded43f2 100644 --- a/docs/rfcs/draft/RFC-0025-shared-agent-architecture.md +++ b/docs/rfcs/draft/RFC-0025-shared-agent-architecture.md @@ -15,7 +15,7 @@ related_rfcs: # RFC-0025: Shared Agent Architecture — Single Agent, Per-Session State -> **Phase 3 of the Multi-Session Isolation Roadmap.** Depends on [RFC-0024](./RFC-0024-agent-stateless-refactor.md) (Phase 2). This is the convergence point that aligns agentpool's server architecture with pydantic-ai's stateless agent model. +> **Phase 3 of the Multi-Session Isolation Roadmap.** Depends on [RFC-0024](./RFC-0024-agent-stateless-refactor.md) (Phase 2). This is the convergence point that aligns wolfharness's server architecture with pydantic-ai's stateless agent model. ## Overview @@ -46,7 +46,7 @@ result1 = await agent.run("hello", message_history=[], deps=deps1) result2 = await agent.run("hello", message_history=[], deps=deps2) # Different session ``` -Phase 3 makes agentpool's server match this model exactly: one `BaseAgent` instance, many `run_stream()` calls, each with its own `message_history` and `input_provider`. +Phase 3 makes wolfharness's server match this model exactly: one `BaseAgent` instance, many `run_stream()` calls, each with its own `message_history` and `input_provider`. ### Resource Savings @@ -472,10 +472,10 @@ Revert to Phase 1's per-session agents by restoring `ServerState.agents: dict[st ### Key Source Files -- `packages/agentpool/src/agentpool_server/opencode_server/state.py` — `ServerState`, per-session agent registry -- `packages/agentpool/src/agentpool_server/opencode_server/routes/session_routes.py` — Session CRUD -- `packages/agentpool/src/agentpool_server/opencode_server/routes/message_routes.py` — Message handling -- `packages/agentpool/src/agentpool/agents/base_agent.py` — `BaseAgent` (stateless after Phase 2) +- `packages/wolfharness/src/wolfharness_server/opencode_server/state.py` — `ServerState`, per-session agent registry +- `packages/wolfharness/src/wolfharness_server/opencode_server/routes/session_routes.py` — Session CRUD +- `packages/wolfharness/src/wolfharness_server/opencode_server/routes/message_routes.py` — Message handling +- `packages/wolfharness/src/wolfharness/agents/base_agent.py` — `BaseAgent` (stateless after Phase 2) ## Review Notes diff --git a/docs/rfcs/draft/RFC-0027-acp-subagent-zed-compatibility.md b/docs/rfcs/draft/RFC-0027-acp-subagent-zed-compatibility.md index 10207cc1b..459665544 100644 --- a/docs/rfcs/draft/RFC-0027-acp-subagent-zed-compatibility.md +++ b/docs/rfcs/draft/RFC-0027-acp-subagent-zed-compatibility.md @@ -1191,17 +1191,17 @@ Phase 0 与 Phase 1 可并行执行。Phase 0 仅阻塞 Phase 2(需要传输 ### ACP Schema 文件 -- `packages/agentpool/src/acp/schema/base.py` — `AnnotatedObject` 基类,`field_meta` 字段(序列化为 `_meta`) -- `packages/agentpool/src/acp/schema/session_updates.py` — `ToolCallStart`/`ToolCallProgress` 定义 +- `packages/wolfharness/src/acp/schema/base.py` — `AnnotatedObject` 基类,`field_meta` 字段(序列化为 `_meta`) +- `packages/wolfharness/src/acp/schema/session_updates.py` — `ToolCallStart`/`ToolCallProgress` 定义 ### AgentPool 源码 -- `packages/agentpool/src/agentpool_server/acp_server/event_converter.py` — 核心 ACP 事件转换器 -- `packages/agentpool/src/agentpool_server/acp_server/session.py` — ACP session 管理 -- `packages/agentpool/src/agentpool_server/acp_server/session_manager.py` — Session 生命周期管理 -- `packages/agentpool/src/agentpool_server/acp_server/server.py` — ACP server 入口 -- `packages/agentpool_toolsets/builtin/subagent_tools.py` — 发射 SubAgentEvent 和 SpawnSessionStart -- `packages/agentpool/src/agentpool/agents/events/events.py` — 事件定义:SubAgentEvent(line 614)、SpawnSessionStart(line 646) +- `packages/wolfharness/src/wolfharness_server/acp_server/event_converter.py` — 核心 ACP 事件转换器 +- `packages/wolfharness/src/wolfharness_server/acp_server/session.py` — ACP session 管理 +- `packages/wolfharness/src/wolfharness_server/acp_server/session_manager.py` — Session 生命周期管理 +- `packages/wolfharness/src/wolfharness_server/acp_server/server.py` — ACP server 入口 +- `packages/wolfharness_toolsets/builtin/subagent_tools.py` — 发射 SubAgentEvent 和 SpawnSessionStart +- `packages/wolfharness/src/wolfharness/agents/events/events.py` — 事件定义:SubAgentEvent(line 614)、SpawnSessionStart(line 646) ### 相关 RFC diff --git a/docs/rfcs/draft/RFC-0028-delegation-provider-session-adaptation.md b/docs/rfcs/draft/RFC-0028-delegation-provider-session-adaptation.md index 36122171f..b043ead3b 100644 --- a/docs/rfcs/draft/RFC-0028-delegation-provider-session-adaptation.md +++ b/docs/rfcs/draft/RFC-0028-delegation-provider-session-adaptation.md @@ -41,7 +41,7 @@ This RFC proposes adapting all delegation providers (SubagentTools, WorkersTools ### Current State -AgentPool has a `SessionManager` class (`src/agentpool/sessions/manager.py`) with a `create_child_session()` method that: +AgentPool has a `SessionManager` class (`src/wolfharness/sessions/manager.py`) with a `create_child_session()` method that: 1. Generates a unique session ID 2. Loads the parent session and inherits `project_id` / `cwd` @@ -69,7 +69,7 @@ The server-side `EventProcessor` or `ServerState.ensure_session()` reactively ma | Term | Definition | |------|------------| | **Delegation Provider** | Any mechanism that spawns child agent execution: SubagentTools (`task`), WorkersTools, Team (parallel), TeamRun (sequential) | -| **SessionManager** | Central class for session CRUD and child session creation (`src/agentpool/sessions/manager.py`) | +| **SessionManager** | Central class for session CRUD and child session creation (`src/wolfharness/sessions/manager.py`) | | **SessionStore** | Protocol for session persistence (`SessionData` objects) — memory or SQL-backed | | **SessionData** | Pydantic model with `session_id`, `parent_id`, `project_id`, `cwd`, `agent_name`, `agent_type` | | **SpawnSessionStart** | Event emitted before child content starts; carries `child_session_id`, `parent_session_id`, `depth`, metadata | @@ -408,7 +408,7 @@ AFTER: Add a convenience method to `AgentContext` that wraps `pool.sessions.create_child_session()`: ```python -# src/agentpool/agents/context.py +# src/wolfharness/agents/context.py class AgentContext: # ... existing code ... @@ -448,7 +448,7 @@ class AgentContext: #### 2. SubagentTools Adaptation ```python -# src/agentpool_toolsets/builtin/subagent_tools.py +# src/wolfharness_toolsets/builtin/subagent_tools.py # BEFORE: child_session_id = identifier.ascending("session") @@ -532,7 +532,7 @@ child_depth = (ctx.run_ctx.depth if ctx.run_ctx is not None else 0) + 1 **Solution**: Add `depth: int = 0` as an explicit parameter to `BaseAgent.run_stream()`: ```python -# src/agentpool/agents/base_agent.py +# src/wolfharness/agents/base_agent.py # BEFORE (actual 12-param signature — simplified for illustration): async def run_stream( @@ -581,7 +581,7 @@ This is the **only correct approach** — alternatives like stripping `depth` fr Add session propagation to parallel team execution: ```python -# src/agentpool/delegation/team.py +# src/wolfharness/delegation/team.py async def run_stream(self, *prompts, depth: int = 0, **kwargs): all_nodes = list(self.nodes) @@ -668,7 +668,7 @@ async def run_stream(self, *prompts, depth: int = 0, **kwargs): Sequential team — each step's child session is created independently: ```python -# src/agentpool/delegation/teamrun.py +# src/wolfharness/delegation/teamrun.py async def run_stream(self, *prompts, depth: int = 0, require_all: bool = True, **kwargs): # Read session_id from kwargs first (set by SubagentTools caller), @@ -752,7 +752,7 @@ async def run_stream(self, *prompts, depth: int = 0, require_all: bool = True, * **Solution**: Remove the dead field or connect it to `BaseAgent.session_id`: ```python -# src/agentpool/agents/base_agent.py +# src/wolfharness/agents/base_agent.py # BEFORE: run_ctx = AgentRunContext(deps=deps) @@ -768,7 +768,7 @@ run_ctx = AgentRunContext(deps=deps, session_id=self.session_id) **Recommendation**: Option C (deprecate) — mark the field as deprecated using a descriptor that emits `DeprecationWarning` on access. Removing it is a public API break for external consumers. In a future major version, it can be removed entirely. ```python -# src/agentpool/agents/context.py +# src/wolfharness/agents/context.py import warnings from dataclasses import dataclass, field @@ -835,7 +835,7 @@ AgentRunContext.session_id = _DeprecatedSessionId() # type: ignore[assignment] **Solution**: Add `parent_session_id` parameter to `create_session()`. When provided, call `create_child_session()` (with inheritance). When not provided, create a top-level session with the existing project_id computation from cwd. ```python -# src/agentpool_server/acp_server/session_manager.py +# src/wolfharness_server/acp_server/session_manager.py # BEFORE: async def create_session( @@ -892,7 +892,7 @@ async def create_session( ) else: # Top-level ACP session — compute project_id from cwd - from agentpool_storage.opencode_provider.helpers import compute_project_id + from wolfharness_storage.opencode_provider.helpers import compute_project_id project_id = compute_project_id(cwd) data = SessionData( session_id=session_id, @@ -941,7 +941,7 @@ The second `store.save()` would **overwrite** the correct data from step 1. **Solution**: `ensure_session()` must skip `store.save()` when the session was already persisted: ```python -# src/agentpool_server/opencode_server/state.py +# src/wolfharness_server/opencode_server/state.py async def ensure_session(self, session_id: str, parent_id: str | None = None) -> Session: # Check if session already exists in memory @@ -1011,7 +1011,7 @@ A native agent's implementation type is `"native"`, but its delegation source ty **Solution**: Provide two separate, type-safe functions with distinct return types: ```python -# src/agentpool/messaging/messagenode.py +# src/wolfharness/messaging/messagenode.py class MessageNode: # ... existing code ... @@ -1024,9 +1024,9 @@ class MessageNode: Returns values from AgentTypeLiteral domain. """ # Import locally to avoid circular imports - from agentpool.agents.base_agent import BaseAgent - from agentpool.delegation.team import Team - from agentpool.delegation.teamrun import TeamRun + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.delegation.team import Team + from wolfharness.delegation.teamrun import TeamRun if isinstance(self, Team | TeamRun): return "team" @@ -1036,10 +1036,10 @@ class MessageNode: ``` ```python -# src/agentpool/agents/helpers.py +# src/wolfharness/agents/helpers.py from typing import Literal -from agentpool.messaging.messagenode import MessageNode +from wolfharness.messaging.messagenode import MessageNode # The return type matches SpawnSessionStart.source_type and SubAgentEvent.source_type SourceType = Literal["agent", "team_parallel", "team_sequential"] @@ -1054,9 +1054,9 @@ def get_source_type(node: MessageNode) -> SourceType: - agent_type = implementation type (native, acp, claude, codex, team) - source_type = delegation type (agent, team_parallel, team_sequential) """ - from agentpool.delegation.team import Team - from agentpool.delegation.teamrun import TeamRun - from agentpool.agents.base_agent import BaseAgent + from wolfharness.delegation.team import Team + from wolfharness.delegation.teamrun import TeamRun + from wolfharness.agents.base_agent import BaseAgent match node: case Team(): @@ -1073,7 +1073,7 @@ def get_source_type(node: MessageNode) -> SourceType: - `get_source_type(node)` → used for `SpawnSessionStart.source_type`, `SubAgentEvent.source_type` (returns `"agent"` / `"team_parallel"` / `"team_sequential"`) - `node.agent_type` → used for `SessionData.agent_type`, `create_child_session(agent_type=...)` (returns `"native"` / `"acp"` / `"team"` etc.) -**Pre-existing codebase bug**: `team.py:32` and `teamrun.py:28` import `SubAgentType` from `agentpool.agents.events.events` inside `TYPE_CHECKING` blocks, but `SubAgentType` does **not exist** in that module. This is a type-checking error that's silently ignored at runtime. The new `SourceType` type alias and `get_source_type()` function in `helpers.py` replace this broken import. **Implementation action**: Update the `TYPE_CHECKING` imports in `team.py` and `teamrun.py` to use `from agentpool.agents.helpers import SourceType` instead of the broken `SubAgentType` import. +**Pre-existing codebase bug**: `team.py:32` and `teamrun.py:28` import `SubAgentType` from `wolfharness.agents.events.events` inside `TYPE_CHECKING` blocks, but `SubAgentType` does **not exist** in that module. This is a type-checking error that's silently ignored at runtime. The new `SourceType` type alias and `get_source_type()` function in `helpers.py` replace this broken import. **Implementation action**: Update the `TYPE_CHECKING` imports in `team.py` and `teamrun.py` to use `from wolfharness.agents.helpers import SourceType` instead of the broken `SubAgentType` import. **`AgentTypeLiteral` domain note**: `AgentTypeLiteral = Literal["native", "acp", "agui", "claude", "codex"]` does NOT include `"team"`. The `MessageNode.agent_type` property returns `"team"` for Team/TeamRun instances, which is outside the `AgentTypeLiteral` domain. This is acceptable because `SessionData.agent_type` is typed as `str | None` (not `AgentTypeLiteral`), so storing `"team"` is valid at runtime and in the persistence layer. The `"team"` value provides useful semantic information about which kind of node created the session. If stricter typing is desired in the future, `AgentTypeLiteral` could be extended to include `"team"`. @@ -1123,7 +1123,7 @@ Calling Session (parent) Providers must enforce a maximum delegation depth to prevent unbounded recursion: ```python -# src/agentpool/agents/base_agent.py or constants +# src/wolfharness/agents/base_agent.py or constants MAX_DELEGATION_DEPTH = 10 # Hard cap on delegation nesting @@ -1137,10 +1137,10 @@ if current_depth >= MAX_DELEGATION_DEPTH: child_depth = current_depth + 1 ``` -`DelegationDepthError` is defined in `src/agentpool/agents/exceptions.py` alongside other agent-specific exceptions. `MAX_DELEGATION_DEPTH` is a module-level constant in the same file. +`DelegationDepthError` is defined in `src/wolfharness/agents/exceptions.py` alongside other agent-specific exceptions. `MAX_DELEGATION_DEPTH` is a module-level constant in the same file. ```python -# src/agentpool/agents/exceptions.py +# src/wolfharness/agents/exceptions.py class DelegationDepthError(Exception): """Raised when delegation depth exceeds MAX_DELEGATION_DEPTH.""" @@ -1834,9 +1834,9 @@ Verify both `agent_type` and `get_source_type()` return domain-appropriate value async def test_messagenode_agent_type_and_source_type(): """MessageNode.agent_type and get_source_type() must return values from their respective domains.""" - from agentpool.agents.base_agent import BaseAgent - from agentpool.delegation.team import Team - from agentpool.delegation.teamrun import TeamRun + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.delegation.team import Team + from wolfharness.delegation.teamrun import TeamRun native = Agent(name="native", model="test") team = Team([native], name="team") @@ -1848,7 +1848,7 @@ async def test_messagenode_agent_type_and_source_type(): assert teamrun.agent_type == "team" # Implementation type # get_source_type returns delegation source type (source_type domain) - from agentpool.agents.helpers import get_source_type + from wolfharness.agents.helpers import get_source_type assert get_source_type(native) == "agent" # NOT "native"! assert get_source_type(team) == "team_parallel" # NOT "team"! assert get_source_type(teamrun) == "team_sequential" # NOT "team"! @@ -1862,7 +1862,7 @@ Verify that `get_source_type()` return values are valid for `source_type` fields async def test_get_source_type_compatible_with_source_type_literal(): """get_source_type() must return values accepted by SpawnSessionStart.source_type and SubAgentEvent.source_type.""" - from agentpool.agents.helpers import get_source_type, SourceType + from wolfharness.agents.helpers import get_source_type, SourceType for node in [native_agent, acp_agent, team, teamrun]: result = get_source_type(node) @@ -1901,8 +1901,8 @@ Verify the `case _` branch in `get_source_type()` returns `"agent"` with a warni async def test_get_source_type_wildcard_defaults_to_agent(): """Unknown MessageNode subclasses should default to 'agent' with a warning log.""" - from agentpool.agents.helpers import get_source_type - from agentpool.messaging.messagenode import MessageNode + from wolfharness.agents.helpers import get_source_type + from wolfharness.messaging.messagenode import MessageNode class CustomNode(MessageNode): name: str = "custom" @@ -1921,7 +1921,7 @@ Verify the descriptor works correctly with `dataclasses.asdict()`: async def test_deprecated_session_id_asdict(): """dataclasses.asdict() should work with the _DeprecatedSessionId descriptor, triggering deprecation warning on access.""" - from agentpool.agents.context import AgentRunContext + from wolfharness.agents.context import AgentRunContext ctx = AgentRunContext(deps=None, depth=0) with pytest.warns(DeprecationWarning, match="session_id"): @@ -1938,10 +1938,10 @@ def test_messagenode_agent_type_no_circular_import(): """MessageNode.agent_type property with local imports should not cause circular import errors at module load time.""" import importlib - import agentpool.messaging.messagenode + import wolfharness.messaging.messagenode # Force re-import to detect circular dependency - importlib.reload(agentpool.messaging.messagenode) + importlib.reload(wolfharness.messaging.messagenode) # Should not raise ImportError ``` @@ -2046,7 +2046,7 @@ async def test_ensure_session_store_first_skips_bind(): | 2 | Component #9 factual error — `BaseAgent.run_stream()` does NOT propagate `parent_session_id` → `parent_id`; they are independent parameters (session-level vs message-level) | Metis HR-5 | ✅ Rewrote Component #10 (renumbered) with correct distinction and explanation of how `Session.parent_id` is populated | | 3 | `_stream_task()` pseudocode missing — `skip_spawn_event` described in text but no pseudocode; simpler approach: remove SpawnSessionStart from `_stream_task()` entirely | Oracle SHOULD, Metis HR-7 | ✅ Replaced `skip_spawn_event` with structural single-emission: `_stream_task()` never emits `SpawnSessionStart` | | 4 | Duplicate "#### 8." numbering still broken — added Component #8 without renumbering | Oracle SHOULD | ✅ Renumbered 8→8, 8→9, 9→10, 10→11, 11→12 | -| 5 | `DelegationDepthError` referenced but undefined — no module location specified | Oracle SHOULD | ✅ Added definition in `src/agentpool/agents/exceptions.py` with `MAX_DELEGATION_DEPTH` constant | +| 5 | `DelegationDepthError` referenced but undefined — no module location specified | Oracle SHOULD | ✅ Added definition in `src/wolfharness/agents/exceptions.py` with `MAX_DELEGATION_DEPTH` constant | | 6 | `TeamRun.run_stream()` pseudocode drops `require_all: bool = True` parameter | Metis AMB-3 | ✅ Added `require_all` to TeamRun signature | | 7 | `ensure_session()` in-memory path returns without broadcasting `SessionUpdatedEvent` — TUI regression vs current code | Metis AMB-4 | ✅ Added `SessionUpdatedEvent` broadcast to in-memory return path | | 8 | WorkersTools hardcodes `depth=1` in four locations — breaks nested delegation | Metis AMB-6 | ✅ Added depth propagation specification: `(ctx.run_ctx.depth if ctx.run_ctx is not None else 0) + 1` | @@ -2123,15 +2123,15 @@ async def test_ensure_session_store_first_skips_bind(): ### Key Source Files -- `src/agentpool/sessions/manager.py` — `SessionManager.create_child_session()` -- `src/agentpool/sessions/store.py` — `SessionStore` protocol -- `src/agentpool/sessions/models.py` — `SessionData` model -- `src/agentpool_toolsets/builtin/subagent_tools.py` — SubagentTools -- `src/agentpool_toolsets/builtin/workers.py` — WorkersTools -- `src/agentpool/delegation/team.py` — Team (parallel) -- `src/agentpool/delegation/teamrun.py` — TeamRun (sequential) -- `src/agentpool/agents/context.py` — `AgentContext` -- `src/agentpool/agents/events/events.py` — `SpawnSessionStart`, `SubAgentEvent` -- `src/agentpool_server/opencode_server/state.py` — `ServerState.ensure_session()` -- `src/agentpool_server/opencode_server/event_processor.py` — `EventProcessor` -- `src/agentpool_server/acp_server/session_manager.py` — `ACPSessionManager` +- `src/wolfharness/sessions/manager.py` — `SessionManager.create_child_session()` +- `src/wolfharness/sessions/store.py` — `SessionStore` protocol +- `src/wolfharness/sessions/models.py` — `SessionData` model +- `src/wolfharness_toolsets/builtin/subagent_tools.py` — SubagentTools +- `src/wolfharness_toolsets/builtin/workers.py` — WorkersTools +- `src/wolfharness/delegation/team.py` — Team (parallel) +- `src/wolfharness/delegation/teamrun.py` — TeamRun (sequential) +- `src/wolfharness/agents/context.py` — `AgentContext` +- `src/wolfharness/agents/events/events.py` — `SpawnSessionStart`, `SubAgentEvent` +- `src/wolfharness_server/opencode_server/state.py` — `ServerState.ensure_session()` +- `src/wolfharness_server/opencode_server/event_processor.py` — `EventProcessor` +- `src/wolfharness_server/acp_server/session_manager.py` — `ACPSessionManager` diff --git a/docs/rfcs/draft/RFC-0029-agent-reactivation-pending-prompt-queue.md b/docs/rfcs/draft/RFC-0029-agent-reactivation-pending-prompt-queue.md index 88512ac5c..41979ae2c 100644 --- a/docs/rfcs/draft/RFC-0029-agent-reactivation-pending-prompt-queue.md +++ b/docs/rfcs/draft/RFC-0029-agent-reactivation-pending-prompt-queue.md @@ -563,7 +563,7 @@ Solution: First caller gets the prompt (queue.get() is atomic). Second caller se - `_pending_prompt_event` is lightweight — no task allocation, no timer. - No long-lived `asyncio.Task` is created by the agent — the caller decides when to start `run_stream()`. - `clear_pending_prompts()` provided for cleanup during agent shutdown. Should be wired into `__aexit__` or `stop()` (Phase 4). -- **Event loop affinity**: `asyncio.Queue` and `asyncio.Event` are not thread-safe. All callers must be in the same event loop. This matches current agentpool architecture where all agent operations are asyncio-based. +- **Event loop affinity**: `asyncio.Queue` and `asyncio.Event` are not thread-safe. All callers must be in the same event loop. This matches current wolfharness architecture where all agent operations are asyncio-based. --- @@ -649,10 +649,10 @@ Solution: First caller gets the prompt (queue.get() is atomic). Second caller se ## References -- `src/agentpool/agents/base_agent.py` — `inject_prompt()`, `queue_prompt()`, `run_stream()` -- `src/agentpool/agents/prompt_injection.py` — `PromptInjectionManager` -- `src/agentpool/agents/native_agent/hook_manager.py` — injection consumption in post-tool hooks -- `src/agentpool_server/opencode_server/routes/message_routes.py` — `_run_async_prompt_queue()` +- `src/wolfharness/agents/base_agent.py` — `inject_prompt()`, `queue_prompt()`, `run_stream()` +- `src/wolfharness/agents/prompt_injection.py` — `PromptInjectionManager` +- `src/wolfharness/agents/native_agent/hook_manager.py` — injection consumption in post-tool hooks +- `src/wolfharness_server/opencode_server/routes/message_routes.py` — `_run_async_prompt_queue()` - xeno-agent `background_task_provider.py` L803-811 — `_on_task_completed()` callback - OpenCode TypeScript: `effect/runner.ts` — Runner state machine - OpenCode TypeScript: `session/prompt.ts` — `while(true)` run loop diff --git a/docs/rfcs/draft/RFC-0030-acp-streamable-http-websocket-transport.md b/docs/rfcs/draft/RFC-0030-acp-streamable-http-websocket-transport.md index 260eeb88b..6b9687408 100644 --- a/docs/rfcs/draft/RFC-0030-acp-streamable-http-websocket-transport.md +++ b/docs/rfcs/draft/RFC-0030-acp-streamable-http-websocket-transport.md @@ -96,7 +96,7 @@ Without this change, AgentPool can only serve ACP agents via stdio or a non-comp ### Success Criteria -- [ ] ACP server can be started with `agentpool serve-acp config.yml --transport streamable-http --port 8080` and accepts WebSocket connections at `/acp` +- [ ] ACP server can be started with `wolfharness serve-acp config.yml --transport streamable-http --port 8080` and accepts WebSocket connections at `/acp` - [ ] WebSocket upgrade response includes `Acp-Connection-Id` header with UUID v4 - [ ] Pre-initialize requests receive JSON-RPC error code `-32002` - [ ] Post-initialize requests process normally through `AgentSideConnection` @@ -456,10 +456,10 @@ Client connects via WebSocket upgrade at /acp ### CLI Integration ``` -agentpool serve-acp config.yml # Default: stdio transport -agentpool serve-acp config.yml --transport streamable-http # WebSocket on localhost:8080 -agentpool serve-acp config.yml --transport streamable-http --port 9000 # WebSocket on localhost:9000 -agentpool serve-acp config.yml --transport streamable-http --host 0.0.0.0 --port 9000 # WebSocket on 0.0.0.0:9000 +wolfharness serve-acp config.yml # Default: stdio transport +wolfharness serve-acp config.yml --transport streamable-http # WebSocket on localhost:8080 +wolfharness serve-acp config.yml --transport streamable-http --port 9000 # WebSocket on localhost:9000 +wolfharness serve-acp config.yml --transport streamable-http --host 0.0.0.0 --port 9000 # WebSocket on 0.0.0.0:9000 ``` The `--transport` flag accepts `stdio` (default), `websocket` (legacy, deprecated), or `streamable-http` (new compliant transport). When `--transport streamable-http` is used, `--host` and `--port` control the bind address. When `--transport websocket` is used, the legacy non-compliant `_serve_websocket()` transport is instantiated; a deprecation warning is emitted directing the user to switch to `--transport streamable-http`. The legacy `--ws-host` and `--ws-port` parameters are still accepted for backward compatibility but emit deprecation warnings directing users to `--host` and `--port`. @@ -468,7 +468,7 @@ The `--transport` flag accepts `stdio` (default), `websocket` (legacy, deprecate #### ACPPoolServerConfig Fields -The `ACPPoolServerConfig` model in `src/agentpool_config/pool_server.py` is extended with: +The `ACPPoolServerConfig` model in `src/wolfharness_config/pool_server.py` is extended with: ```python class ACPPoolServerConfig(BasePoolServerConfig): @@ -756,5 +756,5 @@ None recorded yet. ### Appendix Current transport code: `src/acp/transports.py` -ACP server: `src/agentpool_server/acp_server/server.py` -Pool server config: `src/agentpool_config/pool_server.py` +ACP server: `src/wolfharness_server/acp_server/server.py` +Pool server config: `src/wolfharness_config/pool_server.py` diff --git a/docs/rfcs/draft/RFC-0032-acp-slash-commands-session-update.md b/docs/rfcs/draft/RFC-0032-acp-slash-commands-session-update.md index 501e210eb..161ec59de 100644 --- a/docs/rfcs/draft/RFC-0032-acp-slash-commands-session-update.md +++ b/docs/rfcs/draft/RFC-0032-acp-slash-commands-session-update.md @@ -58,9 +58,9 @@ The schema layer supports both paths: skill_commands = self.get_skill_commands() return InitializeResponse.create( protocol_version=version, - name="agentpool", + name="wolfharness", title="AgentPool", - version=_version("agentpool"), + version=_version("wolfharness"), # ... other capabilities ... slash_commands=skill_commands, # ← ADVERTISED AT INIT TIME ) @@ -388,7 +388,7 @@ slash_commands: list[AvailableCommand] = Field(default_factory=list) #### 3. `AgentPoolACPAgent.initialize()` Update -**File**: `src/agentpool_server/acp_server/acp_agent.py` +**File**: `src/wolfharness_server/acp_server/acp_agent.py` **Remove**: ```python @@ -437,7 +437,7 @@ The `get_skill_commands()` method on `AgentPoolACPAgent` is currently used **onl |------|---------| | `src/acp/schema/capabilities.py` | Remove `slash_commands` field from `AgentCapabilities`; update `create()` | | `src/acp/schema/agent_responses.py` | Remove `slash_commands` parameter from `InitializeResponse.create()` | -| `src/agentpool_server/acp_server/acp_agent.py` | Remove `slash_commands=skill_commands` from `initialize()` | +| `src/wolfharness_server/acp_server/acp_agent.py` | Remove `slash_commands=skill_commands` from `initialize()` | **Duration**: 0.5 day @@ -606,8 +606,8 @@ Revert by restoring: - `src/acp/schema/capabilities.py:273` — `AgentCapabilities.slash_commands` - `src/acp/schema/agent_responses.py:284-339` — `InitializeResponse.create()` -- `src/agentpool_server/acp_server/acp_agent.py:482-505` — `AgentPoolACPAgent.initialize()` -- `src/agentpool_server/acp_server/session.py:562-572` — `ACPSession.send_available_commands_update()` +- `src/wolfharness_server/acp_server/acp_agent.py:482-505` — `AgentPoolACPAgent.initialize()` +- `src/wolfharness_server/acp_server/session.py:562-572` — `ACPSession.send_available_commands_update()` - `src/acp/agent/notifications.py:336-339` — `ACPNotifications.update_commands()` - `src/acp/schema/session_updates.py:354-363` — `AvailableCommandsUpdate` diff --git a/docs/rfcs/draft/RFC-0034-acp-session-config-options-unified.md b/docs/rfcs/draft/RFC-0034-acp-session-config-options-unified.md index 234f94412..4496e1d12 100644 --- a/docs/rfcs/draft/RFC-0034-acp-session-config-options-unified.md +++ b/docs/rfcs/draft/RFC-0034-acp-session-config-options-unified.md @@ -48,7 +48,7 @@ AgentPool 当前实现: - `NewSessionResponse.config_options` → 透出所有 `agent.get_modes()` 返回的 categories(`get_session_config_options()`) - `NewSessionResponse.models` → 透出 tokonomics 发现的模型 + manifest model_variants(`get_session_model_state()`) -#### agentpool 内部的 `get_modes()` 体系 +#### wolfharness 内部的 `get_modes()` 体系 各 agent 类型的 `get_modes()` 返回如下 categories: @@ -465,7 +465,7 @@ ACP 协议 PR #648(已 MERGED)定义了 `providers/list`、`providers/set` │ │ │ ┌─ 运行时路由 ───────────────────────────────────────────────┐ │ │ │ │ │ -│ │ Provider 路由表(agentpool 内存维护) │ │ +│ │ Provider 路由表(wolfharness 内存维护) │ │ │ │ 默认:manifest model_variants → provider → default URL │ │ │ │ 覆盖:providers/set → provider → client URL + headers │ │ │ │ 禁用:providers/disable → provider → null(不可路由) │ │ @@ -483,7 +483,7 @@ ACP 协议 PR #648(已 MERGED)定义了 `providers/list`、`providers/set` #### 数据模型 -从 ACP PR #648 协议定义映射到 agentpool 的类型: +从 ACP PR #648 协议定义映射到 wolfharness 的类型: ```python # acp/schema/providers.py(新增文件) @@ -540,7 +540,7 @@ class ProvidersDisableResponse(BaseModel): #### Provider 路由表 -agentpool 内存维护一个 provider 路由表,存储 `providers/set` 的覆盖配置: +wolfharness 内存维护一个 provider 路由表,存储 `providers/set` 的覆盖配置: ```python # acp_server/provider_router.py(新增文件) @@ -806,7 +806,7 @@ async def get_session_model_state( agent: BaseAgent, provider_router: ProviderRouter | None = None, ) -> SessionModelState | None: - from agentpool_server.shared.model_utils import build_model_state_for_acp + from wolfharness_server.shared.model_utils import build_model_state_for_acp manifest = getattr(getattr(agent, "agent_pool", None), "manifest", None) return await build_model_state_for_acp(agent, manifest, provider_router) ``` @@ -1233,19 +1233,19 @@ Phase 0 必须最先实施(Phase 1 依赖 `ProviderRouter`)。Phase 1 和 Ph ### AgentPool 源码 -- `packages/agentpool/src/agentpool_server/acp_server/acp_agent.py` — ACP server 核心,`get_session_model_state`、`get_session_config_options` -- `packages/agentpool/src/agentpool_server/acp_server/converters.py` — `to_session_config_option()`、`agent_to_mode()`(已有但未使用) -- `packages/agentpool/src/agentpool_server/opencode_server/routes/config_routes.py` — OpenCode model list 逻辑、`/mode` 路由 -- `packages/agentpool/src/agentpool_server/shared/model_utils.py` — 现有共享 model 工具函数 -- `packages/agentpool/src/agentpool/agents/native_agent/helpers.py` — `get_permission_category()`、`get_model_category()` -- `packages/agentpool/src/agentpool/agents/modes.py` — `ModeCategory`、`ModeInfo`、`ModeCategoryId` -- `packages/agentpool/src/acp/schema/capabilities.py` — `AgentCapabilities`(需新增 `providers` 字段) -- `packages/agentpool/src/agentpool/models/manifest.py` — `AgentsManifest.model_variants`(`providers/list` 的数据来源) +- `packages/wolfharness/src/wolfharness_server/acp_server/acp_agent.py` — ACP server 核心,`get_session_model_state`、`get_session_config_options` +- `packages/wolfharness/src/wolfharness_server/acp_server/converters.py` — `to_session_config_option()`、`agent_to_mode()`(已有但未使用) +- `packages/wolfharness/src/wolfharness_server/opencode_server/routes/config_routes.py` — OpenCode model list 逻辑、`/mode` 路由 +- `packages/wolfharness/src/wolfharness_server/shared/model_utils.py` — 现有共享 model 工具函数 +- `packages/wolfharness/src/wolfharness/agents/native_agent/helpers.py` — `get_permission_category()`、`get_model_category()` +- `packages/wolfharness/src/wolfharness/agents/modes.py` — `ModeCategory`、`ModeInfo`、`ModeCategoryId` +- `packages/wolfharness/src/acp/schema/capabilities.py` — `AgentCapabilities`(需新增 `providers` 字段) +- `packages/wolfharness/src/wolfharness/models/manifest.py` — `AgentsManifest.model_variants`(`providers/list` 的数据来源) ### ACP 协议 -- `packages/agentpool/src/acp/schema/session_state.py` — `SessionConfigOption`、`SessionConfigOptionCategory`、`SessionModeState` -- `packages/agentpool/src/acp/schema/agent_responses.py` — `NewSessionResponse`(`models`、`modes`、`config_options` 字段) +- `packages/wolfharness/src/acp/schema/session_state.py` — `SessionConfigOption`、`SessionConfigOptionCategory`、`SessionModeState` +- `packages/wolfharness/src/acp/schema/agent_responses.py` — `NewSessionResponse`(`models`、`modes`、`config_options` 字段) - [ACP 协议官网](https://agentclientprotocol.com/protocol/session-modes) - [ACP PR #648: Configurable LLM Providers](https://github.com/agentclientprotocol/agent-client-protocol/pull/648) — `providers/*` 方法族定义(已 MERGED) - `packages/agent-client-protocol/docs/rfds/custom-llm-endpoint.mdx` — ACP RFD 原文 diff --git a/docs/rfcs/draft/RFC-0034-background-task-redesign.md b/docs/rfcs/draft/RFC-0034-background-task-redesign.md index 23f78ecaf..9f359695a 100644 --- a/docs/rfcs/draft/RFC-0034-background-task-redesign.md +++ b/docs/rfcs/draft/RFC-0034-background-task-redesign.md @@ -46,7 +46,7 @@ related_rfcs: ### 1.1 Summary -This RFC proposes a fundamental redesign of the BackgroundTask system, migrating it from the xeno-agent business layer into agentpool as a first-class core infrastructure, while preserving xeno-agent-specific provider customizations. The redesign replaces the legacy string-based task ID API with a structured `TaskHandle` object pattern aligned with MCP SEP-1686, introduces configurable session-end lifecycle policies, and hard-cuts over from the old API without a compatibility layer. +This RFC proposes a fundamental redesign of the BackgroundTask system, migrating it from the xeno-agent business layer into wolfharness as a first-class core infrastructure, while preserving xeno-agent-specific provider customizations. The redesign replaces the legacy string-based task ID API with a structured `TaskHandle` object pattern aligned with MCP SEP-1686, introduces configurable session-end lifecycle policies, and hard-cuts over from the old API without a compatibility layer. ### 1.2 Why This Matters Now @@ -55,14 +55,14 @@ The current BackgroundTask implementation lives entirely in `xeno-agent` and suf 1. **Fire-and-forget bug**: The `_notify_parent` callback uses `asyncio.create_task()` without `cancel_and_drain`, causing exceptions to be silently discarded when the parent session has ended. 2. **`parent_session_id` empty string bug**: Prevents auto-resume of background task completion notifications. 3. **String ID API**: The legacy API returns raw strings (`task_id`) with no structured handle, making it impossible to chain operations or attach metadata. -4. **No upstream standard**: Each downstream project reinvents background task patterns; agentpool lacks a unified abstraction. +4. **No upstream standard**: Each downstream project reinvents background task patterns; wolfharness lacks a unified abstraction. These issues block reliable multi-agent delegation workflows and create support burden. ### 1.3 Expected Outcome After implementation: -- **Unified infrastructure**: `BackgroundTaskManager` and `TaskHandle` are core agentpool primitives. +- **Unified infrastructure**: `BackgroundTaskManager` and `TaskHandle` are core wolfharness primitives. - **Structured API**: All background task operations return `TaskHandle` objects with typed methods (`status`, `result()`, `cancel()`). - **Session lifecycle integration**: Configurable `session_end_policy` controls what happens to background tasks when their parent session ends. - **SEP-1686 alignment**: API surface is compatible with MCP task semantics, enabling future protocol-native task support. @@ -80,7 +80,7 @@ The BackgroundTask system currently consists of three layers: |-------|----------|---------------| | **Core types** | `xeno_agent/task/types.py` | `BackgroundTask` dataclass, `TaskHandle` dataclass, `TaskStatus` literal | | **Lifecycle manager** | `xeno_agent/task/manager.py` | `BackgroundTaskManager` — semaphore, timeout, cancellation, cleanup | -| **Provider integration** | `xeno_agent/agentpool/resource_providers/background_task_provider.py` | Tool definitions (`task`, `background_output`, `background_cancel`) | +| **Provider integration** | `xeno_agent/wolfharness/resource_providers/background_task_provider.py` | Tool definitions (`task`, `background_output`, `background_cancel`) | The existing `BackgroundTaskProvider` exposes three tools: @@ -106,7 +106,7 @@ Key problems with this design: ### 2.2 Historical Context -The BackgroundTask system was initially designed as a xeno-agent-specific augmentation to agentpool's `subagent_tools.py`. The original RFC (RFC-0001-v2) explicitly stated: "xeno-agent layer优先:先在业务层验证,成熟后考虑 upstream 到 agentpool." After 3 months of production validation with 130+ tests, the pattern has proven stable enough to upstream. +The BackgroundTask system was initially designed as a xeno-agent-specific augmentation to wolfharness's `subagent_tools.py`. The original RFC (RFC-0001-v2) explicitly stated: "xeno-agent layer优先:先在业务层验证,成熟后考虑 upstream 到 wolfharness." After 3 months of production validation with 130+ tests, the pattern has proven stable enough to upstream. ### 2.3 Glossary @@ -115,7 +115,7 @@ The BackgroundTask system was initially designed as a xeno-agent-specific augmen | **BackgroundTask** | Serializable dataclass representing a task's metadata and lifecycle state | | **TaskHandle** | Runtime object wrapping an `asyncio.Task` with structured query/cancel methods | | **TaskStatus** | Literal union: `pending`, `running`, `cancelling`, `completed`, `error`, `cancelled`, `timed_out` | -| **SessionPool** | agentpool's session orchestration layer (`SessionPool` + `SessionController`) | +| **SessionPool** | wolfharness's session orchestration layer (`SessionPool` + `SessionController`) | | **session_end_policy** | Configuration controlling background task behavior on parent session end | | **SEP-1686** | MCP Specification Enhancement Proposal for asynchronous task tools | | **fire-and-forget** | Pattern of spawning async work without awaiting or cleanup; explicitly avoided | @@ -125,7 +125,7 @@ The BackgroundTask system was initially designed as a xeno-agent-specific augmen - **RFC-0021**: Introduced `AgentRunContext` for per-call state isolation; BackgroundTask redesign must respect per-run context boundaries. - **RFC-0026**: Per-session agent isolation ensures background tasks do not share `MessageHistory` across concurrent subagents. -- **RFC-0001 (agentpool)**: Workers and Teams session management establishes `SpawnSessionStart` patterns that background tasks must emit consistently. +- **RFC-0001 (wolfharness)**: Workers and Teams session management establishes `SpawnSessionStart` patterns that background tasks must emit consistently. ### 2.5 Cross-System Comparison: opencode @@ -180,7 +180,7 @@ opencode's "no status query" design works for its use case (short research tasks 3. **Empty `parent_session_id`**: Line 379 of `background_task_provider.py` falls back to `getattr(ctx.node, 'session_id', '')` — an empty string prevents `SessionPool.inject_prompt()` from routing the notification correctly. -4. **No upstream abstraction**: Every downstream project that wants background tasks must copy xeno-agent's implementation. There is no agentpool-native primitive. +4. **No upstream abstraction**: Every downstream project that wants background tasks must copy xeno-agent's implementation. There is no wolfharness-native primitive. 5. **String-based API**: Returning raw string IDs makes it impossible for the LLM to introspect task state without making another tool call. @@ -210,7 +210,7 @@ opencode's "no status query" design works for its use case (short research tasks ### 4.1 Goals (In Scope) -1. **Upstream core infrastructure**: `BackgroundTaskManager`, `TaskHandle`, and `TaskStatus` become agentpool core primitives. +1. **Upstream core infrastructure**: `BackgroundTaskManager`, `TaskHandle`, and `TaskStatus` become wolfharness core primitives. 2. **Structured API**: Replace string-ID returns with `TaskHandle` objects exposing `.status`, `.result()`, `.cancel()`. 3. **Session lifecycle integration**: Introduce `session_end_policy` with `cancel`, `keep`, and `notify` strategies. 4. **SEP-1686 alignment**: API signatures and semantics match MCP task tool patterns. @@ -225,16 +225,16 @@ opencode's "no status query" design works for its use case (short research tasks 1. **Not**: Implementing MCP server-side task support (SEP-1686 server changes are a separate effort). 2. **Not**: Persistent task storage across process restarts. -3. **Not**: Distributed task execution across multiple agentpool instances. +3. **Not**: Distributed task execution across multiple wolfharness instances. 4. **Not**: Changing the underlying LLM provider concurrency model. 5. **Not**: Adding new event types beyond what already exists (`SpawnSessionStart`, `SubAgentEvent`, `StreamCompleteEvent`). ### 4.3 Success Criteria -- [ ] `TaskHandle` is importable from `agentpool.tasks`. -- [ ] `BackgroundTaskManager` is importable from `agentpool.tasks`. +- [ ] `TaskHandle` is importable from `wolfharness.tasks`. +- [ ] `BackgroundTaskManager` is importable from `wolfharness.tasks`. - [ ] `session_end_policy` is configurable per `AgentPool` or per session. -- [ ] xeno-agent's `BackgroundTaskProvider` delegates to agentpool core. +- [ ] xeno-agent's `BackgroundTaskProvider` delegates to wolfharness core. - [ ] All 124 xeno-agent background task tests pass with new API. - [ ] No `asyncio.create_task()` without matching `cancel_and_drain` pattern. - [ ] Pydantic-AI `cancel_and_drain` is used in all cleanup paths. @@ -260,15 +260,15 @@ This section documents the four confirmed design decisions that govern the archi ### Q1: Where does the BackgroundTask infrastructure live? -**Decision: C — Hybrid approach: agentpool core infrastructure + xeno-agent specific Provider** +**Decision: C — Hybrid approach: wolfharness core infrastructure + xeno-agent specific Provider** **Rationale**: -The core lifecycle manager (`BackgroundTaskManager`), types (`TaskHandle`, `BackgroundTask`), and session integration belong in agentpool so all downstream projects benefit. However, the specific tool schemas, prompt formatting, and xeno-agent-specific behaviors (e.g., `load_skills` injection, XML prompt formatting) remain in xeno-agent's `BackgroundTaskProvider`. +The core lifecycle manager (`BackgroundTaskManager`), types (`TaskHandle`, `BackgroundTask`), and session integration belong in wolfharness so all downstream projects benefit. However, the specific tool schemas, prompt formatting, and xeno-agent-specific behaviors (e.g., `load_skills` injection, XML prompt formatting) remain in xeno-agent's `BackgroundTaskProvider`. **Scope split**: -| Component | agentpool (core) | xeno-agent (provider) | +| Component | wolfharness (core) | xeno-agent (provider) | |-----------|-----------------|----------------------| | `TaskHandle` | ✅ | ❌ | | `BackgroundTask` dataclass | ✅ | ❌ | @@ -284,8 +284,8 @@ The core lifecycle manager (`BackgroundTaskManager`), types (`TaskHandle`, `Back **Trade-offs**: - **Pro**: Downstream projects (xeno-rag, xeno-serve) can reuse core infrastructure. -- **Pro**: agentpool can integrate background tasks with `SessionPool` natively. -- **Con**: Slightly more complex import graph; xeno-agent depends on agentpool tasks. +- **Pro**: wolfharness can integrate background tasks with `SessionPool` natively. +- **Con**: Slightly more complex import graph; xeno-agent depends on wolfharness tasks. - **Con**: Core changes require coordinated releases. ### Q2: What is the API pattern for task handles? @@ -306,7 +306,7 @@ status = await background_output(task_id="bg_abc123", block=False) **New API** (SEP-1686 style): ```python -from agentpool.tasks import TaskHandle +from wolfharness.tasks import TaskHandle # Returns a structured handle handle: TaskHandle = await run_background_task(agent_mode="expert", prompt="analyze") @@ -343,7 +343,7 @@ await handle.cancel() **Rationale**: -A single hardcoded behavior cannot satisfy all use cases. Industrial diagnostics (`xeno-agent`) often needs `notify` so the fault expert receives completion prompts. Batch processing jobs need `keep`. Default agentpool behavior should be `cancel` for safety. +A single hardcoded behavior cannot satisfy all use cases. Industrial diagnostics (`xeno-agent`) often needs `notify` so the fault expert receives completion prompts. Batch processing jobs need `keep`. Default wolfharness behavior should be `cancel` for safety. **Implementation hook**: @@ -378,7 +378,7 @@ for task in task_manager.get_tasks_by_session(session_id): **Migration scope**: - `xeno-agent` tests: 124 test cases updated. -- `xeno-agent` provider: `BackgroundTaskProvider` rewritten to delegate to agentpool core. +- `xeno-agent` provider: `BackgroundTaskProvider` rewritten to delegate to wolfharness core. - `diag-agent.yaml`: Tool schema references updated. **Trade-offs**: @@ -455,10 +455,10 @@ Three options were considered: ### 7.2 Component Design -#### 7.2.1 `agentpool.tasks` Module (New) +#### 7.2.1 `wolfharness.tasks` Module (New) ```python -# agentpool/tasks/__init__.py +# wolfharness/tasks/__init__.py from __future__ import annotations from dataclasses import dataclass, field @@ -537,10 +537,10 @@ class TaskHandle: ... ``` -#### 7.2.2 `BackgroundTaskManager` (agentpool core) +#### 7.2.2 `BackgroundTaskManager` (wolfharness core) ```python -# agentpool/tasks/manager.py +# wolfharness/tasks/manager.py from __future__ import annotations import asyncio @@ -555,7 +555,7 @@ from .types import BackgroundTask, TaskHandle, TaskStatus, TERMINAL_STATES class BackgroundTaskManager: """Manages background task lifecycle, concurrency, timeout, and cleanup. - This is the agentpool-core equivalent of xeno-agent's + This is the wolfharness-core equivalent of xeno-agent's ``BackgroundTaskManager``, with these key differences: 1. Uses ``cancel_and_drain`` from pydantic-ai for all cleanup paths. @@ -788,10 +788,10 @@ No single layer is sufficient. Together, they create a gradient from "the LLM kn ## 8. API Design -### 8.1 agentpool Core API +### 8.1 wolfharness Core API ```python -# agentpool/tasks/__init__.py +# wolfharness/tasks/__init__.py from dataclasses import dataclass from datetime import datetime @@ -856,7 +856,7 @@ class BackgroundTaskManager: ### 8.2 xeno-agent Provider API (New Tools) ```python -# xeno_agent/agentpool/resource_providers/background_task_provider.py +# xeno_agent/wolfharness/resource_providers/background_task_provider.py async def run_background_task( ctx: AgentContext, @@ -952,7 +952,7 @@ agents: session_end_policy: notify # cancel | keep | notify tools: - type: custom - import_path: xeno_agent.agentpool.resource_providers.background_task_provider.XenoBackgroundTaskProvider + import_path: xeno_agent.wolfharness.resource_providers.background_task_provider.XenoBackgroundTaskProvider enabled_tools: - run_background_task - task_status @@ -969,9 +969,9 @@ agents: The `SessionController.close_session()` method is the hook point for policy enforcement: ```python -# agentpool/sessions/controller.py +# wolfharness/sessions/controller.py -from agentpool.tasks import BackgroundTaskManager +from wolfharness.tasks import BackgroundTaskManager class SessionController: def __init__(self, ..., task_manager: BackgroundTaskManager): @@ -1107,9 +1107,9 @@ status = handle.status # Query current status await handle.cancel() # Request cancellation ``` -### 11.2 agentpool-to-SEP-1686 Mapping +### 11.2 wolfharness-to-SEP-1686 Mapping -| SEP-1686 Concept | agentpool Equivalent | Notes | +| SEP-1686 Concept | wolfharness Equivalent | Notes | |-----------------|----------------------|-------| | `@tool(task=True)` | `run_background_task()` tool | Explicit tool, not decorator | | `TaskHandle.result()` | `TaskHandle.result()` | Direct equivalent | @@ -1119,11 +1119,11 @@ await handle.cancel() # Request cancellation ### 11.3 Future MCP Server Integration -When agentpool implements an MCP server with SEP-1686 support: +When wolfharness implements an MCP server with SEP-1686 support: ```python -# Future: agentpool MCP server -from agentpool.tasks import BackgroundTaskManager +# Future: wolfharness MCP server +from wolfharness.tasks import BackgroundTaskManager class AgentPoolMCPServer: def __init__(self, task_manager: BackgroundTaskManager): @@ -1161,8 +1161,8 @@ The following test files in `xeno-agent` must be updated: ### 12.2 Migration Checklist -- [ ] **Phase 0**: Create agentpool `tasks` module with `TaskHandle`, `BackgroundTask`, `BackgroundTaskManager`. -- [ ] **Phase 0**: Port `BackgroundTaskManager` from xeno-agent to agentpool, adding `cancel_and_drain` compliance. +- [ ] **Phase 0**: Create wolfharness `tasks` module with `TaskHandle`, `BackgroundTask`, `BackgroundTaskManager`. +- [ ] **Phase 0**: Port `BackgroundTaskManager` from xeno-agent to wolfharness, adding `cancel_and_drain` compliance. - [ ] **Phase 1**: Add `session_end_policy` to `SessionConfig` and enforcement in `SessionController`. - [ ] **Phase 2**: Rewrite xeno-agent `BackgroundTaskProvider`: - [ ] Replace `task()` with `run_background_task()` returning `TaskHandle`. @@ -1194,20 +1194,20 @@ The following test files in `xeno-agent` must be updated: ## 13. Implementation Plan -### Phase 0: agentpool Core (Week 1) +### Phase 0: wolfharness Core (Week 1) **Deliverables**: -- `agentpool/tasks/types.py` — `TaskStatus`, `BackgroundTask`, `TaskHandle` -- `agentpool/tasks/manager.py` — `BackgroundTaskManager` with `cancel_and_drain` -- `agentpool/tasks/__init__.py` — Public exports +- `wolfharness/tasks/types.py` — `TaskStatus`, `BackgroundTask`, `TaskHandle` +- `wolfharness/tasks/manager.py` — `BackgroundTaskManager` with `cancel_and_drain` +- `wolfharness/tasks/__init__.py` — Public exports - Unit tests for core manager (semaphore, timeout, cancellation, cleanup) **Files Modified**: -- `src/agentpool/tasks/` (new directory) -- `src/agentpool/sessions/controller.py` (session_end_policy hook) -- `src/agentpool/sessions/config.py` (session_end_policy field) +- `src/wolfharness/tasks/` (new directory) +- `src/wolfharness/sessions/controller.py` (session_end_policy hook) +- `src/wolfharness/sessions/config.py` (session_end_policy field) -**Rollback**: Delete `src/agentpool/tasks/` directory. +**Rollback**: Delete `src/wolfharness/tasks/` directory. ### Phase 1: Session Integration (Week 1-2) @@ -1217,9 +1217,9 @@ The following test files in `xeno-agent` must be updated: - `BackgroundTaskManager` session association methods **Files Modified**: -- `src/agentpool/sessions/config.py` -- `src/agentpool/sessions/controller.py` -- `src/agentpool/tasks/manager.py` +- `src/wolfharness/sessions/config.py` +- `src/wolfharness/sessions/controller.py` +- `src/wolfharness/tasks/manager.py` **Rollback**: Revert session controller changes. @@ -1231,7 +1231,7 @@ The following test files in `xeno-agent` must be updated: - Empty string `parent_session_id` fix **Files Modified**: -- `src/xeno_agent/agentpool/resource_providers/background_task_provider.py` +- `src/xeno_agent/wolfharness/resource_providers/background_task_provider.py` **Rollback**: Restore from git. @@ -1243,14 +1243,14 @@ The following test files in `xeno-agent` must be updated: - New tests for `TaskHandle` methods **Files Modified**: -- `tests/agentpool/resource_providers/test_background_task_*.py` +- `tests/wolfharness/resource_providers/test_background_task_*.py` **Rollback**: Restore from git. ### Dependencies -- agentpool Phase 0 must complete before xeno-agent Phase 2. -- agentpool Phase 1 must complete before xeno-agent test additions for `session_end_policy`. +- wolfharness Phase 0 must complete before xeno-agent Phase 2. +- wolfharness Phase 1 must complete before xeno-agent test additions for `session_end_policy`. --- @@ -1276,7 +1276,7 @@ The following test files in `xeno-agent` must be updated: - Owner: Performance - Status: Open -5. **Should agentpool expose a `@background_task` decorator for tool functions?** +5. **Should wolfharness expose a `@background_task` decorator for tool functions?** - Context: Would allow declarative background task registration. - Owner: API design - Status: Open @@ -1291,7 +1291,7 @@ The following test files in `xeno-agent` must be updated: - Owner: xeno-agent - Status: Open -8. **Should `list_tasks()` be a core agentpool tool or a xeno-agent provider tool?** +8. **Should `list_tasks()` be a core wolfharness tool or a xeno-agent provider tool?** - Context: Task listing is useful for any downstream project, but the markdown table format is presentation-level. - Owner: API design - Status: Open @@ -1323,7 +1323,7 @@ The following test files in `xeno-agent` must be updated: ### Key Discussion Points -1. **Why not Option A (all in agentpool)?** Would force xeno-agent's XML formatting and skill-loading into core, creating inappropriate coupling. +1. **Why not Option A (all in wolfharness)?** Would force xeno-agent's XML formatting and skill-loading into core, creating inappropriate coupling. 2. **Why not Option B (all in xeno-agent)?** Defeats the purpose of upstreaming proven infrastructure. 3. **Why not keep string IDs?** String parsing is error-prone and incompatible with MCP SEP-1686. 4. **Why not a compatibility layer?** Doubles maintenance burden for a single-consumer API. @@ -1331,11 +1331,11 @@ The following test files in `xeno-agent` must be updated: ### Conditions on Approval - [ ] At least 2 code reviewers approve -- [ ] agentpool core tests demonstrate 100% manager coverage +- [ ] wolfharness core tests demonstrate 100% manager coverage - [ ] All 124 xeno-agent tests pass with new API - [ ] Session-end policy tests cover all 3 variants - [ ] No `asyncio.create_task()` without matching cleanup in changed code -- [ ] Documentation updated (agentpool tasks module, xeno-agent migration guide) +- [ ] Documentation updated (wolfharness tasks module, xeno-agent migration guide) --- @@ -1346,11 +1346,11 @@ The following test files in `xeno-agent` must be updated: 1. **RFC-0001-v2 (xeno-agent)** — Original background task RFC Location: `packages/xeno-agent/docs/rfcs/RFC-0001-async-task-background-task-v2.md` -2. **RFC-0021 (agentpool)** — Agent Concurrent Execution Safety - Location: `packages/agentpool/docs/rfcs/implemented/RFC-0021-agent-concurrent-execution-safety.md` +2. **RFC-0021 (wolfharness)** — Agent Concurrent Execution Safety + Location: `packages/wolfharness/docs/rfcs/implemented/RFC-0021-agent-concurrent-execution-safety.md` 3. **BackgroundTaskProvider Implementation** - Location: `packages/xeno-agent/src/xeno_agent/agentpool/resource_providers/background_task_provider.py` + Location: `packages/xeno-agent/src/xeno_agent/wolfharness/resource_providers/background_task_provider.py` 4. **Research Findings** Location: `.omo/notepads/background-task-provider/learnings.md` @@ -1370,10 +1370,10 @@ The following test files in `xeno-agent` must be updated: |-----------|------| | xeno-agent BackgroundTaskManager | `packages/xeno-agent/src/xeno_agent/task/manager.py` | | xeno-agent BackgroundTask types | `packages/xeno-agent/src/xeno_agent/task/types.py` | -| xeno-agent BackgroundTaskProvider | `packages/xeno-agent/src/xeno_agent/agentpool/resource_providers/background_task_provider.py` | +| xeno-agent BackgroundTaskProvider | `packages/xeno-agent/src/xeno_agent/wolfharness/resource_providers/background_task_provider.py` | | Pydantic-AI cancel_and_drain | `packages/pydantic-ai/pydantic_ai_slim/pydantic_ai/_utils.py:223-240` | -| AgentPool SessionController | `packages/agentpool/src/agentpool/sessions/controller.py` | -| AgentPool SessionConfig | `packages/agentpool/src/agentpool/sessions/config.py` | +| AgentPool SessionController | `packages/wolfharness/src/wolfharness/sessions/controller.py` | +| AgentPool SessionConfig | `packages/wolfharness/src/wolfharness/sessions/config.py` | --- diff --git a/docs/rfcs/draft/RFC-0034-per-session-todo-tracker-isolation.md b/docs/rfcs/draft/RFC-0034-per-session-todo-tracker-isolation.md index 3868ce398..be759a752 100644 --- a/docs/rfcs/draft/RFC-0034-per-session-todo-tracker-isolation.md +++ b/docs/rfcs/draft/RFC-0034-per-session-todo-tracker-isolation.md @@ -120,7 +120,7 @@ When multiple sessions exist (ACP, OpenCode, or mixed), they all share a single ### Impact of Inaction -- **Risk**: Teams sharing an agentpool server see each other's task lists. This is a functional correctness issue, not just a UX concern. +- **Risk**: Teams sharing an wolfharness server see each other's task lists. This is a functional correctness issue, not just a UX concern. - **Risk**: Session restore (`load_session`, `resume_session`) cannot reconstruct the user's task list because todos are not persisted per-session. - **Cost**: ACP `AgentPlanUpdate` integration remains incomplete, blocking proper plan management for ACP-connected clients. - **Cost**: Memory waste — deleted sessions' todo entries accumulate in the global tracker with no eviction. @@ -521,7 +521,7 @@ async def _create_and_persist_session(self, session_id, parent_id): async def on_session_todo_change(t: TodoTracker) -> None: """Broadcast todo updates to this session only.""" - from agentpool_server.opencode_server.models.events import Todo, TodoUpdatedEvent + from wolfharness_server.opencode_server.models.events import Todo, TodoUpdatedEvent todos = [ Todo(id=e.id, content=e.content, status=e.status, priority=e.priority) for e in t.entries @@ -573,7 +573,7 @@ tracker = await self.agent_pool.aget_or_create_session_todos(session_id) async def on_acp_todo_change(t: TodoTracker) -> None: """Emit ACP AgentPlanUpdate when todos change.""" from acp.schema import AgentPlanUpdate, PlanEntry as ACPPlanEntry - from agentpool.utils.todos import PlanEntry + from wolfharness.utils.todos import PlanEntry entries = [ ACPPlanEntry(content=e.content, priority=e.priority, status=e.status) @@ -596,7 +596,7 @@ case AgentPlanUpdate(entries=entries): # Update per-session tracker with remote plan entries tracker = self._agent.agent_pool.get_session_todos(self._agent.session_id) if tracker is not None: - from agentpool.utils.todos import PlanEntry + from wolfharness.utils.todos import PlanEntry native_entries = [ PlanEntry(content=e.content, priority=e.priority, status=e.status) for e in entries @@ -778,12 +778,12 @@ Self-contained change. Revert by: ### Key Source Files -- `src/agentpool/utils/todos.py` — `TodoTracker`, `TodoEntry`, `PlanEntry` -- `src/agentpool/delegation/pool.py` — `AgentPool.todos` (global instance) -- `src/agentpool/resource_providers/plan_provider.py` — `PlanProvider` (tool implementation) -- `src/agentpool_server/opencode_server/server.py` — Global `on_todo_change` callback -- `src/agentpool_server/opencode_server/state.py` — `ServerState.todos` (in-memory cache) -- `src/agentpool_server/opencode_server/routes/session_routes.py` — `get_session_todos()` route -- `src/agentpool_server/acp_server/event_converter.py` — `PlanUpdateEvent` → `AgentPlanUpdate` -- `src/agentpool/agents/acp_agent/client_handler.py` — Unresolved `AgentPlanUpdate` TODO -- `src/agentpool/agents/codex_agent/codex_agent.py` — `pool.todos.replace_all()` sync +- `src/wolfharness/utils/todos.py` — `TodoTracker`, `TodoEntry`, `PlanEntry` +- `src/wolfharness/delegation/pool.py` — `AgentPool.todos` (global instance) +- `src/wolfharness/resource_providers/plan_provider.py` — `PlanProvider` (tool implementation) +- `src/wolfharness_server/opencode_server/server.py` — Global `on_todo_change` callback +- `src/wolfharness_server/opencode_server/state.py` — `ServerState.todos` (in-memory cache) +- `src/wolfharness_server/opencode_server/routes/session_routes.py` — `get_session_todos()` route +- `src/wolfharness_server/acp_server/event_converter.py` — `PlanUpdateEvent` → `AgentPlanUpdate` +- `src/wolfharness/agents/acp_agent/client_handler.py` — Unresolved `AgentPlanUpdate` TODO +- `src/wolfharness/agents/codex_agent/codex_agent.py` — `pool.todos.replace_all()` sync diff --git a/docs/rfcs/draft/RFC-0035-mcp-over-acp-complete-connection-chain.md b/docs/rfcs/draft/RFC-0035-mcp-over-acp-complete-connection-chain.md index 45a72f938..7984210eb 100644 --- a/docs/rfcs/draft/RFC-0035-mcp-over-acp-complete-connection-chain.md +++ b/docs/rfcs/draft/RFC-0035-mcp-over-acp-complete-connection-chain.md @@ -50,7 +50,7 @@ RFC-0033 已经实现了: ### MCP 客户端完整生命周期(Non-ACP 传输) -对于 stdio/SSE/HTTP 传输的 MCP server,agentpool 已经有一套成熟的连接链: +对于 stdio/SSE/HTTP 传输的 MCP server,wolfharness 已经有一套成熟的连接链: ``` session/new @@ -69,8 +69,8 @@ session/new ``` 关键组件: -- **`MCPResourceProvider`**(`agentpool/resource_providers/mcp_provider.py`):MCP server 的 ResourceProvider 包装,管理工具/提示/资源的生命周期 -- **`MCPClient`**(`agentpool/mcp_server/client.py`):fastmcp Client 的包装,处理连接、重连、消息路由 +- **`MCPResourceProvider`**(`wolfharness/resource_providers/mcp_provider.py`):MCP server 的 ResourceProvider 包装,管理工具/提示/资源的生命周期 +- **`MCPClient`**(`wolfharness/mcp_server/client.py`):fastmcp Client 的包装,处理连接、重连、消息路由 - **`fastmcp.Client`**:底层 MCP 客户端,负责 JSON-RPC 协议握手 ### ACP-transport MCP 当前状态 @@ -91,12 +91,12 @@ session/new 已实现的组件(RFC-0033): - **`AcpMcpConnectionManager`**:管理 `connectionId → AcpMcpConnection` 映射 - **`AcpMcpConnection`**:持有内存流和 `send_to_client` 回调 -- **`AcpMcpTransport`**(`agentpool_server/acp_server/acp_mcp_transport.py`):实现了 `fastmcp.ClientTransport` 接口,将内存流包装为 fastmcp 可用的传输层 +- **`AcpMcpTransport`**(`wolfharness_server/acp_server/acp_mcp_transport.py`):实现了 `fastmcp.ClientTransport` 接口,将内存流包装为 fastmcp 可用的传输层 未实现的组件: - **没有代码创建 fastmcp Client**:`AcpMcpTransport` 已经就绪,但没有任何地方调用 `fastmcp.Client(AcpMcpTransport(...))` - **没有 MCP initialize 握手**:即使创建了 Client,也需要进入 async context 才能触发 fastmcp 的自动初始化 -- **没有工具注册**:`tools/list` 的结果需要转换为 agentpool 的 `Tool` 对象并注册到 Agent 运行时 +- **没有工具注册**:`tools/list` 的结果需要转换为 wolfharness 的 `Tool` 对象并注册到 Agent 运行时 ### 现有代码的关键限制 @@ -401,7 +401,7 @@ ACPSession #### 1. MCPClient._get_client() 支持 ACP ```python -# agentpool/mcp_server/client.py +# wolfharness/mcp_server/client.py case AcpMCPServerConfig(acp_id=acp_id): # AcpMcpTransport 延迟初始化:在 connect() 时从 manager 获取连接 @@ -411,7 +411,7 @@ case AcpMCPServerConfig(acp_id=acp_id): #### 2. AcpMcpTransport 支持延迟初始化 ```python -# agentpool_server/acp_server/acp_mcp_transport.py +# wolfharness_server/acp_server/acp_mcp_transport.py class AcpMcpTransport(ClientTransport): def __init__(self, acp_id: str) -> None: @@ -428,7 +428,7 @@ class AcpMcpTransport(ClientTransport): #### 3. session.py 中 ACP server 的初始化流程 ```python -# agentpool_server/acp_server/session.py +# wolfharness_server/acp_server/session.py async def initialize_mcp_servers(self) -> None: for server in self.mcp_servers: @@ -565,12 +565,12 @@ async def initialize_mcp_servers(self) -> None: | 文件 | 说明 | |------|------| -| `agentpool/mcp_server/client.py` | MCPClient,需修改 `_get_client()` | -| `agentpool/resource_providers/mcp_provider.py` | MCPResourceProvider,工具注册 | -| `agentpool_server/acp_server/acp_mcp_transport.py` | AcpMcpTransport,需支持延迟初始化 | -| `agentpool_server/acp_server/acp_agent.py` | connect_acp_mcp_server() | -| `agentpool_server/acp_server/session.py` | initialize_mcp_servers() | -| `agentpool_server/acp_server/acp_mcp_manager.py` | AcpMcpConnectionManager | +| `wolfharness/mcp_server/client.py` | MCPClient,需修改 `_get_client()` | +| `wolfharness/resource_providers/mcp_provider.py` | MCPResourceProvider,工具注册 | +| `wolfharness_server/acp_server/acp_mcp_transport.py` | AcpMcpTransport,需支持延迟初始化 | +| `wolfharness_server/acp_server/acp_agent.py` | connect_acp_mcp_server() | +| `wolfharness_server/acp_server/session.py` | initialize_mcp_servers() | +| `wolfharness_server/acp_server/acp_mcp_manager.py` | AcpMcpConnectionManager | ### External Resources diff --git a/docs/rfcs/draft/RFC-0036-mcp-over-acp-test-coverage.md b/docs/rfcs/draft/RFC-0036-mcp-over-acp-test-coverage.md index 3ea133676..fd352ec1f 100644 --- a/docs/rfcs/draft/RFC-0036-mcp-over-acp-test-coverage.md +++ b/docs/rfcs/draft/RFC-0036-mcp-over-acp-test-coverage.md @@ -264,7 +264,7 @@ MCP-over-ACP 的测试覆盖存在系统性缺口。当前测试主要覆盖: **Description** 启动完整的 AgentPool ACP server 和 mock ACP client 进程,通过真实 ACP 协议通信: -- 使用 `agentpool serve-acp` 启动 server +- 使用 `wolfharness serve-acp` 启动 server - 使用 Python subprocess 启动 mock client(通过 stdio 或 WebSocket 连接) - 发送真实的 JSON-RPC 请求,验证响应 @@ -693,13 +693,13 @@ class MockACPClientWithoutSendRequest: | 文件 | 说明 | |------|------| -| `tests/agentpool_server/acp_server/test_acp_mcp_manager.py` | 现有 manager 测试 | -| `tests/agentpool_server/acp_server/test_acp_mcp_transport.py` | 现有 transport 测试 | +| `tests/wolfharness_server/acp_server/test_acp_mcp_manager.py` | 现有 manager 测试 | +| `tests/wolfharness_server/acp_server/test_acp_mcp_transport.py` | 现有 transport 测试 | | `tests/servers/acp_server/test_mcp_integration.py` | 现有 MCP 集成测试 | -| `src/agentpool_server/acp_server/acp_mcp_transport.py` | Transport 实现 | -| `src/agentpool_server/acp_server/acp_mcp_manager.py` | Manager 实现 | -| `src/agentpool/mcp_server/client.py` | MCPClient | -| `src/agentpool/resource_providers/mcp_provider.py` | MCPResourceProvider | +| `src/wolfharness_server/acp_server/acp_mcp_transport.py` | Transport 实现 | +| `src/wolfharness_server/acp_server/acp_mcp_manager.py` | Manager 实现 | +| `src/wolfharness/mcp_server/client.py` | MCPClient | +| `src/wolfharness/resource_providers/mcp_provider.py` | MCPResourceProvider | ### External Resources diff --git a/docs/rfcs/draft/RFC-0038-eliminate-pool-level-agents.md b/docs/rfcs/draft/RFC-0038-eliminate-pool-level-agents.md index fc3ac9a56..3813d734a 100644 --- a/docs/rfcs/draft/RFC-0038-eliminate-pool-level-agents.md +++ b/docs/rfcs/draft/RFC-0038-eliminate-pool-level-agents.md @@ -61,7 +61,7 @@ AgentPool does not leverage these capabilities. It calls `cfg.get_agent()` eager ### Historical Precedent in AgentPool -- `2026-06-17-thin-agentpool-core` (archived OpenSpec change): Already thinned agent types from 5 → 2 (native + acp), removing ~16K LOC. The `file` agent type was deliberately kept as a "config-only" mechanism — proving this pattern is viable. +- `2026-06-17-thin-wolfharness-core` (archived OpenSpec change): Already thinned agent types from 5 → 2 (native + acp), removing ~16K LOC. The `file` agent type was deliberately kept as a "config-only" mechanism — proving this pattern is viable. - `2026-06-03-thin-pydantic-ai-wrappers` (archived): Established the "Complement, Don't Wrap" vision. Event stream thinning was deferred (Phase 2g, never implemented). - `refactor-skills-as-capabilities` (active OpenSpec change): Already implements lazy MCP server connections — servers connect on first tool call, not activation. @@ -469,7 +469,7 @@ Each phase is independently revertible via git. Phase 1 can ship alone (adds API 3. **What about programmatic `Agent` construction (not from config)?** - `AgentPool.__init__()` currently supports `manifest=None` (empty config) and programmatic `add_agent(agent_instance)`. The programmatic path should remain for direct agent construction use cases. -4. **Does this affect `agentpool run "prompt"` CLI?** +4. **Does this affect `wolfharness run "prompt"` CLI?** - Yes. The CLI currently calls `pool.get_agent(name).run(prompt)`. It should instead create a session via SessionPool or directly call `cfg.get_agent().run(prompt)`. 5. **Should `AgentPool` still extend `BaseRegistry[NodeName, MessageNode]`?** diff --git a/docs/rfcs/draft/RFC-0039-acp-subagent-zed-protocol-upgrade.md b/docs/rfcs/draft/RFC-0039-acp-subagent-zed-protocol-upgrade.md index 875c414e7..1a2a8dc38 100644 --- a/docs/rfcs/draft/RFC-0039-acp-subagent-zed-protocol-upgrade.md +++ b/docs/rfcs/draft/RFC-0039-acp-subagent-zed-protocol-upgrade.md @@ -992,17 +992,17 @@ Phase 2 和 Phase 3 可并行执行,均依赖 Phase 1。 ### AgentPool 源码 -- `packages/agentpool/src/agentpool_server/acp_server/event_converter.py` — 核心 ACP 事件转换器(723 行,活跃) -- `packages/agentpool/src/agentpool_server/acp_server/handler.py` — 协议处理器(521 行) -- `packages/agentpool/src/agentpool_server/mixins.py` — `ProtocolEventConsumerMixin`(258 行,`_consumer_done_events` 在 line 60,`_consumer_task_refs` 在 line 61,`_after_consumer_loop` 在 line 91-100) -- `packages/agentpool/src/agentpool/agents/context.py` — `AgentRunContext.create_child_session()`(line 231-276) -- `packages/agentpool/src/agentpool_server/acp_server/session.py` — ACP session 管理(929 行) -- `packages/agentpool/src/acp/schema/tool_call.py` — `SubagentRunInfo` 定义 -- `packages/agentpool/src/acp/schema/base.py` — `AnnotatedObject` 基类,`field_meta` 字段 -- `packages/agentpool_toolsets/builtin/subagent_tools.py` — subagent tool 实现(3 处手动 SpawnSessionStart 之一) -- `packages/agentpool_toolsets/builtin/workers.py` — worker tool 实现(3 处之二) -- `packages/agentpool/src/agentpool/delegation/team.py` — team 实现(使用 yield 模式,不受 auto-emit 影响) -- `packages/agentpool/src/agentpool/delegation/teamrun.py` — sequential team 实现(同 team.py,使用 yield 模式) +- `packages/wolfharness/src/wolfharness_server/acp_server/event_converter.py` — 核心 ACP 事件转换器(723 行,活跃) +- `packages/wolfharness/src/wolfharness_server/acp_server/handler.py` — 协议处理器(521 行) +- `packages/wolfharness/src/wolfharness_server/mixins.py` — `ProtocolEventConsumerMixin`(258 行,`_consumer_done_events` 在 line 60,`_consumer_task_refs` 在 line 61,`_after_consumer_loop` 在 line 91-100) +- `packages/wolfharness/src/wolfharness/agents/context.py` — `AgentRunContext.create_child_session()`(line 231-276) +- `packages/wolfharness/src/wolfharness_server/acp_server/session.py` — ACP session 管理(929 行) +- `packages/wolfharness/src/acp/schema/tool_call.py` — `SubagentRunInfo` 定义 +- `packages/wolfharness/src/acp/schema/base.py` — `AnnotatedObject` 基类,`field_meta` 字段 +- `packages/wolfharness_toolsets/builtin/subagent_tools.py` — subagent tool 实现(3 处手动 SpawnSessionStart 之一) +- `packages/wolfharness_toolsets/builtin/workers.py` — worker tool 实现(3 处之二) +- `packages/wolfharness/src/wolfharness/delegation/team.py` — team 实现(使用 yield 模式,不受 auto-emit 影响) +- `packages/wolfharness/src/wolfharness/delegation/teamrun.py` — sequential team 实现(同 team.py,使用 yield 模式) ### 相关 RFC diff --git a/docs/rfcs/draft/RFC-0041-loop-run-separation.md b/docs/rfcs/draft/RFC-0041-loop-run-separation.md index 9cacd9057..094eb11af 100644 --- a/docs/rfcs/draft/RFC-0041-loop-run-separation.md +++ b/docs/rfcs/draft/RFC-0041-loop-run-separation.md @@ -104,7 +104,7 @@ pydantic-ai (installed at `.venv/lib/python3.13/site-packages/pydantic_ai/`) pro **Critical iteration requirement**: `AgentRun.next(node)` must be used instead of bare `async for node in agent_run` — the latter skips all capability hooks including `PendingMessageDrainCapability`'s drain logic. The current `RunExecutor` already uses `next(node)` correctly. -**Note on naming**: pydantic-ai's `AgentRun` is an internal implementation detail of a single reactive cycle. In this RFC, we call the reactive cycle a **Turn** and use `agent_run` as a local variable name inside `NativeTurn.execute()`. There is no naming conflict because `AgentRun` is never exposed to agentpool users. +**Note on naming**: pydantic-ai's `AgentRun` is an internal implementation detail of a single reactive cycle. In this RFC, we call the reactive cycle a **Turn** and use `agent_run` as a local variable name inside `NativeTurn.execute()`. There is no naming conflict because `AgentRun` is never exposed to wolfharness users. ### anyio Primitives Available @@ -121,7 +121,7 @@ pydantic-ai (installed at `.venv/lib/python3.13/site-packages/pydantic_ai/`) pro - **RFC-0029** (2026-04-26): Introduced `inject_prompt()`/`queue_prompt()` with `asyncio.Event` notification for agent reactivation between `run_stream()` calls. This was the first attempt at "idle" semantics — the agent provides the signal, the caller provides the reactivation loop. - **RFC-0037** (2026-06-15): Proposed unifying `steer()`/`followup()` by mapping to pydantic-ai's `enqueue()` for native agents. Recognized the dual-system redundancy but kept the per-RunHandle lifecycle. - **`introduce-anyio-structured-concurrency`** OpenSpec change (completed): Established the CancelScope hierarchy (pool→session→agent run→subagent run). `RunHandle._cleanup_run()` sets `complete_event` in `anyio.CancelScope(shield=True)`. -- **ACP v2 Prompt Lifecycle RFD** (by @benbrandt): Proposes `session/prompt` returning on accept (fire-and-forget), with turn lifecycle communicated via `state_change` notifications. **PR #1261** (`session/inject` by @kennethsinder) adds `mode: "queue" | "steer"` — directly mapping to agentpool's `followup()` / `steer()`. +- **ACP v2 Prompt Lifecycle RFD** (by @benbrandt): Proposes `session/prompt` returning on accept (fire-and-forget), with turn lifecycle communicated via `state_change` notifications. **PR #1261** (`session/inject` by @kennethsinder) adds `mode: "queue" | "steer"` — directly mapping to wolfharness's `followup()` / `steer()`. ### Glossary @@ -351,7 +351,7 @@ The agent run never exits `async with agent.iter()` — it loops within the grap - Idle lives entirely within pydantic-ai's graph model — all capability hooks fire correctly - `after_node_run` redirect is an established pattern (`PendingMessageDrainCapability` already uses it) -- No agentpool-level Run concept needed — the graph itself persists +- No wolfharness-level Run concept needed — the graph itself persists **Disadvantages** @@ -966,7 +966,7 @@ class NativeTurn(Turn): | Method | Source / Implementation | |--------|------------------------| | `self._agent._build_deps(run_ctx)` | Wraps existing `self._agent.get_context(input_provider=..., run_ctx=run_ctx)` — to be extracted as a method on `NativeAgent` during Phase 1 implementation | -| `self._agent._is_terminal_tool(tool_name)` | Delegates to `agentpool.tools.base.is_terminal_tool()` — to be wrapped as a method on `NativeAgent` during Phase 1 | +| `self._agent._is_terminal_tool(tool_name)` | Delegates to `wolfharness.tools.base.is_terminal_tool()` — to be wrapped as a method on `NativeAgent` during Phase 1 | | `ChatMessage.from_model_message(last)` | Constructs `ChatMessage` from a `ModelMessage` — to be implemented as a classmethod during Phase 1 (current code uses `ChatMessage.from_run_result()` at run_executor.py L330; this is a simplification) | | `convert_acp_to_model_messages(acp_messages)` | Converts ACP message format to `list[ModelMessage]` — to be implemented in `agents/acp_agent/` during Phase 2 | | `ACPTurn._map_acp_event(event)` | Maps ACP stream events to `RichAgentStreamEvent` — to be implemented in Phase 2, delegates to `EventMapper` where event types overlap | diff --git a/docs/rfcs/draft/RFC-0042-unified-lifecycle-architecture.md b/docs/rfcs/draft/RFC-0042-unified-lifecycle-architecture.md index e5c774f61..7df9931c1 100644 --- a/docs/rfcs/draft/RFC-0042-unified-lifecycle-architecture.md +++ b/docs/rfcs/draft/RFC-0042-unified-lifecycle-architecture.md @@ -204,7 +204,7 @@ AgentPool has 5 different entry points for agent execution, each with its own li | `agent.run_stream()` | `agents/base_agent.py` | Same, but yields events | | `SessionController.receive_request()` | `orchestrator/session_controller.py` | `RunHandle` (RFC-0041) | | `BackgroundTaskProvider` | `tool_impls/workers/` | Manual task management | -| `WatchCommand` | `agentpool_commands/` | CLI-managed loop | +| `WatchCommand` | `wolfharness_commands/` | CLI-managed loop | No shared abstraction connects them. Adding a new execution mode (e.g., channel gateway) requires building an entirely new entry point. @@ -492,8 +492,8 @@ from __future__ import annotations from typing import TYPE_CHECKING, Protocol, runtime_checkable if TYPE_CHECKING: - from agentpool.orchestrator.turn import Turn - from agentpool.agents.events import RichAgentStreamEvent + from wolfharness.orchestrator.turn import Turn + from wolfharness.agents.events import RichAgentStreamEvent class RunLoop: """Core execution loop. Built on RFC-0041's restructured RunHandle. @@ -1622,14 +1622,14 @@ class MessageQueueTransport(EventTransport): type: message_queue backend: redis_streams # or nats_jetstream, kafka url: "redis://localhost:6379" - topic_prefix: "agentpool" + topic_prefix: "wolfharness" """ def __init__( self, backend: str, # "redis_streams" | "nats_jetstream" | "kafka" url: str, - topic_prefix: str = "agentpool", + topic_prefix: str = "wolfharness", ) -> None: self._backend = self._create_backend(backend, url) ... diff --git a/docs/rfcs/draft/RFC-0050-agentwolf-v1-foundation-architecture.md b/docs/rfcs/draft/RFC-0050-agentwolf-v1-foundation-architecture.md index 980eac2af..83704e2b6 100644 --- a/docs/rfcs/draft/RFC-0050-agentwolf-v1-foundation-architecture.md +++ b/docs/rfcs/draft/RFC-0050-agentwolf-v1-foundation-architecture.md @@ -60,14 +60,14 @@ The codebase has 9 top-level packages under `src/`: | Package | Role | |---------|------| -| `agentpool/` | Core agent framework (agents, delegation, messaging, tools, models, prompts, storage, hooks, observability) | -| `agentpool_config/` | YAML schema definitions (config models, separated for clean imports) | -| `agentpool_server/` | Protocol servers (ACP, OpenCode, AG-UI, OpenAI API, MCP) | -| `agentpool_toolsets/` | Reusable toolset implementations (builtin, MCP discovery, specialized) | -| `agentpool_storage/` | Storage providers (SQL, Zed, Claude, OpenCode) | -| `agentpool_cli/` | Command-line interface | -| `agentpool_commands/` | Command implementations | -| `agentpool_prompts/` | Prompt templates | +| `wolfharness/` | Core agent framework (agents, delegation, messaging, tools, models, prompts, storage, hooks, observability) | +| `wolfharness_config/` | YAML schema definitions (config models, separated for clean imports) | +| `wolfharness_server/` | Protocol servers (ACP, OpenCode, AG-UI, OpenAI API, MCP) | +| `wolfharness_toolsets/` | Reusable toolset implementations (builtin, MCP discovery, specialized) | +| `wolfharness_storage/` | Storage providers (SQL, Zed, Claude, OpenCode) | +| `wolfharness_cli/` | Command-line interface | +| `wolfharness_commands/` | Command implementations | +| `wolfharness_prompts/` | Prompt templates | | `acp/` | ACP protocol implementation (client, agent, schema, bridge, transports) | ### Cross-Framework Research Summary @@ -476,7 +476,7 @@ host: storage: provider: sql - database: "sqlite:///agentpool.db" + database: "sqlite:///wolfharness.db" observability: logfire: {enabled: true} @@ -2170,7 +2170,7 @@ Each phase is independently deployable: 3. **RunScope propagation**: Should RunScope be explicitly passed to every method, or stored in a context variable (contextvars)? (Recommendation: context variable for ergonomics, explicitly passed at layer boundaries.) -4. **Package naming**: Should v1.0 use `agentwolf_*` or keep `agentpool_*` package names? (Recommendation: keep `agentpool_*` for backward compatibility; `agentwolf` is an internal codename.) +4. **Package naming**: Should v1.0 use `agentwolf_*` or keep `wolfharness_*` package names? (Recommendation: keep `wolfharness_*` for backward compatibility; `agentwolf` is an internal codename.) 5. **AgentFactory pre-compilation**: Should teams/graphs always be pre-compiled, or allow lazy compilation for dynamic topologies? (Recommendation: pre-compile by default, `factory_mode: lazy` opt-in for dynamic use cases.) diff --git a/docs/rfcs/draft/RFC-0052-restore-skill-capabilities.md b/docs/rfcs/draft/RFC-0052-restore-skill-capabilities.md index 6d458985a..11364ee69 100644 --- a/docs/rfcs/draft/RFC-0052-restore-skill-capabilities.md +++ b/docs/rfcs/draft/RFC-0052-restore-skill-capabilities.md @@ -62,7 +62,7 @@ Each step's spec approval was siloed. The top-level `specs/` directory was updat ### Evidence of Problem -1. **ACP server logs** (`~/Library/Logs/agentpool/acp.log`): Agent errors with `'FunctionTool' object has no attribute '__name__'` when trying to load skills. +1. **ACP server logs** (`~/Library/Logs/wolfharness/acp.log`): Agent errors with `'FunctionTool' object has no attribute '__name__'` when trying to load skills. 2. **User report**: Agent cannot access `load_skill` tool or resolve `skill://` URIs after M3 refactor. diff --git a/docs/rfcs/draft/RFC-0053-pre-m4-protocol-debt-cleanup.md b/docs/rfcs/draft/RFC-0053-pre-m4-protocol-debt-cleanup.md index ab0be7bda..4f331de17 100644 --- a/docs/rfcs/draft/RFC-0053-pre-m4-protocol-debt-cleanup.md +++ b/docs/rfcs/draft/RFC-0053-pre-m4-protocol-debt-cleanup.md @@ -112,8 +112,8 @@ graph TD ``` - `grep -rn 'hooks_fired' src/` → 21 results across 4 files -- `grep -rn '# type: ignore' src/agentpool/orchestrator/run.py` → 8 results -- `grep -rn 'state\.pool\.' src/agentpool_server/opencode_server/` → 68 results +- `grep -rn '# type: ignore' src/wolfharness/orchestrator/run.py` → 8 results +- `grep -rn 'state\.pool\.' src/wolfharness_server/opencode_server/` → 68 results - `grep -rn '_mcp_snapshot\|_session_connection_pool' src/` → results in agent.py + session.py - `RunHandle.start()` → ~373 SLOC with `# noqa: PLR0915` @@ -147,7 +147,7 @@ graph TD ### Non-Goals (Out of Scope — Deferred) -6. AgentWolf rename (`agentpool` → `agentwolf`) — deferred to final phase +6. AgentWolf rename (`wolfharness` → `agentwolf`) — deferred to final phase 7. M4 implementation itself (ConfigRegistry, HostRegistry, RunScope routing) 8. ACP protocol version switch or proxy chain refactor 9. `session_pool_integration.py` file split (1,453 LOC) — optional, can defer @@ -156,11 +156,11 @@ graph TD ### Success Criteria - [ ] `grep -rn 'hooks_fired' src/` returns 0 -- [ ] `grep -rn 'type: ignore\[attr-defined\]' src/agentpool/orchestrator/run.py` returns 0 +- [ ] `grep -rn 'type: ignore\[attr-defined\]' src/wolfharness/orchestrator/run.py` returns 0 - [ ] `grep -rn '_mcp_snapshot\|_session_connection_pool' src/` returns 0 - [ ] `grep -rn 'RunStatus' src/` returns 0 - [ ] `grep -rn 'host_context.pool' src/` returns 0 -- [ ] `grep -rn '_replaying' src/agentpool/orchestrator/run.py` returns 0 +- [ ] `grep -rn '_replaying' src/wolfharness/orchestrator/run.py` returns 0 - [ ] `uv run pytest` — all tests pass - [ ] `uv run ruff check src/` — no new lint errors - [ ] `uv run --no-group docs mypy src/` — no new type errors @@ -869,7 +869,7 @@ TBD ### External Resources -- [PR #144: refactor/agentwolf v1](https://github.com/Leoyzen/agentpool/pull/144) +- [PR #144: refactor/agentwolf v1](https://github.com/Leoyzen/wolfharness/pull/144) ### Appendix diff --git a/docs/rfcs/draft/RFC-0055-dynamic-team-mode.md b/docs/rfcs/draft/RFC-0055-dynamic-team-mode.md index 5af814372..aba92a0ff 100644 --- a/docs/rfcs/draft/RFC-0055-dynamic-team-mode.md +++ b/docs/rfcs/draft/RFC-0055-dynamic-team-mode.md @@ -121,7 +121,7 @@ This workflow cannot be expressed as a static DAG because: ### Evidence -- GitHub Discussion #160 (Leoyzen/agentpool) documents the architectural proposal and received community feedback +- GitHub Discussion #160 (Leoyzen/wolfharness) documents the architectural proposal and received community feedback - The comparative survey (`docs/survey/multi-agent-orchestration/`) identified LLM-driven team creation as the dominant pattern in production frameworks (Qwen Code, OMO) - Three real-world scenarios (industrial diagnosis, manual translation, sales assistant) were analyzed and all require dynamic team composition @@ -490,8 +490,8 @@ graph TB # capabilities/team_comm_capability.py from __future__ import annotations from collections.abc import Sequence -from agentpool.capabilities.abstract_capability import AbstractCapability -from agentpool.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.capabilities.abstract_capability import AbstractCapability +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability class TeamCommCapability(FunctionToolsetCapability[AgentDepsT]): """Exposes team communication tools to agents. @@ -1056,7 +1056,7 @@ team_mode: lead_eligible: [orchestrator] # Storage (tempdir-based, not .omo/) - base_dir: /tmp/agentpool/teams + base_dir: /tmp/wolfharness/teams ttl_hours: 72 # Bounds (guardrails for LLM-driven team creation) @@ -1270,8 +1270,8 @@ No specific regulatory requirements. Team state is ephemeral coordination data, - **Scope**: FileTeamState + TeamModeConfig - **Deliverables**: - `capabilities/file_team_state.py` — File I/O for inbox/tasks/blackboard - - `agentpool_config/team_mode.py` — Config model - - `agentpool_config/manifest.py` — +1 field (team_mode) + - `wolfharness_config/team_mode.py` — Config model + - `wolfharness_config/manifest.py` — +1 field (team_mode) - TTL cleanup background task - **Dependencies**: None - **Testing**: Unit test file operations, concurrent access, TTL cleanup @@ -1432,8 +1432,8 @@ None. All reviewers converged on Option 2 after analysis of the BT precedent and - Multi-Agent Orchestration Survey - Survey: Comparison Matrix - Survey: Recommendations -- [GitHub Discussion #160: Team Agent 架构设计](https://github.com/Leoyzen/agentpool/discussions/160) -- [Qwen Code Deep Dive (Discussion #160 comment)](https://github.com/Leoyzen/agentpool/discussions/160#discussioncomment-17637183) +- [GitHub Discussion #160: Team Agent 架构设计](https://github.com/Leoyzen/wolfharness/discussions/160) +- [Qwen Code Deep Dive (Discussion #160 comment)](https://github.com/Leoyzen/wolfharness/discussions/160#discussioncomment-17637183) - [RFC-0042: Unified Lifecycle Architecture](./RFC-0042-unified-lifecycle-architecture.md) - [RFC-0037: Unify Steer and Followup](./RFC-0037-unify-steer-followup.md) @@ -1469,10 +1469,10 @@ None. All reviewers converged on Option 2 after analysis of the BT precedent and |------|------|-----------| | `capabilities/team_comm_capability.py` | New — Capability (direct SessionPool access + defaults hook) | ~380 | | `capabilities/file_team_state.py` | New — File I/O | ~250 | -| `agentpool_config/team_mode.py` | New — Config model | ~80 | +| `wolfharness_config/team_mode.py` | New — Config model | ~80 | | `capabilities/agent_context.py` | Modified — +1 field (team_mode_config) | ~1 | | `orchestrator/run.py` | Modified — +1 line (team_mode_config injection) | ~1 | -| `agentpool_config/manifest.py` | Modified — +1 field (team_mode) | ~2 | +| `wolfharness_config/manifest.py` | Modified — +1 field (team_mode) | ~2 | | **Total new** | 3 files | ~680 | | **Total modified** | 3 files | ~4 lines | diff --git a/docs/rfcs/implemented/RFC-0001-workers-teams-session-management.md b/docs/rfcs/implemented/RFC-0001-workers-teams-session-management.md index 8a1c559cd..a862802af 100644 --- a/docs/rfcs/implemented/RFC-0001-workers-teams-session-management.md +++ b/docs/rfcs/implemented/RFC-0001-workers-teams-session-management.md @@ -652,12 +652,12 @@ If issues are discovered: ### Related Documents -- Subagent implementation: `src/agentpool_toolsets/builtin/subagent_tools.py` -- Workers implementation: `src/agentpool_toolsets/builtin/workers.py` -- Team implementation: `src/agentpool/delegation/team.py` -- TeamRun implementation: `src/agentpool/delegation/teamrun.py` -- Event definitions: `src/agentpool/agents/events/events.py` -- Session ID generation: `src/agentpool/utils/identifiers.py` +- Subagent implementation: `src/wolfharness_toolsets/builtin/subagent_tools.py` +- Workers implementation: `src/wolfharness_toolsets/builtin/workers.py` +- Team implementation: `src/wolfharness/delegation/team.py` +- TeamRun implementation: `src/wolfharness/delegation/teamrun.py` +- Event definitions: `src/wolfharness/agents/events/events.py` +- Session ID generation: `src/wolfharness/utils/identifiers.py` ### External Resources diff --git a/docs/rfcs/implemented/RFC-0002-extended-tool-definition.md b/docs/rfcs/implemented/RFC-0002-extended-tool-definition.md index 6005c177b..21e377432 100644 --- a/docs/rfcs/implemented/RFC-0002-extended-tool-definition.md +++ b/docs/rfcs/implemented/RFC-0002-extended-tool-definition.md @@ -9,7 +9,7 @@ last_updated: 2026-02-02 --- ## Overview -This RFC details the implementation of extended `Tool` definitions in `agentpool` to support features from `pydantic-ai`'s `Tool` class—specifically `prepare`, `function_schema`, `name`, and `description`—and the unification of tool conversion logic using `Tool.from_schema` for enhanced validation capabilities. +This RFC details the implementation of extended `Tool` definitions in `wolfharness` to support features from `pydantic-ai`'s `Tool` class—specifically `prepare`, `function_schema`, `name`, and `description`—and the unification of tool conversion logic using `Tool.from_schema` for enhanced validation capabilities. ## Background & Context AgentPool's `Tool` abstraction serves as a bridge between multiple protocols. Previously, conversion to `pydantic-ai` tools was fragmented: @@ -20,7 +20,7 @@ AgentPool's `Tool` abstraction serves as a bridge between multiple protocols. Pr ## Problem Statement 1. **Validation Gap**: The previous `SchemaWrapper` implementation for schema overrides did not support `validate_json`, causing runtime errors when PydanticAI attempted to validate tool arguments from JSON. 2. **Divergent Paths**: Tools with custom schemas used a different code path than standard tools, leading to feature disparity (e.g., missing `prepare` support). -3. **Context Type Hazard**: `pydantic-ai` expects `RunContext`, while `agentpool` internal tools often depend on `AgentContext`. Using `pydantic_ai.function_schema` on functions with `AgentContext` failed due to type inspection issues with abstract base classes. +3. **Context Type Hazard**: `pydantic-ai` expects `RunContext`, while `wolfharness` internal tools often depend on `AgentContext`. Using `pydantic_ai.function_schema` on functions with `AgentContext` failed due to type inspection issues with abstract base classes. ## Implementation Details diff --git a/docs/rfcs/implemented/RFC-0003-pydantic-ai-history-processors-integration.md b/docs/rfcs/implemented/RFC-0003-pydantic-ai-history-processors-integration.md index 26929fa6c..21e464126 100644 --- a/docs/rfcs/implemented/RFC-0003-pydantic-ai-history-processors-integration.md +++ b/docs/rfcs/implemented/RFC-0003-pydantic-ai-history-processors-integration.md @@ -17,9 +17,9 @@ related_rfcs: [RFC-0002] ## Overview -This RFC proposes adding support for pydantic-ai's `history_processors` mechanism to agentpool's native agent configuration. History processors are callables that transform message history before it's sent to the model, enabling advanced conversation management patterns like context-aware filtering, summarization, token budget management, and custom message selection logic. +This RFC proposes adding support for pydantic-ai's `history_processors` mechanism to wolfharness's native agent configuration. History processors are callables that transform message history before it's sent to the model, enabling advanced conversation management patterns like context-aware filtering, summarization, token budget management, and custom message selection logic. -The integration aims to provide a clean pass-through to pydantic-ai's native history processing capabilities with minimal code changes, allowing users to leverage the full power of pydantic-ai's history processor ecosystem directly from agentpool's YAML configuration. +The integration aims to provide a clean pass-through to pydantic-ai's native history processing capabilities with minimal code changes, allowing users to leverage the full power of pydantic-ai's history processor ecosystem directly from wolfharness's YAML configuration. ## Table of Contents @@ -43,21 +43,21 @@ The integration aims to provide a clean pass-through to pydantic-ai's native his ### Current State -**agentpool's History Management:** +**wolfharness's History Management:** AgentPool currently manages conversation history through: -1. **MessageHistory** (`src/agentpool/messaging/message_history.py`): +1. **MessageHistory** (`src/wolfharness/messaging/message_history.py`): - Stores conversation state in `chat_messages: ChatMessageList` - Applies `MemoryConfig` limits (`max_tokens`, `max_messages`) - Loads history from storage via `SessionQuery` -2. **CompactionPipeline** (`src/agentpool/messaging/compaction.py`): +2. **CompactionPipeline** (`src/wolfharness/messaging/compaction.py`): - Pipeline-based system with predefined steps (FilterThinking, TruncateToolOutputs, KeepLastMessages, etc.) - Configurable via YAML with presets (`minimal`, `balanced`, `summarizing`) - Applied during message history preparation -3. **NativeAgent** (`src/agentpool/agents/native_agent/agent.py`): +3. **NativeAgent** (`src/wolfharness/agents/native_agent/agent.py`): - Wraps pydantic-ai's `Agent` class - Creates `agentlet` via `get_agentlet()` which instantiates pydantic-ai Agent - Currently does NOT pass `history_processors` parameter to pydantic-ai Agent @@ -93,7 +93,7 @@ Key characteristics: - **RFC-0002** established the pattern for extending pydantic-ai features by passing through configuration parameters (e.g., `prepare` hooks, `function_schema`) - AgentPool's `CompactionPipeline` was designed before pydantic-ai had native history processors, leading to overlapping functionality -- Current agentpool users must write custom hooks or CompactionSteps to achieve what pydantic-ai's history processors can do natively +- Current wolfharness users must write custom hooks or CompactionSteps to achieve what pydantic-ai's history processors can do natively ### Glossary @@ -103,7 +103,7 @@ Key characteristics: | CompactionPipeline | AgentPool's internal message transformation system | | MessageHistory | AgentPool's conversation state manager | | RunContext | pydantic-ai's runtime context object providing access to deps, usage, model info | -| Agentlet | Internal pydantic-ai Agent instance created by agentpool's `get_agentlet()` | +| Agentlet | Internal pydantic-ai Agent instance created by wolfharness's `get_agentlet()` | --- @@ -147,7 +147,7 @@ AgentPool lacks a native way to configure pydantic-ai's history processors, forc ### Non-Goals (Out of Scope) 1. Replacing or deprecating CompactionPipeline (it remains for existing users) -2. Creating agentpool-specific history processor abstractions (use pydantic-ai's directly) +2. Creating wolfharness-specific history processor abstractions (use pydantic-ai's directly) 3. **Inline code execution for history processors** - deferred to future RFC with security design 4. History processor validation beyond basic import path verification and callable check 5. Runtime debugging of history processor execution (rely on pydantic-ai's built-in logs) @@ -199,7 +199,7 @@ agents: **Implementation:** 1. Add `history_processors: list[str] | None` field to `MemoryConfig` -2. In `NativeAgent.get_agentlet()`, resolve import paths to callables using existing `import_callable()` from `agentpool.utils.importing` +2. In `NativeAgent.get_agentlet()`, resolve import paths to callables using existing `import_callable()` from `wolfharness.utils.importing` 3. Cache resolved processors on the agent instance to avoid repeated resolution 4. Pass processors to pydantic-ai Agent's `history_processors` parameter 5. Validate processors are callable at import time @@ -209,7 +209,7 @@ agents: - **Full pydantic-ai compatibility**: Supports all 4 signatures natively - **Type safe**: Uses pydantic-ai's type checking - **No reinvention**: Uses battle-tested pydantic-ai processor execution logic -- **Clean separation**: Processor logic lives in pydantic-ai, not agentpool +- **Clean separation**: Processor logic lives in pydantic-ai, not wolfharness - **Performance**: One-time import resolution per agent instance (cached) - **Security**: No inline code execution, only import paths @@ -480,7 +480,7 @@ async with agentlet.iter(prompts, message_history=[m for run in history_list for #### 1. MemoryConfig Extension -**Location**: `src/agentpool_config/session.py` +**Location**: `src/wolfharness_config/session.py` ```python class MemoryConfig(Schema): @@ -515,7 +515,7 @@ class MemoryConfig(Schema): #### 2. Processor Resolution and Caching -**Location**: `src/agentpool/agents/native_agent/agent.py` +**Location**: `src/wolfharness/agents/native_agent/agent.py` ```python class Agent[TDeps = None, OutputDataT = str](BaseAgent[TDeps, OutputDataT]): @@ -532,7 +532,7 @@ class Agent[TDeps = None, OutputDataT = str](BaseAgent[TDeps, OutputDataT]): input_provider: InputProvider | None, ) -> PydanticAgent[AgentContext[TDeps], AgentOutputType]: """Create pydantic-ai agent from current state.""" - from agentpool.utils.importing import import_callable + from wolfharness.utils.importing import import_callable # ... existing tool wrapping code ... @@ -733,7 +733,7 @@ The rollback is straightforward because changes are purely additive. ## Testing Requirements -### Unit Tests (`agentpool/tests/test_history_processors.py`) +### Unit Tests (`wolfharness/tests/test_history_processors.py`) **Configuration Validation** - [ ] Empty history_processors list is valid @@ -857,7 +857,7 @@ def context_aware_sync( - [pydantic-ai History Processors Guide](https://ai.pydantic.dev/history-processors/) - [pydantic-ai RunContext API](https://ai.pydantic.dev/run-context/) -- [AgentPool Configuration Docs](https://million-mo.github.io/agentpool/YAML%20Configuration/session_configuration/) +- [AgentPool Configuration Docs](https://million-mo.github.io/wolfharness/YAML%20Configuration/session_configuration/) ### Appendix diff --git a/docs/rfcs/implemented/RFC-0008-dynamic-skills-injection.md b/docs/rfcs/implemented/RFC-0008-dynamic-skills-injection.md index 35e24537d..95d18f2a8 100644 --- a/docs/rfcs/implemented/RFC-0008-dynamic-skills-injection.md +++ b/docs/rfcs/implemented/RFC-0008-dynamic-skills-injection.md @@ -47,7 +47,7 @@ This RFC proposes a new approach for automatic skills injection into agent syste AgentPool now has RFC-0007's dynamic instruction infrastructure: -1. **Instruction Function Types** (`src/agentpool/prompts/instructions.py`): +1. **Instruction Function Types** (`src/wolfharness/prompts/instructions.py`): ```python InstructionFunc = ( SimpleInstruction | AgentContextInstruction | @@ -55,7 +55,7 @@ AgentPool now has RFC-0007's dynamic instruction infrastructure: ) ``` -2. **ResourceProvider Extension** (`src/agentpool/resource_providers/base.py`): +2. **ResourceProvider Extension** (`src/wolfharness/resource_providers/base.py`): ```python class ResourceProvider: async def get_instructions(self) -> list[InstructionFunc]: @@ -63,7 +63,7 @@ AgentPool now has RFC-0007's dynamic instruction infrastructure: return [] ``` -3. **NativeAgent Integration** (`src/agentpool/agents/native_agent/agent.py`): +3. **NativeAgent Integration** (`src/wolfharness/agents/native_agent/agent.py`): ```python async def get_agentlet(self, ...): # Collect instructions from all providers @@ -79,7 +79,7 @@ AgentPool now has RFC-0007's dynamic instruction infrastructure: ) ``` -4. **Context Wrapping** (`src/agentpool/utils/context_wrapping.py`): +4. **Context Wrapping** (`src/wolfharness/utils/context_wrapping.py`): - `wrap_instruction()` adapts instruction functions to pydantic-ai's `(RunContext) -> str` signature - Automatically injects AgentContext and/or RunContext based on function signature @@ -90,7 +90,7 @@ RFC-0005 proposed **static skill injection** into agent system prompts through m #### RFC-0005 Skill.format_for_injection() ```python -# src/agentpool/skills/skill.py +# src/wolfharness/skills/skill.py class Skill: def format_for_injection( self, @@ -115,7 +115,7 @@ class Skill: self._load_content() return f"### {self.name}\n\n{self.description}\n\n{self._instructions}" -# src/agentpool/agents/sys_prompts.py +# src/wolfharness/agents/sys_prompts.py class SystemPrompts: def __init__( self, @@ -234,7 +234,7 @@ agents: **Description** -Create a dedicated `SkillsInstructionProvider` class (`src/agentpool/resource_providers/skills_instruction.py`) that implements RFC-0007's dynamic instruction mechanism. This approach: +Create a dedicated `SkillsInstructionProvider` class (`src/wolfharness/resource_providers/skills_instruction.py`) that implements RFC-0007's dynamic instruction mechanism. This approach: - Keeps concern separated from tool provision (`SkillsTools` remains unchanged). - Uses **structured XML format** for skill representation. - Supports runtime selection and formatting based on `AgentContext`. @@ -268,7 +268,7 @@ class SkillsConfig(BaseModel): ```python -# src/agentpool_config/toolsets.py (extend existing SkillsToolsConfig) +# src/wolfharness_config/toolsets.py (extend existing SkillsToolsConfig) class SkillsToolsConfig(ToolsetConfig): """Configuration for skills tools toolset. @@ -556,7 +556,7 @@ Option 1 is recommended because: #### 1. SkillsInstructionProvider (NEW) -**File**: `src/agentpool/resource_providers/skills_instruction.py` +**File**: `src/wolfharness/resource_providers/skills_instruction.py` Dedicated ResourceProvider for skills injection via RFC-0007's `get_instructions()`. Keeps concerns separated from SkillsTools. @@ -567,13 +567,13 @@ from __future__ import annotations from typing import TYPE_CHECKING, Any, Literal, cast from xml.sax.saxutils import escape -from agentpool.agents.context import AgentContext -from agentpool.log import get_logger -from agentpool.resource_providers import ResourceProvider +from wolfharness.agents.context import AgentContext +from wolfharness.log import get_logger +from wolfharness.resource_providers import ResourceProvider if TYPE_CHECKING: - from agentpool.prompts.instructions import InstructionFunc - from agentpool.skills.registry import SkillsRegistry + from wolfharness.prompts.instructions import InstructionFunc + from wolfharness.skills.registry import SkillsRegistry logger = get_logger(__name__) @@ -712,7 +712,7 @@ class SkillsInstructionProvider(ResourceProvider): #### 2. SkillsTools (UNCHANGED) -**File**: `src/agentpool_toolsets/builtin/skills.py` +**File**: `src/wolfharness_toolsets/builtin/skills.py` Existing tools provider remains unchanged. Provides: - `load_skill` tool @@ -722,7 +722,7 @@ No modifications needed for RFC-0008. #### 2. Configuration Models -**File**: `src/agentpool_config/skills.py` +**File**: `src/wolfharness_config/skills.py` ```python class SkillsInstructionConfig(BaseModel): @@ -745,7 +745,7 @@ class SkillsConfig(BaseModel): #### 3. Toolset Configuration -**File**: `src/agentpool_config/toolsets.py` (extend) +**File**: `src/wolfharness_config/toolsets.py` (extend) ```python class SkillsToolsetConfig(ToolsetConfig): @@ -760,7 +760,7 @@ class SkillsToolsetConfig(ToolsetConfig): #### 4. AgentPool Integration -**File**: `src/agentpool/delegation/pool.py` (extend) +**File**: `src/wolfharness/delegation/pool.py` (extend) ```python class AgentPool: @@ -783,12 +783,12 @@ class AgentPool: ### Data Model Changes **New Files**: -- `src/agentpool/resource_providers/skills_instruction.py` - Dedicated instruction provider +- `src/wolfharness/resource_providers/skills_instruction.py` - Dedicated instruction provider - `tests/resource_providers/test_skills_instruction.py` - Tests for skills instruction provider **Modified Files**: -- `src/agentpool_config/skills.py` - Add `SkillsInstructionConfig` -- `src/agentpool/delegation/pool.py` - Integrate skills injection provider +- `src/wolfharness_config/skills.py` - Add `SkillsInstructionConfig` +- `src/wolfharness/delegation/pool.py` - Integrate skills injection provider ### Configuration Examples @@ -933,7 +933,7 @@ agents: - **Scope**: Create `SkillsInstructionProvider` - **Deliverables**: - - `src/agentpool/resource_providers/skills_instruction.py`: + - `src/wolfharness/resource_providers/skills_instruction.py`: - Implement `get_instructions()` returning dynamic XML generators - Implement XML formatting with proper character escaping - Unit tests for instruction generation logic @@ -942,8 +942,8 @@ agents: - **Scope**: Add configuration models - **Deliverables**: - - Update `agentpool_config/skills.py` with `SkillsInstructionConfig` - - Update `agentpool_config/toolsets.py` to support injection overrides + - Update `wolfharness_config/skills.py` with `SkillsInstructionConfig` + - Update `wolfharness_config/toolsets.py` to support injection overrides - Config validation tests ### Phase 3: AgentPool Integration (Day 2) @@ -999,8 +999,8 @@ agents: ## References - RFC-0007: Dynamic Instructions for Resource Providers -- `src/agentpool/resource_providers/base.py` -- `src/agentpool/prompts/instructions.py` +- `src/wolfharness/resource_providers/base.py` +- `src/wolfharness/prompts/instructions.py` **Consequences**: - Positive: Cleaner architecture, better extensibility - Positive: Aligns with RFC-0007 @@ -1014,6 +1014,6 @@ agents: - RFC-0005: Skills Injection into System Prompts (SUPERSEDED) - RFC-0007: Dynamic Instructions for Resource Providers -- `src/agentpool/prompts/instructions.py` -- `src/agentpool/resource_providers/base.py` -- `src/agentpool/utils/context_wrapping.py` +- `src/wolfharness/prompts/instructions.py` +- `src/wolfharness/resource_providers/base.py` +- `src/wolfharness/utils/context_wrapping.py` diff --git a/docs/rfcs/implemented/RFC-0014-spawn-session-events.md b/docs/rfcs/implemented/RFC-0014-spawn-session-events.md index ded0bc7af..8ebf57971 100644 --- a/docs/rfcs/implemented/RFC-0014-spawn-session-events.md +++ b/docs/rfcs/implemented/RFC-0014-spawn-session-events.md @@ -213,7 +213,7 @@ async def _process_subagent_event(self, subagent_event, ctx): ### Phase 1: Event Definition (0.5 day) -**File**: `src/agentpool/agents/events/events.py` +**File**: `src/wolfharness/agents/events/events.py` ```python @dataclass(kw_only=True) @@ -238,7 +238,7 @@ type RichAgentStreamEvent[OutputDataT] = ( ### Phase 2: Subagent Tools Integration (1 day) -**File**: `src/agentpool_toolsets/builtin/subagent_tools.py` +**File**: `src/wolfharness_toolsets/builtin/subagent_tools.py` Update `_stream_task()` function: @@ -307,7 +307,7 @@ async def _stream_task( ### Phase 3: Event Processor Update (2 days) -**File**: `src/agentpool_server/opencode_server/event_processor.py` +**File**: `src/wolfharness_server/opencode_server/event_processor.py` Add handler with duplicate session protection: @@ -445,5 +445,5 @@ if isinstance(event, SpawnSessionStart): ## References - [RFC-0013: Subagent Event Unification](./RFC-0013-subagent-event-unification.md) -- [AgentPool Events](./src/agentpool/agents/events/events.py) -- [Subagent Tools](./src/agentpool_toolsets/builtin/subagent_tools.py) +- [AgentPool Events](./src/wolfharness/agents/events/events.py) +- [Subagent Tools](./src/wolfharness_toolsets/builtin/subagent_tools.py) diff --git a/docs/rfcs/implemented/RFC-0020-mcp-skills-resources-provider.md b/docs/rfcs/implemented/RFC-0020-mcp-skills-resources-provider.md index 140b17011..929fde302 100644 --- a/docs/rfcs/implemented/RFC-0020-mcp-skills-resources-provider.md +++ b/docs/rfcs/implemented/RFC-0020-mcp-skills-resources-provider.md @@ -53,20 +53,20 @@ This RFC specifies the **MCP Skills Resources Provider Protocol** implementation ### Current State -**ResourceProvider Infrastructure** (`src/agentpool/resource_providers/`): +**ResourceProvider Infrastructure** (`src/wolfharness/resource_providers/`): - `ResourceProvider` base class with `get_skills()`, `get_skill_instructions()` methods - `skills_changed` signal for change notifications - `AggregatingResourceProvider` for combining multiple providers - `MCPResourceProvider` for MCP server integration (needs skill support) - **Gap**: No local filesystem skill provider; skills not integrated with ResourceProvider -**Skills System** (`src/agentpool/skills/`): +**Skills System** (`src/wolfharness/skills/`): - Skills are defined in `SKILL.md` files with YAML frontmatter - `SkillsRegistry` auto-discovers skills from directories - `SkillsInstructionProvider` injects skills into prompts (not a ResourceProvider) - **Gap**: Skills not exposed through ResourceProvider interface -**MCP Integration** (`src/agentpool/mcp_server/`): +**MCP Integration** (`src/wolfharness/mcp_server/`): - `MCPResourceProvider` exposes MCP tools, prompts, resources - MCP servers can expose skills in two ways: 1. **Via Prompts**: Traditional MCP prompts (e.g., `github-copilot/code-review`) @@ -276,7 +276,7 @@ This RFC specifies the **MCP Skills Resources Provider Protocol** implementation #### 1. Exception Hierarchy ```python -# src/agentpool/skills/exceptions.py +# src/wolfharness/skills/exceptions.py class SkillError(Exception): """Base exception for skill-related errors.""" @@ -317,7 +317,7 @@ class ProviderError(SkillError): #### 2. LocalResourceProvider (New) ```python -# src/agentpool/resource_providers/local.py +# src/wolfharness/resource_providers/local.py from __future__ import annotations @@ -327,12 +327,12 @@ from typing import TYPE_CHECKING, Self from upathtools import UPath -from agentpool.log import get_logger -from agentpool.resource_providers import ResourceChangeEvent, ResourceProvider -from agentpool.resource_providers.resource_info import ResourceInfo -from agentpool.skills.exceptions import ReferenceNotFoundError, SecurityError, SkillNotFoundError -from agentpool.skills.registry import SkillsRegistry -from agentpool.skills.skill import Skill +from wolfharness.log import get_logger +from wolfharness.resource_providers import ResourceChangeEvent, ResourceProvider +from wolfharness.resource_providers.resource_info import ResourceInfo +from wolfharness.skills.exceptions import ReferenceNotFoundError, SecurityError, SkillNotFoundError +from wolfharness.skills.registry import SkillsRegistry +from wolfharness.skills.skill import Skill if TYPE_CHECKING: from types import TracebackType @@ -582,7 +582,7 @@ MCP servers can expose skills in two ways: 2. **Via Resources (Skill Protocol)**: Using `skill://` URI scheme with SKILL.md files ```python -# src/agentpool/resource_providers/mcp_provider.py (extension) +# src/wolfharness/resource_providers/mcp_provider.py (extension) # Add to existing MCPResourceProvider class: @@ -610,7 +610,7 @@ async def get_skills(self) -> list[Skill]: async def _get_prompt_skills(self) -> list[Skill]: """Get MCP prompts mapped to skills.""" - from agentpool.skills.skill import Skill + from wolfharness.skills.skill import Skill prompts = await self.get_prompts() skills: list[Skill] = [] @@ -660,7 +660,7 @@ async def _get_resource_skills(self) -> list[Skill]: See: https://gofastmcp.com/servers/providers/skills """ - from agentpool.skills.skill import Skill + from wolfharness.skills.skill import Skill resources = await self.get_resources() skills: list[Skill] = [] @@ -947,7 +947,7 @@ async def read_reference(self, skill_name: str, ref_path: str) -> str: #### 4. Skill URI Resolver ```python -# src/agentpool/skills/uri_resolver.py +# src/wolfharness/skills/uri_resolver.py from __future__ import annotations @@ -955,10 +955,10 @@ from dataclasses import dataclass from typing import TYPE_CHECKING from urllib.parse import unquote -from agentpool.skills.exceptions import SkillNotFoundError, SecurityError +from wolfharness.skills.exceptions import SkillNotFoundError, SecurityError if TYPE_CHECKING: - from agentpool.resource_providers import AggregatingResourceProvider + from wolfharness.resource_providers import AggregatingResourceProvider @dataclass(frozen=True) @@ -1302,15 +1302,15 @@ class ResolvedSkill: #### 5. Updated load_skill Tool ```python -# src/agentpool_toolsets/builtin/skills.py +# src/wolfharness_toolsets/builtin/skills.py from __future__ import annotations from typing import Literal -from agentpool.agents.context import AgentContext -from agentpool.resource_providers import StaticResourceProvider -from agentpool.skills.exceptions import SkillNotFoundError, SecurityError, ReferenceNotFoundError +from wolfharness.agents.context import AgentContext +from wolfharness.resource_providers import StaticResourceProvider +from wolfharness.skills.exceptions import SkillNotFoundError, SecurityError, ReferenceNotFoundError SKILL_USAGE_GUIDANCE = """ @@ -1390,7 +1390,7 @@ async def load_skill( Returns: The skill instructions or reference content """ - from agentpool.log import get_logger + from wolfharness.log import get_logger logger = get_logger(__name__) @@ -1521,7 +1521,7 @@ class SkillsTools(StaticResourceProvider): ### Integration with AgentPool ```python -# src/agentpool/delegation/pool.py +# src/wolfharness/delegation/pool.py class AgentPool: """Updated AgentPool with unified skill access via ResourceProvider.""" @@ -1533,9 +1533,9 @@ class AgentPool: Creates LocalResourceProvider within SkillsManager, then combines with MCP providers via AggregatingResourceProvider. """ - from agentpool.resource_providers.local import LocalResourceProvider - from agentpool.resource_providers import AggregatingResourceProvider - from agentpool.skills.uri_resolver import SkillURIResolver + from wolfharness.resource_providers.local import LocalResourceProvider + from wolfharness.resource_providers import AggregatingResourceProvider + from wolfharness.skills.uri_resolver import SkillURIResolver # 1. Extend existing SkillsManager with ResourceProvider if hasattr(self, 'skills') and self.skills: @@ -1603,7 +1603,7 @@ class AgentPool: ### SkillsManager Extension ```python -# src/agentpool/skills/manager.py (extension) +# src/wolfharness/skills/manager.py (extension) class SkillsManager: """Extended to expose ResourceProvider interface.""" @@ -1613,7 +1613,7 @@ class SkillsManager: await self.registry.__aenter__() # Create and enter LocalResourceProvider - from agentpool.resource_providers.local import LocalResourceProvider + from wolfharness.resource_providers.local import LocalResourceProvider self._resource_provider = LocalResourceProvider( name="local", @@ -1722,9 +1722,9 @@ When an MCP server uses the [FastMCP Skills Provider protocol](https://gofastmcp ### Phase 1: Core Infrastructure (Week 1) -1. **Exception classes** (`src/agentpool/skills/exceptions.py`) -2. **URI resolver** (`src/agentpool/skills/uri_resolver.py`) -3. **LocalResourceProvider** (`src/agentpool/resource_providers/local.py`) +1. **Exception classes** (`src/wolfharness/skills/exceptions.py`) +2. **URI resolver** (`src/wolfharness/skills/uri_resolver.py`) +3. **LocalResourceProvider** (`src/wolfharness/resource_providers/local.py`) 4. **Tests** for URI parsing and resolution ### Phase 2: MCP Integration (Week 2) @@ -1833,9 +1833,9 @@ Based on comprehensive review by Metis, Momus, and Oracle during initial develop - [x] Architecture review passed (Oracle) - [x] RFC quality review passed (Momus) - [x] Implementation readiness review passed (Metis) -- [x] Exception hierarchy (`src/agentpool/skills/exceptions.py`) -- [x] URI resolver (`src/agentpool/skills/uri_resolver.py`) -- [x] LocalResourceProvider (`src/agentpool/resource_providers/local.py`) +- [x] Exception hierarchy (`src/wolfharness/skills/exceptions.py`) +- [x] URI resolver (`src/wolfharness/skills/uri_resolver.py`) +- [x] LocalResourceProvider (`src/wolfharness/resource_providers/local.py`) - [x] MCPResourceProvider skill methods - [x] AggregatingResourceProvider skill aggregation - [x] Updated load_skill tool with URI support diff --git a/docs/rfcs/implemented/RFC-0021-agent-concurrent-execution-safety.md b/docs/rfcs/implemented/RFC-0021-agent-concurrent-execution-safety.md index c437c8699..3e135f1b0 100644 --- a/docs/rfcs/implemented/RFC-0021-agent-concurrent-execution-safety.md +++ b/docs/rfcs/implemented/RFC-0021-agent-concurrent-execution-safety.md @@ -540,7 +540,7 @@ async def _run_stream_once(self, run_ctx: AgentRunContext, prompts, ...): 4. **Verify Test Failure**: Ensure concurrent tests fail before fix (proves test validity) **Files Modified**: -- `src/agentpool/agents/native_agent.py` (fix finally block) +- `src/wolfharness/agents/native_agent.py` (fix finally block) **Deliverable**: - Existing bug fixed @@ -552,14 +552,14 @@ async def _run_stream_once(self, run_ctx: AgentRunContext, prompts, ...): ### Phase 1: Core Context Creation (Days 1-2) **Tasks**: -1. Create `AgentRunContext` dataclass in `agentpool/agents/context.py` +1. Create `AgentRunContext` dataclass in `wolfharness/agents/context.py` 2. Add `run_ctx` parameter to internal methods 3. Migrate `_cancelled` and `_current_stream_task` to context 4. Run tests after each migration step **Files Modified**: -- `src/agentpool/agents/context.py` (add AgentRunContext) -- `src/agentpool/agents/base_agent.py` (core changes) +- `src/wolfharness/agents/context.py` (add AgentRunContext) +- `src/wolfharness/agents/base_agent.py` (core changes) **Deliverable**: Basic concurrent calls work for simple scenarios @@ -575,9 +575,9 @@ async def _run_stream_once(self, run_ctx: AgentRunContext, prompts, ...): 5. Run full test suite after each step **Files Modified**: -- `src/agentpool/agents/base_agent.py` -- `src/agentpool/agents/events/event_emitter.py` -- `src/agentpool/agents/context.py` +- `src/wolfharness/agents/base_agent.py` +- `src/wolfharness/agents/events/event_emitter.py` +- `src/wolfharness/agents/context.py` **Deliverable**: All mutable state isolated @@ -603,7 +603,7 @@ async def _run_stream_once(self, run_ctx: AgentRunContext, prompts, ...): ### Dependencies - None external -- Internal: All changes within `agentpool.agents` module +- Internal: All changes within `wolfharness.agents` module ## 10. Open Questions @@ -697,7 +697,7 @@ python tests/agents/run_concurrent_tests.py pytest tests/agents/test_concurrent_safety.py -v # With coverage -pytest tests/agents/test_concurrent_safety.py --cov=src/agentpool/ +pytest tests/agents/test_concurrent_safety.py --cov=src/wolfharness/ # Stress test only pytest tests/agents/test_concurrent_safety.py -m slow -v @@ -747,10 +747,10 @@ async def test_concurrent_event_isolation(): ### Code Locations Key files referenced in this RFC: -- `src/agentpool/agents/base_agent.py` - BaseAgent implementation -- `src/agentpool/agents/native_agent/agent.py` - NativeAgent implementation -- `src/agentpool/agents/context.py` - AgentContext and (new) AgentRunContext -- `src/agentpool/agents/events/event_emitter.py` - Event emission +- `src/wolfharness/agents/base_agent.py` - BaseAgent implementation +- `src/wolfharness/agents/native_agent/agent.py` - NativeAgent implementation +- `src/wolfharness/agents/context.py` - AgentContext and (new) AgentRunContext +- `src/wolfharness/agents/events/event_emitter.py` - Event emission --- @@ -783,10 +783,10 @@ tests/agents/test_concurrent_safety.py::test_native_agent_concurrent PASSED ### Files Modified -- `src/agentpool/agents/context.py` - AgentRunContext dataclass -- `src/agentpool/agents/base_agent.py` - State migration to context -- `src/agentpool/agents/native_agent/agent.py` - Bug fixes and context usage -- `src/agentpool/agents/events/event_emitter.py` - Context-based event queue +- `src/wolfharness/agents/context.py` - AgentRunContext dataclass +- `src/wolfharness/agents/base_agent.py` - State migration to context +- `src/wolfharness/agents/native_agent/agent.py` - Bug fixes and context usage +- `src/wolfharness/agents/events/event_emitter.py` - Context-based event queue - All agent subclasses updated for context compatibility ### Migration Guide for Custom Subclasses diff --git a/docs/rfcs/implemented/RFC-0023-session-scoped-interrupt-routing.md b/docs/rfcs/implemented/RFC-0023-session-scoped-interrupt-routing.md index a74c0a97e..3671f61aa 100644 --- a/docs/rfcs/implemented/RFC-0023-session-scoped-interrupt-routing.md +++ b/docs/rfcs/implemented/RFC-0023-session-scoped-interrupt-routing.md @@ -645,9 +645,9 @@ If the server later chooses to wait for stream completion before broadcasting id 7. Update `is_cancelled()` to check per-run context for streaming runs **Files Modified**: -- `src/agentpool/agents/context.py` (add `iteration_task` field) -- `src/agentpool/agents/base_agent.py` (registry, interrupt routing) -- `src/agentpool/agents/native_agent/agent.py` (use `run_ctx.iteration_task`) +- `src/wolfharness/agents/context.py` (add `iteration_task` field) +- `src/wolfharness/agents/base_agent.py` (registry, interrupt routing) +- `src/wolfharness/agents/native_agent/agent.py` (use `run_ctx.iteration_task`) **Deliverable**: Core registry works, existing tests updated @@ -662,8 +662,8 @@ If the server later chooses to wait for stream completion before broadcasting id 4. Audit `ClaudeCodeAgent`, `CodexAgent`, and converter/helper call graphs for removed instance-state reads **Files Modified**: -- `src/agentpool/agents/acp_agent/acp_agent.py` -- `src/agentpool/agents/agui_agent/agui_agent.py` +- `src/wolfharness/agents/acp_agent/acp_agent.py` +- `src/wolfharness/agents/agui_agent/agui_agent.py` - Other subclasses as needed **Deliverable**: All subclasses use per-run context @@ -680,8 +680,8 @@ If the server later chooses to wait for stream completion before broadcasting id 5. Optional follow-up: if waiting for stream completion is implemented, use a per-session task map instead of a global task slot **Files Modified**: -- `src/agentpool_server/opencode_server/routes/session_routes.py` -- `src/agentpool_server/opencode_server/routes/message_routes.py` +- `src/wolfharness_server/opencode_server/routes/session_routes.py` +- `src/wolfharness_server/opencode_server/routes/message_routes.py` **Deliverable**: OpenCode abort flow uses session-scoped routing diff --git a/docs/rfcs/implemented/RFC-0026-per-session-agent-isolation.md b/docs/rfcs/implemented/RFC-0026-per-session-agent-isolation.md index 4ca91970f..c36588351 100644 --- a/docs/rfcs/implemented/RFC-0026-per-session-agent-isolation.md +++ b/docs/rfcs/implemented/RFC-0026-per-session-agent-isolation.md @@ -23,7 +23,7 @@ This RFC proposes the minimal change to enable concurrent multi-client access: r ## Problem Statement -When multiple OpenCode clients connect to the same `agentpool serve-opencode` server, only the first can process messages. All others are blocked by a global `asyncio.Lock` held for the entire duration of LLM inference (10–120 seconds per response). +When multiple OpenCode clients connect to the same `wolfharness serve-opencode` server, only the first can process messages. All others are blocked by a global `asyncio.Lock` held for the entire duration of LLM inference (10–120 seconds per response). **Root cause**: `ServerState.agent` is a single `BaseAgent` instance shared across all sessions. `bind_agent_to_session()` mutates `agent.session_id` and `agent._input_provider` per request. A global `agent_lock` serializes access, but blocks everything during inference. @@ -36,7 +36,7 @@ When multiple OpenCode clients connect to the same `agentpool serve-opencode` se agent_lock: asyncio.Lock = field(default_factory=asyncio.Lock) ``` -**Impact**: Teams cannot share an agentpool server. Each user must run their own instance. +**Impact**: Teams cannot share an wolfharness server. Each user must run their own instance. ## Goals & Non-Goals @@ -343,7 +343,7 @@ Self-contained change. Revert by restoring `state.agent` + `state.agent_lock` + ### Key Source Files -- `packages/agentpool/src/agentpool_server/opencode_server/state.py` — `ServerState`, `agent_lock`, `bind_agent_to_session()` -- `packages/agentpool/src/agentpool_server/opencode_server/routes/session_routes.py` — Session CRUD -- `packages/agentpool/src/agentpool_server/opencode_server/routes/message_routes.py` — Message handling -- `packages/agentpool/src/agentpool/agents/base_agent.py` — `BaseAgent`, shared mutable state +- `packages/wolfharness/src/wolfharness_server/opencode_server/state.py` — `ServerState`, `agent_lock`, `bind_agent_to_session()` +- `packages/wolfharness/src/wolfharness_server/opencode_server/routes/session_routes.py` — Session CRUD +- `packages/wolfharness/src/wolfharness_server/opencode_server/routes/message_routes.py` — Message handling +- `packages/wolfharness/src/wolfharness/agents/base_agent.py` — `BaseAgent`, shared mutable state diff --git a/docs/rfcs/implemented/RFC-0031-acp-per-session-agent-isolation.md b/docs/rfcs/implemented/RFC-0031-acp-per-session-agent-isolation.md index 30f52ac28..58c806961 100644 --- a/docs/rfcs/implemented/RFC-0031-acp-per-session-agent-isolation.md +++ b/docs/rfcs/implemented/RFC-0031-acp-per-session-agent-isolation.md @@ -86,7 +86,7 @@ The ACP server must adapt this pattern to its different architecture (ACP protoc ### The Problem -When multiple ACP clients connect to the same `agentpool serve-acp` server, all sessions share a single `BaseAgent` instance. This causes: +When multiple ACP clients connect to the same `wolfharness serve-acp` server, all sessions share a single `BaseAgent` instance. This causes: 1. **Conversation contamination**: Session A's messages appear in Session B's context window because `agent.conversation` is shared 2. **Input provider conflicts**: `ACPSession.__post_init__` sets `agent._input_provider = self.input_provider` for **all** agents in the pool (lines 220-221 of `session.py`), overwriting the previous session's input provider @@ -113,7 +113,7 @@ When multiple ACP clients connect to the same `agentpool serve-acp` server, all - **Risk**: Teams cannot share an ACP server (e.g., via WebSocket transport). Each concurrent session corrupts others' conversations. - **Risk**: Session resumption (`load_session`, `resume_session`) loads the wrong conversation history because the shared agent only has one `conversation` object. - **Risk**: Permission requests and user elicitations route to the wrong session because `agent._input_provider` is overwritten. -- **Cost**: Users must run separate `agentpool serve-acp` processes per client, defeating the purpose of the WebSocket/multi-client transport. +- **Cost**: Users must run separate `wolfharness serve-acp` processes per client, defeating the purpose of the WebSocket/multi-client transport. --- @@ -366,7 +366,7 @@ class AgentPoolACPAgent: def __post_init__(self) -> None: # ... existing init ... # NEW: Cache agent config for per-session creation - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig if self.agent_pool.main_agent and self.agent_pool.main_agent.name in self.agent_pool.manifest.agents: cfg = self.agent_pool.manifest.agents[self.agent_pool.main_agent.name] if isinstance(cfg, NativeAgentConfig): @@ -449,7 +449,7 @@ class AgentPoolACPAgent: agent_config = next(iter(self.agent_pool.manifest.agents.values())) if agent_config is not None: - from agentpool_config.context import ConfigContextManager + from wolfharness_config.context import ConfigContextManager with ConfigContextManager(agent_config.config_file_path): agent = agent_config.get_agent( @@ -1087,8 +1087,8 @@ After updating the RFC based on Round 2 findings, Oracle and Metis performed a f ### Key Source Files -- `src/agentpool_server/acp_server/server.py` — `ACPServer`, pool lifecycle -- `src/agentpool_server/acp_server/acp_agent.py` — `AgentPoolACPAgent`, protocol methods -- `src/agentpool_server/acp_server/session_manager.py` — `ACPSessionManager`, session tracking -- `src/agentpool_server/acp_server/session.py` — `ACPSession`, prompt processing -- `src/agentpool_server/opencode_server/state.py` — Reference: OpenCode's `_session_agents`, `get_or_create_agent()` +- `src/wolfharness_server/acp_server/server.py` — `ACPServer`, pool lifecycle +- `src/wolfharness_server/acp_server/acp_agent.py` — `AgentPoolACPAgent`, protocol methods +- `src/wolfharness_server/acp_server/session_manager.py` — `ACPSessionManager`, session tracking +- `src/wolfharness_server/acp_server/session.py` — `ACPSession`, prompt processing +- `src/wolfharness_server/opencode_server/state.py` — Reference: OpenCode's `_session_agents`, `get_or_create_agent()` diff --git a/docs/rfcs/implemented/RFC-0033-mcp-over-acp-transport.md b/docs/rfcs/implemented/RFC-0033-mcp-over-acp-transport.md index 03d087439..252ed93a4 100644 --- a/docs/rfcs/implemented/RFC-0033-mcp-over-acp-transport.md +++ b/docs/rfcs/implemented/RFC-0033-mcp-over-acp-transport.md @@ -18,9 +18,9 @@ related_rfcs: ## Overview -本 RFC 提议在 agentpool 中增加对 MCP-over-ACP 传输协议的支持,允许 ACP 客户端通过现有 ACP 连接注入 MCP 工具服务,而无需单独的 stdio 进程或 HTTP 端口。实现后,agentpool 可作为 ACP Agent 向客户端声明 `mcpCapabilities.acp: true`,并在 session 初始化阶段**主动**通过 `mcp/connect` 向客户端请求建立连接(Agent→Client),通过 `mcp/message` 双向转发工具调用,在 session 结束时通过 `mcp/disconnect` 通知客户端清理(Agent→Client),完成完整的 MCP 工具调用生命周期。 +本 RFC 提议在 wolfharness 中增加对 MCP-over-ACP 传输协议的支持,允许 ACP 客户端通过现有 ACP 连接注入 MCP 工具服务,而无需单独的 stdio 进程或 HTTP 端口。实现后,wolfharness 可作为 ACP Agent 向客户端声明 `mcpCapabilities.acp: true`,并在 session 初始化阶段**主动**通过 `mcp/connect` 向客户端请求建立连接(Agent→Client),通过 `mcp/message` 双向转发工具调用,在 session 结束时通过 `mcp/disconnect` 通知客户端清理(Agent→Client),完成完整的 MCP 工具调用生命周期。 -该特性能够显著扩大 agentpool 的适用场景:客户端可注入项目感知工具(如代码感知的搜索工具)、沙箱环境(如 WASM 运行时)也能提供 MCP 工具,同时消除了通过"旁路"传输带来的沙箱逃逸风险。 +该特性能够显著扩大 wolfharness 的适用场景:客户端可注入项目感知工具(如代码感知的搜索工具)、沙箱环境(如 WASM 运行时)也能提供 MCP 工具,同时消除了通过"旁路"传输带来的沙箱逃逸风险。 ## Table of Contents @@ -43,7 +43,7 @@ related_rfcs: ### Current State -agentpool 当前通过 ACP 协议对外提供 Agent 能力。在 `session/new` 和 `session/load` 请求中,客户端可传入 MCP 服务器配置(`mcp_servers`),agentpool 支持三种 MCP 传输类型: +wolfharness 当前通过 ACP 协议对外提供 Agent 能力。在 `session/new` 和 `session/load` 请求中,客户端可传入 MCP 服务器配置(`mcp_servers`),wolfharness 支持三种 MCP 传输类型: | 类型 | 实现文件 | 状态 | |------|----------|------| @@ -56,7 +56,7 @@ agentpool 当前通过 ACP 协议对外提供 Agent 能力。在 `session/new` ### Historical Context -- [RFC-0030](../draft/RFC-0030-acp-streamable-http-websocket-transport.md) 扩展了 agentpool 对 Streamable HTTP / WebSocket 的 ACP 传输层支持,为本 RFC 奠定了传输基础设施基础。 +- [RFC-0030](../draft/RFC-0030-acp-streamable-http-websocket-transport.md) 扩展了 wolfharness 对 Streamable HTTP / WebSocket 的 ACP 传输层支持,为本 RFC 奠定了传输基础设施基础。 - ACP 协议官方 RFD [mcp-over-acp](../../../../agent-client-protocol/docs/rfds/mcp-over-acp.mdx) 定义了完整规范,包括消息格式、连接复用和 Bridging 策略。 ### Prerequisites @@ -69,7 +69,7 @@ agentpool 当前通过 ACP 协议对外提供 Agent 能力。在 `session/new` | Term | Definition | |------|------------| -| ACP | Agent Client Protocol,agentpool 使用的 Agent-客户端双向通信协议 | +| ACP | Agent Client Protocol,wolfharness 使用的 Agent-客户端双向通信协议 | | MCP | Model Context Protocol,LLM 使用工具的标准协议 | | MCP-over-ACP | 通过 ACP 连接通道传输 MCP 消息的扩展 | | `acpId` | 客户端在 `session/new` 中为 ACP-transport MCP Server 生成的唯一标识 | @@ -96,13 +96,13 @@ ACP 客户端(IDE、编辑器、代理中间层)希望向 Agent 注入与当 ### Evidence - ACP 官方 RFD [mcp-over-acp](../../../../agent-client-protocol/docs/rfds/mcp-over-acp.mdx) 明确指出该问题并提出了规范解决方案 -- agentpool 的 `convert_acp_mcp_server_to_config()` 在遇到未知 MCP server 类型时直接 `assert_never`(即崩溃),无任何扩展入口 +- wolfharness 的 `convert_acp_mcp_server_to_config()` 在遇到未知 MCP server 类型时直接 `assert_never`(即崩溃),无任何扩展入口 - `McpCapabilities` 中无 `acp` 字段,无法向客户端声明支持能力 ### Impact of Inaction - **功能缺失**:无法支持 ACP 客户端的 MCP 工具注入场景(如 Zed 插件、WASM 沙箱工具) -- **生态兼容性**:ACP 参考实现(Rust SDK sacp-conductor)已实现 Bridging,agentpool 无法与其互操作 +- **生态兼容性**:ACP 参考实现(Rust SDK sacp-conductor)已实现 Bridging,wolfharness 无法与其互操作 - **扩展受阻**:未来的 proxy-chain 场景(RFC 参见 [proxy-chains RFD](../../../../agent-client-protocol/docs/rfds/))依赖 MCP-over-ACP --- @@ -111,25 +111,25 @@ ACP 客户端(IDE、编辑器、代理中间层)希望向 Agent 注入与当 ### Goals (In Scope) -1. agentpool 作为 ACP Agent 在 `InitializeResponse` 中声明 `mcpCapabilities.acp: true` +1. wolfharness 作为 ACP Agent 在 `InitializeResponse` 中声明 `mcpCapabilities.acp: true` 2. 支持在 `session/new`、`session/load`、`session/fork`、`session/resume` 请求中接收 `type: "acp"` 的 MCP Server 声明 3. 实现 `mcp/connect` 消息处理:在 session 初始化阶段接收 `acpId`,返回唯一 `connectionId` 4. 实现双向 `mcp/message` 消息转发:将 Agent 发出的 MCP 工具调用路由至提供该 Server 的 ACP 客户端,并将结果原路返回 5. 实现 `mcp/disconnect` 消息处理:在 session 结束时清理连接状态 6. 支持同一 MCP Server 的多路连接复用(每次 `mcp/connect` 返回独立 `connectionId`) -7. **双向配置转换**:同步更新正向转换(`converters.py`)和反向转换(`acp_converters.py`),确保 agentpool 作为 ACP 客户端时代码不崩溃 +7. **双向配置转换**:同步更新正向转换(`converters.py`)和反向转换(`acp_converters.py`),确保 wolfharness 作为 ACP 客户端时代码不崩溃 ### Non-Goals (Out of Scope) 1. **Bridging(可选,后续 RFC)**:将 ACP-transport MCP Server 透明转为 stdio/HTTP shim 不在本 RFC 范围内 -2. **客户端侧实现**:本 RFC 仅覆盖 agentpool(Agent 侧)实现,不涉及客户端 SDK 变更 +2. **客户端侧实现**:本 RFC 仅覆盖 wolfharness(Agent 侧)实现,不涉及客户端 SDK 变更 3. **MCP Server 能力缓存**:不在本 RFC 中实现跨连接的工具列表缓存 4. **认证与鉴权扩展**:MCP-over-ACP 沿用与 ACP 相同的信任模型,不新增额外认证机制 ### Success Criteria - [ ] `InitializeResponse` 包含 `mcpCapabilities.acp: true` -- [ ] 客户端传入 `type: "acp"` MCP Server 后,agentpool 在 session 初始化阶段**主动**发送 `mcp/connect`(Agent→Client),客户端返回 `connectionId` +- [ ] 客户端传入 `type: "acp"` MCP Server 后,wolfharness 在 session 初始化阶段**主动**发送 `mcp/connect`(Agent→Client),客户端返回 `connectionId` - [ ] Agent 可通过 `connectionId` 发起 `mcp/message` 工具调用并收到结果 - [ ] `mcp/disconnect` 正确清理连接(Agent 主动向 Client 发送) - [ ] 现有 stdio/SSE/HTTP MCP 功能无回归(通过已有测试集验证) @@ -155,7 +155,7 @@ ACP 客户端(IDE、编辑器、代理中间层)希望向 Agent 注入与当 **Description** -在 agentpool 的 ACP server 层直接实现完整的 MCP-over-ACP 协议处理器: +在 wolfharness 的 ACP server 层直接实现完整的 MCP-over-ACP 协议处理器: - 扩展 `McpCapabilities` schema 添加 `acp` 字段 - 新增 `AcpMcpServer` schema 类型 @@ -210,11 +210,11 @@ ACP 客户端(IDE、编辑器、代理中间层)希望向 Agent 注入与当 **Description** -不修改 agentpool 核心,而是在 agentpool 外层增加一个 Conductor/Proxy 进程:对外声明支持 `mcpCapabilities.acp`,接收到 ACP-transport MCP Server 声明后,生成一个本地 stdio shim 进程,将 ACP channel 消息转换为 stdio MCP 消息,再传给 agentpool(以普通 stdio MCP Server 形式传入)。 +不修改 wolfharness 核心,而是在 wolfharness 外层增加一个 Conductor/Proxy 进程:对外声明支持 `mcpCapabilities.acp`,接收到 ACP-transport MCP Server 声明后,生成一个本地 stdio shim 进程,将 ACP channel 消息转换为 stdio MCP 消息,再传给 wolfharness(以普通 stdio MCP Server 形式传入)。 **Advantages** -- agentpool 核心代码改动最小 +- wolfharness 核心代码改动最小 - shim 进程可独立部署和测试 - 与 ACP RFD 中描述的 Bridging 模式对齐 @@ -230,7 +230,7 @@ ACP 客户端(IDE、编辑器、代理中间层)希望向 Agent 注入与当 | Criterion | Rating | Notes | |-----------|--------|-------| | 协议合规性 | ⭐⭐⭐ | 从外部看符合规范,但内部绕过了核心目标 | -| 向后兼容性 | ⭐⭐⭐⭐⭐ | 对 agentpool 核心无侵入 | +| 向后兼容性 | ⭐⭐⭐⭐⭐ | 对 wolfharness 核心无侵入 | | 实现复杂度 | ⭐⭐⭐ | shim 进程本身复杂度与 Option 1 相当 | | 可扩展性 | ⭐⭐ | Bridging 作为唯一实现路径,无原生支持扩展点 | | 可测试性 | ⭐⭐⭐ | 进程边界使集成测试更复杂 | @@ -254,7 +254,7 @@ ACP 客户端(IDE、编辑器、代理中间层)希望向 Agent 注入与当 **Description** -等待 ACP 官方 Rust SDK(sacp-conductor)稳定后,通过集成官方 bridge 实现支持,agentpool 自身不做任何改动。 +等待 ACP 官方 Rust SDK(sacp-conductor)稳定后,通过集成官方 bridge 实现支持,wolfharness 自身不做任何改动。 **Advantages** @@ -333,7 +333,7 @@ Option 1 是唯一能够完整实现 ACP RFD 目标的方案: └──────────────────────────┬──────────────────────────────────────┘ │ ACP Channel (JSON-RPC over stdio/WS) ┌──────────────────────────▼──────────────────────────────────────┐ -│ agentpool ACP Server (AgentPoolACPAgent / acp_agent.py) │ +│ wolfharness ACP Server (AgentPoolACPAgent / acp_agent.py) │ │ │ │ ┌─────────────────────────────────────┐ │ │ │ AcpMcpConnectionManager │ │ @@ -359,7 +359,7 @@ Option 1 是唯一能够完整实现 ACP RFD 目标的方案: ### Message Flow ``` -Client agentpool Agent (LLM) +Client wolfharness Agent (LLM) │ │ │ │── session/new ───────────▶│ │ │ mcp_servers: [{ │ │ @@ -440,7 +440,7 @@ ClientMethod = Literal[ #### 2. AcpMcpConnectionManager -新增 `agentpool_server/acp_server/acp_mcp_manager.py`: +新增 `wolfharness_server/acp_server/acp_mcp_manager.py`: ```python from __future__ import annotations @@ -573,7 +573,7 @@ async def ext_method(self, method: str, params: dict[str, Any]) -> dict[str, Any #### 4. fastmcp ClientTransport 实现 -**新增 `agentpool_server/acp_server/acp_mcp_transport.py`**: +**新增 `wolfharness_server/acp_server/acp_mcp_transport.py`**: ```python from fastmcp.client.transports import ClientTransport @@ -650,7 +650,7 @@ def mcp_config_to_acp(config: MCPServerConfig) -> McpServer: #### 7. AcpMCPServerConfig(新增) -在 `agentpool_config/mcp_server.py` 中新增: +在 `wolfharness_config/mcp_server.py` 中新增: ```python class AcpMCPServerConfig(MCPServerConfig): @@ -671,7 +671,7 @@ MCPServerConfig = Annotated[ #### 8. MCPResourceProvider 扩展 -在 `agentpool/mcp_server/provider.py` 中更新 `transport_type`: +在 `wolfharness/mcp_server/provider.py` 中更新 `transport_type`: ```python @property @@ -738,9 +738,9 @@ ACPSession (per-agent-session) | Threat | Impact | Likelihood | Mitigation | |--------|--------|------------|------------| -| 客户端注入恶意 MCP 工具 | High | Medium | 与现有 MCP 信任模型一致:agentpool 不对 MCP 工具内容进行额外验证,工具调用权限由用户在会话级别授权 | +| 客户端注入恶意 MCP 工具 | High | Medium | 与现有 MCP 信任模型一致:wolfharness 不对 MCP 工具内容进行额外验证,工具调用权限由用户在会话级别授权 | | `connectionId` 伪造/碰撞 | Medium | Low | `connectionId` 由客户端生成,Agent 仅验证其是否存在于本地连接表;使用完整 `uuid4().hex`(128-bit 熵),不可预测 | -| `mcp/message` 参数注入 | Low | Low | 透明转发,agentpool 不解析工具参数内容;安全责任由 MCP Server(客户端侧)承担 | +| `mcp/message` 参数注入 | Low | Low | 透明转发,wolfharness 不解析工具参数内容;安全责任由 MCP Server(客户端侧)承担 | | 连接未清理导致内存泄漏 | Medium | Low | 绑定 Agent 生命周期,Agent 关闭时强制 `close_all()` | ### Security Measures @@ -775,7 +775,7 @@ MCP-over-ACP 遵循与现有 MCP 传输相同的信任模型:工具调用由 A - 新增 `AcpMcpServer` schema - 扩展 `AgentMethod`/`ClientMethod` - 更新 `AgentCapabilities.create()` - - 更新 `MCPServerConfig` union(`agentpool_config/mcp_server.py`) + - 更新 `MCPServerConfig` union(`wolfharness_config/mcp_server.py`) - 更新 `MCPResourceProvider.transport_type` 返回类型 - **Deliverables**:Schema 变更 PR,附单元测试 - **Dependencies**:Pre-Phase 0 通过 @@ -839,8 +839,8 @@ MCP-over-ACP 遵循与现有 MCP 传输相同的信任模型:工具调用由 A - **Rationale**:命名一致性优先,虽略显冗长但明确无歧义 2. **pydantic-ai MCP transport 接入点** - - **Decision**:不直接对接 pydantic-ai,而是实现 `fastmcp.ClientTransport`,通过 `fastmcp.Client` 接入 agentpool 现有的 `MCPClient` - - **Rationale**:agentpool 实际使用 fastmcp(而非 pydantic-ai 的 MCP 抽象)管理 MCP 连接。`ClientTransport` 是正确的扩展点 + - **Decision**:不直接对接 pydantic-ai,而是实现 `fastmcp.ClientTransport`,通过 `fastmcp.Client` 接入 wolfharness 现有的 `MCPClient` + - **Rationale**:wolfharness 实际使用 fastmcp(而非 pydantic-ai 的 MCP 抽象)管理 MCP 连接。`ClientTransport` 是正确的扩展点 3. **`mcp/message` 的 method 归属** - **Decision**:`mcp/message` 注册在 `ClientMethod` 中(通过 `_` prefix 机制实现双向路由) @@ -858,7 +858,7 @@ MCP-over-ACP 遵循与现有 MCP 传输相同的信任模型:工具调用由 A - Status: **已解决** — 通过 `client.ext_method()` 主动发起,`ext_method()` 被动接收 `_mcp/message` 2. **fastmcp pinned 版本是否支持自定义 ClientTransport** - - Context:需确认 agentpool 当前锁定的 fastmcp 版本是否暴露 `ClientTransport` 接口 + - Context:需确认 wolfharness 当前锁定的 fastmcp 版本是否暴露 `ClientTransport` 接口 - Owner: 本 RFC 实现者 - Status: **Blocker for Pre-Phase 0** @@ -919,11 +919,11 @@ MCP-over-ACP 遵循与现有 MCP 传输相同的信任模型:工具调用由 A | `mcp/connect` method | `acp/schema/messages.py` | ClientMethod(Agent→Client) | | `mcp/disconnect` method | `acp/schema/messages.py` | ClientMethod(Agent→Client) | | `mcp/message` method | `acp/schema/messages.py` | ClientMethod(双向,通过 `_` prefix) | -| `AcpMcpServer` handler | `agentpool_server/acp_server/converters.py` | 转换逻辑(正向) | -| `AcpMcpServer` reverse handler | `agentpool_server/acp_server/acp_converters.py` | 转换逻辑(反向) | -| `AcpMCPServerConfig` | `agentpool_config/mcp_server.py` | Config 类 | -| `AcpMcpConnectionManager` | `agentpool_server/acp_server/acp_mcp_manager.py` | 核心逻辑 | -| `AcpMcpTransport` | `agentpool_server/acp_server/acp_mcp_transport.py` | fastmcp Transport | +| `AcpMcpServer` handler | `wolfharness_server/acp_server/converters.py` | 转换逻辑(正向) | +| `AcpMcpServer` reverse handler | `wolfharness_server/acp_server/acp_converters.py` | 转换逻辑(反向) | +| `AcpMCPServerConfig` | `wolfharness_config/mcp_server.py` | Config 类 | +| `AcpMcpConnectionManager` | `wolfharness_server/acp_server/acp_mcp_manager.py` | 核心逻辑 | +| `AcpMcpTransport` | `wolfharness_server/acp_server/acp_mcp_transport.py` | fastmcp Transport | #### B. `assert_never` 穷尽匹配更新清单 @@ -931,12 +931,12 @@ MCP-over-ACP 遵循与现有 MCP 传输相同的信任模型:工具调用由 A | 文件 | 函数/属性 | 操作 | |------|----------|------| -| `agentpool_server/acp_server/converters.py` | `convert_acp_mcp_server_to_config()` | 新增 `case AcpMcpServer()` | -| `agentpool_server/acp_server/acp_converters.py` | `mcp_config_to_acp()` | 新增 `case AcpMCPServerConfig()` | -| `agentpool/mcp_server/provider.py` | `transport_type` property | 新增 `"acp"` 到 return `Literal` | -| `agentpool/mcp_server/client.py` | `MCPClient._get_client()` | 新增 `case AcpMCPServerConfig()` | -| `agentpool_config/mcp_server.py` | `MCPServerConfig` union | 新增 `AcpMCPServerConfig` | -| `agentpool_config/mcp_server.py` | `parse_mcp_servers_json()` | 新增 `"acp"` transport 分支 | +| `wolfharness_server/acp_server/converters.py` | `convert_acp_mcp_server_to_config()` | 新增 `case AcpMcpServer()` | +| `wolfharness_server/acp_server/acp_converters.py` | `mcp_config_to_acp()` | 新增 `case AcpMCPServerConfig()` | +| `wolfharness/mcp_server/provider.py` | `transport_type` property | 新增 `"acp"` 到 return `Literal` | +| `wolfharness/mcp_server/client.py` | `MCPClient._get_client()` | 新增 `case AcpMCPServerConfig()` | +| `wolfharness_config/mcp_server.py` | `MCPServerConfig` union | 新增 `AcpMCPServerConfig` | +| `wolfharness_config/mcp_server.py` | `parse_mcp_servers_json()` | 新增 `"acp"` transport 分支 | #### C. 前置条件修复清单 diff --git a/docs/rfcs/implemented/RFC-0054-v2-message-id-infrastructure.md b/docs/rfcs/implemented/RFC-0054-v2-message-id-infrastructure.md index fc6834da1..cc23ae153 100644 --- a/docs/rfcs/implemented/RFC-0054-v2-message-id-infrastructure.md +++ b/docs/rfcs/implemented/RFC-0054-v2-message-id-infrastructure.md @@ -835,7 +835,7 @@ All open questions have been resolved: - OpenSpec Change: v2-message-id-infrastructure - [RFC-0050: AgentWolf v1 Foundation Architecture](../draft/RFC-0050-agentwolf-v1-foundation-architecture.md) - [RFC-0042: Unified Lifecycle Architecture](../draft/RFC-0042-unified-lifecycle-architecture.md) -- [GitHub Issue #154: Extend Feedback type with messageId](https://github.com/Leoyzen/agentpool/issues/154) +- [GitHub Issue #154: Extend Feedback type with messageId](https://github.com/Leoyzen/wolfharness/issues/154) ### External Resources @@ -862,6 +862,6 @@ All open questions have been resolved: | `orchestrator/session_pool.py` | Public API pass-through | Low — optional parameter | | `agents/native_agent/turn.py` | message_id propagation | Low — set field on events | | `agents/acp_agent/acp_converters.py` | Preserve incoming message_id | Low — conditional fallback | -| `agentpool_server/acp_server/event_converter.py` | Read from events | Low — mechanical | -| `agentpool_server/opencode_server/` | Read from events | Low — audit + update | +| `wolfharness_server/acp_server/event_converter.py` | Read from events | Low — mechanical | +| `wolfharness_server/opencode_server/` | Read from events | Low — audit + update | | `agui_server/` + `openai_api_server/` | Audit | Low — audit + update if needed | diff --git a/docs/tool-display-capability.example.yaml b/docs/tool-display-capability.example.yaml index 06acf19e6..99b94c8a8 100644 --- a/docs/tool-display-capability.example.yaml +++ b/docs/tool-display-capability.example.yaml @@ -62,7 +62,7 @@ agents: --- # 示例 3:子能力已自发射 —— 仅改名,关闭 diff 注入避免重复 # fsspec 等工具集已在内部 emit DiffContentItem(见 -# src/agentpool_toolsets/fsspec_toolset/toolset.py:575),装饰器只负责 +# src/wolfharness_toolsets/fsspec_toolset/toolset.py:575),装饰器只负责 # 改名,emit_diff: false。 # 注意:fsspec_read 不在内置 extractor 注册表中,emit_rich 只注入 start # 事件(kind/locations),不含内容 —— 如需内容需自行注册 extractor。 diff --git a/docs/tutorials/agent-usage.md b/docs/tutorials/agent-usage.md index 72d940e0f..99f4db20b 100644 --- a/docs/tutorials/agent-usage.md +++ b/docs/tutorials/agent-usage.md @@ -13,7 +13,7 @@ AgentPool provides multiple agent implementations with a shared interface. These Create and use an agent: ```python -from agentpool import Agent +from wolfharness import Agent from pydantic import BaseModel diff --git a/docs/tutorials/basic-concepts.md b/docs/tutorials/basic-concepts.md index b6e58e128..61603fa74 100644 --- a/docs/tutorials/basic-concepts.md +++ b/docs/tutorials/basic-concepts.md @@ -12,7 +12,7 @@ AgentPool uses a unified **node** abstraction for all message-processing entitie ````python exec="true" -from agentpool.messaging import MessageNode +from wolfharness.messaging import MessageNode node = mk.MkClassDiagram(MessageNode, mode="subclasses") print(node) ```` diff --git a/docs/tutorials/dependencies.md b/docs/tutorials/dependencies.md index 7921986d0..111402fe1 100644 --- a/docs/tutorials/dependencies.md +++ b/docs/tutorials/dependencies.md @@ -37,6 +37,6 @@ AgentPool installs optional features via extras. Some commonly used ones: For a full dependency tree, run: ```bash -pip show agentpool -pipdeptree -p agentpool +pip show wolfharness +pipdeptree -p wolfharness ``` \ No newline at end of file diff --git a/docs/tutorials/example-configurations.md b/docs/tutorials/example-configurations.md index b61a055db..cad15439b 100644 --- a/docs/tutorials/example-configurations.md +++ b/docs/tutorials/example-configurations.md @@ -21,7 +21,7 @@ Use the agent via an ACP client of your choice. Or programmatically: ```python -from agentpool import AgentPool +from wolfharness import AgentPool async with AgentPool("agents.yml") as pool: agent = pool.get_agent("url_opener") @@ -48,7 +48,7 @@ Create an agent that interacts with the file system: Use the file manager: ```python -from agentpool import Agent +from wolfharness import Agent async with AgentPool("agents.yml" as pool: agent = pool.get_agent("file_manager") diff --git a/docs/tutorials/example_simple.yml b/docs/tutorials/example_simple.yml index 5675312ef..acb877d87 100644 --- a/docs/tutorials/example_simple.yml +++ b/docs/tutorials/example_simple.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json agents: url_opener: type: native diff --git a/docs/tutorials/example_structured.yml b/docs/tutorials/example_structured.yml index 2276d10bb..0ebee8b4e 100644 --- a/docs/tutorials/example_structured.yml +++ b/docs/tutorials/example_structured.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json responses: CodeReview: response_schema: diff --git a/docs/tutorials/example_tools.yml b/docs/tutorials/example_tools.yml index 08e5df0bc..552330407 100644 --- a/docs/tutorials/example_tools.yml +++ b/docs/tutorials/example_tools.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json agents: file_manager: type: native diff --git a/docs/tutorials/examples/create_docs/config.yml b/docs/tutorials/examples/create_docs/config.yml index 41178c317..2f74c03e4 100644 --- a/docs/tutorials/examples/create_docs/config.yml +++ b/docs/tutorials/examples/create_docs/config.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json agents: file_scanner: type: native diff --git a/docs/tutorials/examples/create_docs/index.md b/docs/tutorials/examples/create_docs/index.md index f2c3621d3..4f385764a 100644 --- a/docs/tutorials/examples/create_docs/index.md +++ b/docs/tutorials/examples/create_docs/index.md @@ -32,7 +32,7 @@ This demonstrates different ways agents can collaborate: ```python # /// script -# dependencies = ["agentpool", "mypy"] +# dependencies = ["wolfharness", "mypy"] # /// @@ -52,8 +52,8 @@ from pathlib import Path from mypy import api import rich -from agentpool import Agent, AgentPool, AgentsManifest -from agentpool.docs.utils import run +from wolfharness import Agent, AgentPool, AgentsManifest +from wolfharness.docs.utils import run # set your OpenAI API key here @@ -84,11 +84,11 @@ async def main() -> None: scanner.connect_to(writer) # Start async docs generation (the writer will start working in async fashion) - await scanner.run('List all Python files in "src/agentpool/agent"') + await scanner.run('List all Python files in "src/wolfharness/agent"') assert isinstance(scanner, Agent) # Use error checker as tool (this blocks until complete) scanner.register_worker(checker) - prompt = 'Check types for all Python files in "src/agentpool/agent"' + prompt = 'Check types for all Python files in "src/wolfharness/agent"' result = await scanner.run(prompt) rich.print(f"Type checking result:\n{result.data}") @@ -103,7 +103,7 @@ if __name__ == "__main__": ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json agents: file_scanner: type: native diff --git a/docs/tutorials/examples/create_docs/main.py b/docs/tutorials/examples/create_docs/main.py index 49e632e5b..0f3bc134c 100644 --- a/docs/tutorials/examples/create_docs/main.py +++ b/docs/tutorials/examples/create_docs/main.py @@ -1,5 +1,5 @@ # /// script -# dependencies = ["agentpool", "mypy"] +# dependencies = ["wolfharness", "mypy"] # /// @@ -19,8 +19,8 @@ from mypy import api import rich -from agentpool import Agent, AgentPool, AgentsManifest -from agentpool.docs.utils import run +from wolfharness import Agent, AgentPool, AgentsManifest +from wolfharness.docs.utils import run # set your OpenAI API key here @@ -51,11 +51,11 @@ async def main() -> None: scanner.connect_to(writer) # Start async docs generation (the writer will start working in async fashion) - await scanner.run('List all Python files in "src/agentpool/agent"') + await scanner.run('List all Python files in "src/wolfharness/agent"') assert isinstance(scanner, Agent) # Use error checker as tool (this blocks until complete) scanner.register_worker(checker) - prompt = 'Check types for all Python files in "src/agentpool/agent"' + prompt = 'Check types for all Python files in "src/wolfharness/agent"' result = await scanner.run(prompt) rich.print(f"Type checking result:\n{result.data}") diff --git a/docs/tutorials/examples/crewai_flow/config.yml b/docs/tutorials/examples/crewai_flow/config.yml index e8cfb3cbc..1cc4f9ff3 100644 --- a/docs/tutorials/examples/crewai_flow/config.yml +++ b/docs/tutorials/examples/crewai_flow/config.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json agents: city_picker: type: native diff --git a/docs/tutorials/examples/crewai_flow/index.md b/docs/tutorials/examples/crewai_flow/index.md index 4cf311048..a08c5d6a5 100644 --- a/docs/tutorials/examples/crewai_flow/index.md +++ b/docs/tutorials/examples/crewai_flow/index.md @@ -14,7 +14,7 @@ This example demonstrates a CrewAI-like workflow pattern implemented in AgentPoo ```python # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// """Adaption of a CrewAI-like flow.""" @@ -23,9 +23,9 @@ from __future__ import annotations import os -from agentpool import Agent, AgentsManifest -from agentpool.docs.utils import get_config_path, is_pyodide, run -from agentpool.running import node_function, run_nodes_async +from wolfharness import Agent, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run +from wolfharness.running import node_function, run_nodes_async # set your OpenAI API key here @@ -62,7 +62,7 @@ if __name__ == "__main__": ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json agents: city_picker: type: native diff --git a/docs/tutorials/examples/crewai_flow/main.py b/docs/tutorials/examples/crewai_flow/main.py index 7f0535415..d5fdc8c97 100644 --- a/docs/tutorials/examples/crewai_flow/main.py +++ b/docs/tutorials/examples/crewai_flow/main.py @@ -1,5 +1,5 @@ # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// """Adaption of a CrewAI-like flow.""" @@ -8,9 +8,9 @@ import os -from agentpool import Agent, AgentsManifest -from agentpool.docs.utils import get_config_path, is_pyodide, run -from agentpool.running import node_function, run_nodes_async +from wolfharness import Agent, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run +from wolfharness.running import node_function, run_nodes_async # set your OpenAI API key here diff --git a/docs/tutorials/examples/download_agents/config.yml b/docs/tutorials/examples/download_agents/config.yml index 123b634a9..afd6dabeb 100644 --- a/docs/tutorials/examples/download_agents/config.yml +++ b/docs/tutorials/examples/download_agents/config.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json storage: # List of storage providers (can use multiple) providers: @@ -23,7 +23,7 @@ agents: 3. Never stop believing in your team! 🎉 tools: - type: agent_cli # Need to know who to cheer for! - - agentpool_docs/examples.download_agents.main.cheer + - wolfharness_docs/examples.download_agents.main.cheer file_getter_1: type: native diff --git a/docs/tutorials/examples/download_agents/index.md b/docs/tutorials/examples/download_agents/index.md index 30c801f35..47c2ff0db 100644 --- a/docs/tutorials/examples/download_agents/index.md +++ b/docs/tutorials/examples/download_agents/index.md @@ -42,7 +42,7 @@ This demonstrates: ```python # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// @@ -63,13 +63,13 @@ from dataclasses import dataclass import os from typing import TYPE_CHECKING, Any -from agentpool import AgentPool, AgentsManifest -from agentpool.agents.events import RichAgentStreamEvent -from agentpool.docs.utils import get_config_path, is_pyodide, run +from wolfharness import AgentPool, AgentsManifest +from wolfharness.agents.events import RichAgentStreamEvent +from wolfharness.docs.utils import get_config_path, is_pyodide, run if TYPE_CHECKING: - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext # set your OpenAI API key here @@ -112,7 +112,7 @@ async def run_example() -> None: manifest = AgentsManifest.from_file(config_path) async def event_handler(ctx: AgentContext[Any], event: RichAgentStreamEvent[Any]) -> None: - from agentpool.agents.events import ToolCallProgressEvent + from wolfharness.agents.events import ToolCallProgressEvent if isinstance(event, ToolCallProgressEvent): print(f"Progress: {event.progress}/{event.total} - {event.message}") @@ -156,7 +156,7 @@ if __name__ == "__main__": ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json storage: # List of storage providers (can use multiple) providers: @@ -181,7 +181,7 @@ agents: 3. Never stop believing in your team! 🎉 tools: - type: agent_cli # Need to know who to cheer for! - - agentpool_docs/examples.download_agents.main.cheer + - wolfharness_docs/examples.download_agents.main.cheer file_getter_1: type: native diff --git a/docs/tutorials/examples/download_agents/main.py b/docs/tutorials/examples/download_agents/main.py index 54aea6643..450ce307e 100644 --- a/docs/tutorials/examples/download_agents/main.py +++ b/docs/tutorials/examples/download_agents/main.py @@ -1,5 +1,5 @@ # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// @@ -20,13 +20,13 @@ import os from typing import TYPE_CHECKING, Any -from agentpool import AgentPool, AgentsManifest -from agentpool.agents.events import RichAgentStreamEvent -from agentpool.docs.utils import get_config_path, is_pyodide, run +from wolfharness import AgentPool, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run if TYPE_CHECKING: - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext + from wolfharness.agents.events import RichAgentStreamEvent # set your OpenAI API key here @@ -69,7 +69,7 @@ async def run_example() -> None: manifest = AgentsManifest.from_file(config_path) async def event_handler(ctx: AgentContext[Any], event: RichAgentStreamEvent[Any]) -> None: - from agentpool.agents.events import ToolCallProgressEvent + from wolfharness.agents.events import ToolCallProgressEvent if isinstance(event, ToolCallProgressEvent): print(f"Progress: {event.progress}/{event.total} - {event.message}") diff --git a/docs/tutorials/examples/download_workers/config.yml b/docs/tutorials/examples/download_workers/config.yml index 9801b29d7..e324df355 100644 --- a/docs/tutorials/examples/download_workers/config.yml +++ b/docs/tutorials/examples/download_workers/config.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json agents: overseer: type: native diff --git a/docs/tutorials/examples/download_workers/index.md b/docs/tutorials/examples/download_workers/index.md index 6e6189751..a4f078893 100644 --- a/docs/tutorials/examples/download_workers/index.md +++ b/docs/tutorials/examples/download_workers/index.md @@ -24,7 +24,7 @@ Key features: ```python # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// @@ -41,8 +41,8 @@ from __future__ import annotations import os import time -from agentpool import AgentPool, AgentsManifest -from agentpool.docs.utils import get_config_path, is_pyodide, run +from wolfharness import AgentPool, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run PROMPT = "Download this file using both agent tools available to you: http://speedtest.tele2.net/10MB.zip" @@ -83,7 +83,7 @@ if __name__ == "__main__": ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json agents: overseer: type: native diff --git a/docs/tutorials/examples/download_workers/main.py b/docs/tutorials/examples/download_workers/main.py index 438f9c9ed..b84cf7aef 100644 --- a/docs/tutorials/examples/download_workers/main.py +++ b/docs/tutorials/examples/download_workers/main.py @@ -1,5 +1,5 @@ # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// @@ -16,8 +16,8 @@ import os import time -from agentpool import AgentPool, AgentsManifest -from agentpool.docs.utils import get_config_path, is_pyodide, run +from wolfharness import AgentPool, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run PROMPT = "Download this file using both agent tools available to you: http://speedtest.tele2.net/10MB.zip" diff --git a/docs/tutorials/examples/human_interaction/config.yml b/docs/tutorials/examples/human_interaction/config.yml index eaf97c547..efa530977 100644 --- a/docs/tutorials/examples/human_interaction/config.yml +++ b/docs/tutorials/examples/human_interaction/config.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json agents: assistant: type: native diff --git a/docs/tutorials/examples/human_interaction/index.md b/docs/tutorials/examples/human_interaction/index.md index 582e5d1c7..1e5674fa9 100644 --- a/docs/tutorials/examples/human_interaction/index.md +++ b/docs/tutorials/examples/human_interaction/index.md @@ -43,7 +43,7 @@ This demonstrates how to: ```python # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// @@ -59,8 +59,8 @@ from __future__ import annotations import os -from agentpool import AgentPool, AgentsManifest -from agentpool.docs.utils import get_config_path, is_pyodide, run +from wolfharness import AgentPool, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run # set your OpenAI API key here @@ -97,7 +97,7 @@ if __name__ == "__main__": ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json agents: assistant: type: native diff --git a/docs/tutorials/examples/human_interaction/main.py b/docs/tutorials/examples/human_interaction/main.py index b39d680cf..18101a45c 100644 --- a/docs/tutorials/examples/human_interaction/main.py +++ b/docs/tutorials/examples/human_interaction/main.py @@ -1,5 +1,5 @@ # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// @@ -15,8 +15,8 @@ import os -from agentpool import AgentPool, AgentsManifest -from agentpool.docs.utils import get_config_path, is_pyodide, run +from wolfharness import AgentPool, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run # set your OpenAI API key here diff --git a/docs/tutorials/examples/index.md b/docs/tutorials/examples/index.md index 9a4a46fbe..a1c8c9379 100644 --- a/docs/tutorials/examples/index.md +++ b/docs/tutorials/examples/index.md @@ -89,4 +89,4 @@ Each example includes: - **Code examples**: Python code demonstrating usage patterns - **Explanations**: Detailed descriptions of concepts and approaches -You can find the full source code for these examples in the [GitHub repository](https://github.com/Million-mo/agentpool/tree/main/examples). +You can find the full source code for these examples in the [GitHub repository](https://github.com/Million-mo/wolfharness/tree/main/examples). diff --git a/docs/tutorials/examples/mcp_sampling_elicitation/demo.py b/docs/tutorials/examples/mcp_sampling_elicitation/demo.py index 36e4f9c7b..cd952c05b 100644 --- a/docs/tutorials/examples/mcp_sampling_elicitation/demo.py +++ b/docs/tutorials/examples/mcp_sampling_elicitation/demo.py @@ -1,5 +1,5 @@ # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// """Demo: Agent using MCP server with code fixer (sampling + elicitation).""" @@ -10,8 +10,8 @@ import anyio -from agentpool import Agent -from agentpool_config.mcp_server import StdioMCPServerConfig +from wolfharness import Agent +from wolfharness_config.mcp_server import StdioMCPServerConfig async def main() -> None: diff --git a/docs/tutorials/examples/mcp_sampling_elicitation/index.md b/docs/tutorials/examples/mcp_sampling_elicitation/index.md index e45e4b688..848fba5f8 100644 --- a/docs/tutorials/examples/mcp_sampling_elicitation/index.md +++ b/docs/tutorials/examples/mcp_sampling_elicitation/index.md @@ -94,7 +94,7 @@ if __name__ == "__main__": ```python # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// """Demo: Agent using MCP server with code fixer (sampling + elicitation).""" @@ -105,8 +105,8 @@ from pathlib import Path import anyio -from agentpool import Agent -from agentpool_config.mcp_server import StdioMCPServerConfig +from wolfharness import Agent +from wolfharness_config.mcp_server import StdioMCPServerConfig async def main() -> None: diff --git a/docs/tutorials/examples/mcp_servers_yaml/config.yml b/docs/tutorials/examples/mcp_servers_yaml/config.yml index 4ecf8494d..6216d4b90 100644 --- a/docs/tutorials/examples/mcp_servers_yaml/config.yml +++ b/docs/tutorials/examples/mcp_servers_yaml/config.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json mcp_servers: - "uvx mcp-server-git" diff --git a/docs/tutorials/examples/mcp_servers_yaml/index.md b/docs/tutorials/examples/mcp_servers_yaml/index.md index 2a2611b9e..a68c9bc69 100644 --- a/docs/tutorials/examples/mcp_servers_yaml/index.md +++ b/docs/tutorials/examples/mcp_servers_yaml/index.md @@ -27,7 +27,7 @@ This example demonstrates how to configure MCP servers directly in YAML and use ```python # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// @@ -44,8 +44,8 @@ from __future__ import annotations import os -from agentpool import AgentPool, AgentsManifest -from agentpool.docs.utils import get_config_path, is_pyodide, run +from wolfharness import AgentPool, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run PROMPT = "Get the latest commit hash!" @@ -81,15 +81,15 @@ if __name__ == "__main__": ```python # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// """Example: Two agents working together to explore git commit history.""" from __future__ import annotations -from agentpool import Agent, Team -from agentpool.docs.utils import run +from wolfharness import Agent, Team +from wolfharness.docs.utils import run PICKER = """ @@ -151,7 +151,7 @@ includes the following details: ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json mcp_servers: - "uvx mcp-server-git" diff --git a/docs/tutorials/examples/mcp_servers_yaml/main_py.py b/docs/tutorials/examples/mcp_servers_yaml/main_py.py index e0bc3c004..815bbe67d 100644 --- a/docs/tutorials/examples/mcp_servers_yaml/main_py.py +++ b/docs/tutorials/examples/mcp_servers_yaml/main_py.py @@ -1,13 +1,13 @@ # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// """Example: Two agents working together to explore git commit history.""" from __future__ import annotations -from agentpool import Agent, Team -from agentpool.docs.utils import run +from wolfharness import Agent, Team +from wolfharness.docs.utils import run PICKER = """ diff --git a/docs/tutorials/examples/mcp_servers_yaml/main_yaml.py b/docs/tutorials/examples/mcp_servers_yaml/main_yaml.py index d8f77314c..42854b2f6 100644 --- a/docs/tutorials/examples/mcp_servers_yaml/main_yaml.py +++ b/docs/tutorials/examples/mcp_servers_yaml/main_yaml.py @@ -1,5 +1,5 @@ # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// @@ -16,8 +16,8 @@ import os -from agentpool import AgentPool, AgentsManifest -from agentpool.docs.utils import get_config_path, is_pyodide, run +from wolfharness import AgentPool, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run PROMPT = "Get the latest commit hash!" diff --git a/docs/tutorials/examples/mcp_skills/config.yml b/docs/tutorials/examples/mcp_skills/config.yml index 6677a7755..0816a8aab 100644 --- a/docs/tutorials/examples/mcp_skills/config.yml +++ b/docs/tutorials/examples/mcp_skills/config.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json # Example: MCP-Exposed Skills # # This example demonstrates how to use skills exposed by MCP servers. diff --git a/docs/tutorials/examples/mcp_skills/index.md b/docs/tutorials/examples/mcp_skills/index.md index 82390e723..1bb8abe6a 100644 --- a/docs/tutorials/examples/mcp_skills/index.md +++ b/docs/tutorials/examples/mcp_skills/index.md @@ -233,14 +233,14 @@ def get_pdf_example(filename: str) -> bytes: ```bash # List all available skills (local + MCP) -agentpool run mcp_skills/skill_discoverer "List all available skills" +wolfharness run mcp_skills/skill_discoverer "List all available skills" # Load a specific MCP skill -agentpool run mcp_skills/mcp_skill_user \ +wolfharness run mcp_skills/mcp_skill_user \ "Load the skill://mcp-server-with-prompts/code-review skill" # Auto-route to a skill by short name -agentpool run mcp_skills/mcp_skill_user \ +wolfharness run mcp_skills/mcp_skill_user \ "Load the code-review skill" ``` @@ -290,7 +290,7 @@ Reference not found: 'skill://server/skill/file.md' ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json # Example: MCP-Exposed Skills # # This example demonstrates how to use skills exposed by MCP servers. diff --git a/docs/tutorials/examples/model_comparison/config.yml b/docs/tutorials/examples/model_comparison/config.yml index ae4feb4de..60b3553d7 100644 --- a/docs/tutorials/examples/model_comparison/config.yml +++ b/docs/tutorials/examples/model_comparison/config.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json agents: overseer: type: native diff --git a/docs/tutorials/examples/model_comparison/index.md b/docs/tutorials/examples/model_comparison/index.md index f0074cf7a..ed237a9a8 100644 --- a/docs/tutorials/examples/model_comparison/index.md +++ b/docs/tutorials/examples/model_comparison/index.md @@ -14,7 +14,7 @@ This example demonstrates comparing different AI models using parallel teams in ```python # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// @@ -31,8 +31,8 @@ from __future__ import annotations import os -from agentpool import AgentPool, AgentsManifest -from agentpool.docs.utils import get_config_path, is_pyodide, run +from wolfharness import AgentPool, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run # set your OpenAI API key here @@ -81,7 +81,7 @@ if __name__ == "__main__": ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json agents: overseer: type: native diff --git a/docs/tutorials/examples/model_comparison/main.py b/docs/tutorials/examples/model_comparison/main.py index 71c4ca0d1..641af2b37 100644 --- a/docs/tutorials/examples/model_comparison/main.py +++ b/docs/tutorials/examples/model_comparison/main.py @@ -1,5 +1,5 @@ # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// @@ -16,8 +16,8 @@ import os -from agentpool import AgentPool, AgentsManifest -from agentpool.docs.utils import get_config_path, is_pyodide, run +from wolfharness import AgentPool, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run # set your OpenAI API key here diff --git a/docs/tutorials/examples/pytest_style/config.yml b/docs/tutorials/examples/pytest_style/config.yml index a5a96cfd0..eb26d0238 100644 --- a/docs/tutorials/examples/pytest_style/config.yml +++ b/docs/tutorials/examples/pytest_style/config.yml @@ -1,3 +1,3 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json # This example creates agents programmatically - no YAML config needed agents: {} diff --git a/docs/tutorials/examples/pytest_style/index.md b/docs/tutorials/examples/pytest_style/index.md index a1412d863..34b17706c 100644 --- a/docs/tutorials/examples/pytest_style/index.md +++ b/docs/tutorials/examples/pytest_style/index.md @@ -39,7 +39,7 @@ This provides a clean, declarative way to orchestrate multi-agent workflows, sim ```python # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// @@ -58,12 +58,12 @@ from __future__ import annotations import os from typing import TYPE_CHECKING -from agentpool.docs.utils import get_config_path, is_pyodide, run -from agentpool.running import node_function, run_nodes_async +from wolfharness.docs.utils import get_config_path, is_pyodide, run +from wolfharness.running import node_function, run_nodes_async if TYPE_CHECKING: - from agentpool import Agent + from wolfharness import Agent # set your OpenAI API key here os.environ["OPENAI_API_KEY"] = os.environ.get("OPENAI_API_KEY", "your_api_key_here") @@ -113,7 +113,7 @@ if __name__ == "__main__": ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json # This example creates agents programmatically - no YAML config needed agents: {} ``` diff --git a/docs/tutorials/examples/pytest_style/main.py b/docs/tutorials/examples/pytest_style/main.py index c987487b7..364ea1738 100644 --- a/docs/tutorials/examples/pytest_style/main.py +++ b/docs/tutorials/examples/pytest_style/main.py @@ -1,5 +1,5 @@ # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// @@ -18,12 +18,12 @@ import os from typing import TYPE_CHECKING -from agentpool.docs.utils import get_config_path, is_pyodide, run -from agentpool.running import node_function, run_nodes_async +from wolfharness.docs.utils import get_config_path, is_pyodide, run +from wolfharness.running import node_function, run_nodes_async if TYPE_CHECKING: - from agentpool import Agent + from wolfharness import Agent # set your OpenAI API key here os.environ["OPENAI_API_KEY"] = os.environ.get("OPENAI_API_KEY", "your_api_key_here") diff --git a/docs/tutorials/examples/round_robin/config.yml b/docs/tutorials/examples/round_robin/config.yml index d36071475..bf53e79e6 100644 --- a/docs/tutorials/examples/round_robin/config.yml +++ b/docs/tutorials/examples/round_robin/config.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json prompts: system_prompts: word_chain: diff --git a/docs/tutorials/examples/round_robin/index.md b/docs/tutorials/examples/round_robin/index.md index 1b0b5b83e..f3f3a3a1b 100644 --- a/docs/tutorials/examples/round_robin/index.md +++ b/docs/tutorials/examples/round_robin/index.md @@ -33,7 +33,7 @@ You can add various conditions to control the conversation: ```python # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// """Run round-robin example demonstrating cyclic communication pattern.""" @@ -42,8 +42,8 @@ from __future__ import annotations import os -from agentpool.__main__ import run_command # type: ignore[attr-defined] -from agentpool.docs.utils import get_config_path, is_pyodide +from wolfharness.__main__ import run_command # type: ignore[attr-defined] +from wolfharness.docs.utils import get_config_path, is_pyodide # set your OpenAI API key here @@ -69,7 +69,7 @@ if __name__ == "__main__": ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json prompts: system_prompts: word_chain: diff --git a/docs/tutorials/examples/round_robin/main.py b/docs/tutorials/examples/round_robin/main.py index d4d4f77da..aded0b50a 100644 --- a/docs/tutorials/examples/round_robin/main.py +++ b/docs/tutorials/examples/round_robin/main.py @@ -1,5 +1,5 @@ # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// """Run round-robin example demonstrating cyclic communication pattern.""" @@ -8,8 +8,8 @@ import os -from agentpool.__main__ import run_command # type: ignore[attr-defined] -from agentpool.docs.utils import get_config_path, is_pyodide +from wolfharness.__main__ import run_command # type: ignore[attr-defined] +from wolfharness.docs.utils import get_config_path, is_pyodide # set your OpenAI API key here diff --git a/docs/tutorials/examples/skill_uri_loading/config.yml b/docs/tutorials/examples/skill_uri_loading/config.yml index 5dc2b58bb..f3f826921 100644 --- a/docs/tutorials/examples/skill_uri_loading/config.yml +++ b/docs/tutorials/examples/skill_uri_loading/config.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json # Example: Loading Skills by URI # # This example demonstrates how to load skills using the skill:// URI scheme. diff --git a/docs/tutorials/examples/skill_uri_loading/index.md b/docs/tutorials/examples/skill_uri_loading/index.md index 15d02bae3..9b27bf59f 100644 --- a/docs/tutorials/examples/skill_uri_loading/index.md +++ b/docs/tutorials/examples/skill_uri_loading/index.md @@ -101,16 +101,16 @@ Available skills: ```bash # List available skills -agentpool run skill_uri_loading/skill_lister "List all available skills" +wolfharness run skill_uri_loading/skill_lister "List all available skills" # Load a skill by short name -agentpool run skill_uri_loading/skill_loader "Load the greeting skill" +wolfharness run skill_uri_loading/skill_loader "Load the greeting skill" # Load with arguments -agentpool run skill_uri_loading/skill_loader 'Load greeting with "Alice Company formal"' +wolfharness run skill_uri_loading/skill_loader 'Load greeting with "Alice Company formal"' # Load by full URI -agentpool run skill_uri_loading/skill_loader "Load skill://local/greeting" +wolfharness run skill_uri_loading/skill_loader "Load skill://local/greeting" ``` ## URI Format Reference @@ -127,7 +127,7 @@ See [Skill URI Usage](../../../how-to/configuration/skill-uri-usage.md) for comp ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json # Example: Loading Skills by URI # # This example demonstrates how to load skills using the skill:// URI scheme. diff --git a/docs/tutorials/examples/skill_with_references/config.yml b/docs/tutorials/examples/skill_with_references/config.yml index 3be790611..ec87af5b6 100644 --- a/docs/tutorials/examples/skill_with_references/config.yml +++ b/docs/tutorials/examples/skill_with_references/config.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json # Example: Skills with References # # This example demonstrates how to create skills with supporting reference files. diff --git a/docs/tutorials/examples/skill_with_references/index.md b/docs/tutorials/examples/skill_with_references/index.md index c826c32db..78e7649ff 100644 --- a/docs/tutorials/examples/skill_with_references/index.md +++ b/docs/tutorials/examples/skill_with_references/index.md @@ -166,15 +166,15 @@ skills/testing/ ```bash # Load the main skill -agentpool run skill_with_references/documentation_helper \ +wolfharness run skill_with_references/documentation_helper \ "Load the documentation-style-guide skill" # Load a reference file -agentpool run skill_with_references/documentation_helper \ +wolfharness run skill_with_references/documentation_helper \ "Load the structure reference from documentation-style-guide" # Explore all references -agentpool run skill_with_references/reference_explorer \ +wolfharness run skill_with_references/reference_explorer \ "Show me all references for documentation-style-guide" ``` @@ -195,7 +195,7 @@ agentpool run skill_with_references/reference_explorer \ ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json # Example: Skills with References # # This example demonstrates how to create skills with supporting reference files. diff --git a/docs/tutorials/examples/structured_response/config.yml b/docs/tutorials/examples/structured_response/config.yml index 322956203..ced956715 100644 --- a/docs/tutorials/examples/structured_response/config.yml +++ b/docs/tutorials/examples/structured_response/config.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json responses: YamlResult: response_schema: diff --git a/docs/tutorials/examples/structured_response/index.md b/docs/tutorials/examples/structured_response/index.md index a2ba1d5e0..f9f228aa5 100644 --- a/docs/tutorials/examples/structured_response/index.md +++ b/docs/tutorials/examples/structured_response/index.md @@ -44,7 +44,7 @@ This demonstrates: ```python # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// """Example of structured responses defined both in code and YAML.""" @@ -53,8 +53,8 @@ import os from schemez import Schema -from agentpool import Agent, AgentPool, AgentsManifest -from agentpool.docs.utils import get_config_path, is_pyodide, run +from wolfharness import Agent, AgentPool, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run # set your OpenAI API key here @@ -107,7 +107,7 @@ if __name__ == "__main__": ### `config.yml` ```yaml -# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/Million-mo/wolfharness/refs/heads/main/schema/config-schema.json responses: YamlResult: response_schema: diff --git a/docs/tutorials/examples/structured_response/main.py b/docs/tutorials/examples/structured_response/main.py index bf8568421..c1b126348 100644 --- a/docs/tutorials/examples/structured_response/main.py +++ b/docs/tutorials/examples/structured_response/main.py @@ -1,5 +1,5 @@ # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// """Example of structured responses defined both in code and YAML.""" @@ -8,8 +8,8 @@ from schemez import Schema -from agentpool import Agent, AgentPool, AgentsManifest -from agentpool.docs.utils import get_config_path, is_pyodide, run +from wolfharness import Agent, AgentPool, AgentsManifest +from wolfharness.docs.utils import get_config_path, is_pyodide, run # set your OpenAI API key here diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md index bc9d7458e..125cfb7c8 100644 --- a/docs/tutorials/index.md +++ b/docs/tutorials/index.md @@ -12,14 +12,14 @@ icon: material/school Simple installation ```bash -uv tool install agentpool +uv tool install wolfharness ``` Multiple extras ```bash -uv tool install agentpool[default, coding] +uv tool install wolfharness[default, coding] ``` ## Available Extras @@ -50,9 +50,9 @@ uv tool install agentpool[default, coding] No installation needed - run directly with uvx: ```bash -uvx --python 3.13 agentpool@latest serve-acp +uvx --python 3.13 wolfharness@latest serve-acp # or -uvx --python 3.13 agentpool@latest serve-acp path/to/agents.yml +uvx --python 3.13 wolfharness@latest serve-acp path/to/agents.yml ``` diff --git a/docs/tutorials/quickstart.md b/docs/tutorials/quickstart.md index dc14eed7f..53b0382d6 100644 --- a/docs/tutorials/quickstart.md +++ b/docs/tutorials/quickstart.md @@ -8,14 +8,14 @@ icon: material/rocket-launch ## ACP Integration (Recommended) -The fastest way to get started is through the **Agent Client Protocol (ACP)**, which integrates agentpool directly into your IDE. +The fastest way to get started is through the **Agent Client Protocol (ACP)**, which integrates wolfharness directly into your IDE. ### One-Line Setup No installation needed - run directly with uvx: ```bash -uvx --python 3.13 agentpool@latest serve-acp agents.yml +uvx --python 3.13 wolfharness@latest serve-acp agents.yml ``` ### IDE Configuration (Zed) @@ -29,7 +29,7 @@ Add to your Zed `settings.json`: "command": "uvx", "args": [ "--python", "3.13", - "agentpool@latest", + "wolfharness@latest", "serve-acp", "path/to/your/agents.yml" ], @@ -65,13 +65,13 @@ Initialize and manage configurations: ```bash # Create starter configuration -agentpool init agents.yml +wolfharness init agents.yml # Add to your configurations -agentpool add agents.yml +wolfharness add agents.yml # Start chatting -agentpool chat assistant +wolfharness chat assistant ``` ## Configured Agents @@ -92,7 +92,7 @@ agents: Use it in code: ```python -from agentpool import AgentPool +from wolfharness import AgentPool async def main(): async with AgentPool("agents.yml") as pool: @@ -110,7 +110,7 @@ if __name__ == "__main__": Quick model interactions without configuration: ```python -from agentpool import run_with_model, run_with_model_sync +from wolfharness import run_with_model, run_with_model_sync # Async usage async def main(): diff --git a/duties.py b/duties.py index 3a70922df..566ff268e 100644 --- a/duties.py +++ b/duties.py @@ -78,13 +78,13 @@ def serve(ctx, *args: str): ctx.run("uv run zensical build") ctx.run("uv run python scripts/reorder_nav.py") # Serve the static site directly (zensical serve would rebuild and undo reorder) - # Create a temp structure to match zensical's URL scheme: /agentpool/ + # Create a temp structure to match zensical's URL scheme: /wolfharness/ import tempfile with tempfile.TemporaryDirectory() as tmpdir: tmp_path = Path(tmpdir) - (tmp_path / "agentpool").symlink_to(Path("site").resolve()) - print(f"Serving at http://localhost:{port}/agentpool/") + (tmp_path / "wolfharness").symlink_to(Path("site").resolve()) + print(f"Serving at http://localhost:{port}/wolfharness/") ctx.run(f"uv run python -m http.server {port} -d {tmpdir} -b localhost") else: args_str = " " + " ".join(args) if args else "" @@ -122,7 +122,7 @@ def _get_lint_targets(filepath: str | None) -> tuple[str, str, str | None]: return ( ".", "src/", - "src/agentpool/config_resources/*.yml docs/examples/**/config.yml", + "src/wolfharness/config_resources/*.yml docs/examples/**/config.yml", ) path = Path(filepath) @@ -169,7 +169,7 @@ def lint(ctx, filepath: str | None = None): # noqa: D417 # Full project lint - run jsonschema on all config files ctx.run( "uv run check-jsonschema --schemafile schema/config-schema.json " - "src/agentpool/config_resources/*.yml " + "src/wolfharness/config_resources/*.yml " "docs/examples/**/config.yml" ) @@ -198,7 +198,7 @@ def lint_check(ctx, filepath: str | None = None): # noqa: D417 # Full project lint - run jsonschema on all config files ctx.run( "uv run check-jsonschema --schemafile schema/config-schema.json " - "src/agentpool/config_resources/*.yml " + "src/wolfharness/config_resources/*.yml " "docs/examples/**/config.yml" ) @@ -270,7 +270,7 @@ def smoke_test(ctx, timeout: int = 10): # noqa: D417 # Run serve-acp from the wheel in an isolated environment result = subprocess.run( # noqa: PLW1510 - ["timeout", str(timeout), "uvx", "--from", str(wheel), "agentpool", "serve-acp"], + ["timeout", str(timeout), "uvx", "--from", str(wheel), "wolfharness", "serve-acp"], capture_output=True, text=True, ) @@ -308,4 +308,4 @@ def opencode_server(ctx, *args: str): duty opencode-server --port 8080 # Start on custom port """ args_str = " " + " ".join(args) if args else "" - ctx.run(f"uv run agentpool serve-opencode{args_str}") + ctx.run(f"uv run wolfharness serve-opencode{args_str}") diff --git a/examples/__init__.py b/examples/__init__.py index 22fb0f8bc..fd7e22311 100644 --- a/examples/__init__.py +++ b/examples/__init__.py @@ -1 +1 @@ -"""Examples demonstrating agentpool features and usage patterns.""" +"""Examples demonstrating wolfharness features and usage patterns.""" diff --git a/examples/a2a_server_example.py b/examples/a2a_server_example.py index fb6a44350..0e39d910b 100644 --- a/examples/a2a_server_example.py +++ b/examples/a2a_server_example.py @@ -12,8 +12,8 @@ import anyio -from agentpool import Agent, AgentPool -from agentpool_server.a2a_server import A2AServer +from wolfharness import Agent, AgentPool +from wolfharness_server.a2a_server import A2AServer async def main() -> None: diff --git a/examples/aggregating_server_with_agui.py b/examples/aggregating_server_with_agui.py index 351e7b5e8..b36bd7113 100644 --- a/examples/aggregating_server_with_agui.py +++ b/examples/aggregating_server_with_agui.py @@ -12,8 +12,8 @@ import anyio -from agentpool import Agent, AgentPool -from agentpool_server import A2AServer, AggregatingServer, AGUIServer +from wolfharness import Agent, AgentPool +from wolfharness_server import A2AServer, AggregatingServer, AGUIServer async def main() -> None: diff --git a/examples/agui_server_example.py b/examples/agui_server_example.py index c5c872ac5..e94551ef4 100644 --- a/examples/agui_server_example.py +++ b/examples/agui_server_example.py @@ -10,8 +10,8 @@ import anyio -from agentpool import Agent, AgentPool -from agentpool_server.agui_server import AGUIServer +from wolfharness import Agent, AgentPool +from wolfharness_server.agui_server import AGUIServer async def main() -> None: diff --git a/examples/codex_with_mcp_injection.py b/examples/codex_with_mcp_injection.py index 1bbb6c9f9..6912512f3 100644 --- a/examples/codex_with_mcp_injection.py +++ b/examples/codex_with_mcp_injection.py @@ -14,7 +14,7 @@ async def example_with_http_mcp_server(): # Suppose we have a ToolManagerBridge running on port 8000 # (In practice, you'd start the bridge first and get the URL) mcp_servers = { - "agentpool-tools": HttpMcpServer( + "wolfharness-tools": HttpMcpServer( url="http://localhost:8000/mcp", # Optional: if the MCP server requires authentication bearer_token_env_var="AGENTPOOL_MCP_TOKEN", @@ -83,7 +83,7 @@ async def example_with_multiple_mcp_servers(): print() -async def example_integration_with_agentpool(): +async def example_integration_with_wolfharness(): """Example: How this would integrate with AgentPool's ToolManagerBridge. This is conceptual - shows how you'd use a ToolManagerBridge's MCP server @@ -94,7 +94,7 @@ async def example_integration_with_agentpool(): # await bridge.start() # mcp_config = bridge.get_claude_mcp_server_config() # Simulating what that would return: - mcp_config = {"agentpool-tools": {"type": "http", "url": "http://localhost:8765/mcp"}} + mcp_config = {"wolfharness-tools": {"type": "http", "url": "http://localhost:8765/mcp"}} # Convert to CodexClient format mcp_servers = { name: HttpMcpServer(url=config["url"]) @@ -126,6 +126,6 @@ async def example_integration_with_agentpool(): # asyncio.run(example_with_multiple_mcp_servers()) # Example 4: Integration with AgentPool - # asyncio.run(example_integration_with_agentpool()) + # asyncio.run(example_integration_with_wolfharness()) print("Examples ready to run - uncomment the ones you want to try!") diff --git a/examples/ctx_zip_style/http_approach.py b/examples/ctx_zip_style/http_approach.py index 95857147a..0fccb7daf 100644 --- a/examples/ctx_zip_style/http_approach.py +++ b/examples/ctx_zip_style/http_approach.py @@ -5,12 +5,12 @@ cloud sandboxes like E2B that can't reach localhost. """ -from agentpool.resource_providers import StaticResourceProvider -from agentpool.resource_providers.codemode import RemoteCodeModeResourceProvider from exxec_config import LocalExecutionEnvironmentConfig +from wolfharness.resource_providers import StaticResourceProvider +from wolfharness.resource_providers.codemode import RemoteCodeModeResourceProvider -from agentpool import Agent -from agentpool.tools.base import Tool +from wolfharness import Agent +from wolfharness.tools.base import Tool def add_numbers(x: int, y: int) -> int: diff --git a/examples/ctx_zip_style/mcp_approach.py b/examples/ctx_zip_style/mcp_approach.py index 37c7544e2..bf70cd483 100644 --- a/examples/ctx_zip_style/mcp_approach.py +++ b/examples/ctx_zip_style/mcp_approach.py @@ -5,11 +5,11 @@ cloud sandboxes like E2B that can't reach localhost. """ -from agentpool.resource_providers.codemode.remote_mcp_execution import RemoteMCPExecutor import anyio from exxec_config import LocalExecutionEnvironmentConfig +from wolfharness.resource_providers.codemode.remote_mcp_execution import RemoteMCPExecutor -from agentpool.tools.base import Tool +from wolfharness.tools.base import Tool def add_numbers(x: int, y: int) -> int: diff --git a/examples/opencode_question_demo.py b/examples/opencode_question_demo.py index f0586654f..f67088211 100644 --- a/examples/opencode_question_demo.py +++ b/examples/opencode_question_demo.py @@ -9,9 +9,9 @@ from mcp import types -from agentpool import Agent -from agentpool_server.opencode_server.input_provider import OpenCodeInputProvider -from agentpool_server.opencode_server.state import ServerState +from wolfharness import Agent +from wolfharness_server.opencode_server.input_provider import OpenCodeInputProvider +from wolfharness_server.opencode_server.state import ServerState async def demo_single_select(): diff --git a/inspect_mcp.py b/inspect_mcp.py deleted file mode 100644 index cc693279f..000000000 --- a/inspect_mcp.py +++ /dev/null @@ -1,52 +0,0 @@ -"""Inspect MCP server resources at http://127.0.0.1:8890/mcp.""" - -import asyncio -import sys - - -sys.path.insert(0, "/Users/yuchen.liu/src/yilab/iroot-llm/packages/agentpool/src") - -from agentpool.resource_providers.mcp_provider import MCPResourceProvider - - -async def main(): - provider = MCPResourceProvider( - server="http://127.0.0.1:8890/mcp", - name="scratchpad", - ) - - try: - await provider.__aenter__() - print("Connected to MCP server") - print(f"Server config: {provider.server}") - - # Get all resources - resources = await provider.get_resources() - print(f"\nResources ({len(resources)}):") - for r in resources: - print(f" - uri={r.uri} name={r.name}") - - # Get all prompts - prompts = await provider.get_prompts() - print(f"\nPrompts ({len(prompts)}):") - for p in prompts: - print(f" - name={p.name}") - - # Get all tools - tools = await provider.get_tools() - print(f"\nTools ({len(tools)}):") - for t in tools: - print(f" - name={t.name}") - - # List skill resources specifically - skill_resources = [r for r in resources if str(r.uri).startswith("skill://")] - print(f"\nSkill resources ({len(skill_resources)}):") - for r in skill_resources: - print(f" - {r.uri}") - - finally: - await provider.__aexit__(None, None, None) - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/migrations/README_USAGE.md b/migrations/README_USAGE.md index a0657aaad..fafaca450 100644 --- a/migrations/README_USAGE.md +++ b/migrations/README_USAGE.md @@ -1,6 +1,6 @@ -# Database Migrations for agentpool +# Database Migrations for wolfharness -This directory contains Alembic migrations for the agentpool database schema. +This directory contains Alembic migrations for the wolfharness database schema. ## Overview @@ -73,7 +73,7 @@ alembic downgrade -1 ### Database URL The migration system uses the database URL from: 1. `DATABASE_URL` environment variable -2. Default: `sqlite:///./agentpool.db` (configured in `alembic.ini`) +2. Default: `sqlite:///./wolfharness.db` (configured in `alembic.ini`) ### Environment Setup The `migrations/env.py` file is configured to: @@ -105,7 +105,7 @@ The initial migration (`5ffc5f0266a1`) already includes these new field names. I ### Model Changes When modifying SQLModel models: -1. Make the change in `src/agentpool_storage/sql_provider/models.py` +1. Make the change in `src/wolfharness_storage/sql_provider/models.py` 2. Create a migration: `python scripts/db_migrate.py create "Description" --autogenerate` 3. Review the generated migration file 4. Test the migration locally diff --git a/migrations/__init__.py b/migrations/__init__.py index 901409711..444a23936 100644 --- a/migrations/__init__.py +++ b/migrations/__init__.py @@ -1 +1 @@ -"""Database migrations for agentpool.""" +"""Database migrations for wolfharness.""" diff --git a/migrations/env.py b/migrations/env.py index d40c99658..665bcb089 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -10,7 +10,7 @@ from sqlalchemy.ext.asyncio import async_engine_from_config from sqlmodel import SQLModel -from agentpool_storage.sql_provider.models import * # noqa: F403 +from wolfharness_storage.sql_provider.models import * # noqa: F403 if TYPE_CHECKING: @@ -32,7 +32,7 @@ # Set database URL from environment variable if available if not config.get_main_option("sqlalchemy.url"): - database_url = os.getenv("DATABASE_URL", "sqlite:///./agentpool.db") + database_url = os.getenv("DATABASE_URL", "sqlite:///./wolfharness.db") config.set_main_option("sqlalchemy.url", database_url) diff --git a/migrations/versions/2f915b1f62bd_add_title_to_conversation.py b/migrations/versions/2f915b1f62bd_add_title_to_conversation.py index e1fd81827..7c1f68c90 100644 --- a/migrations/versions/2f915b1f62bd_add_title_to_conversation.py +++ b/migrations/versions/2f915b1f62bd_add_title_to_conversation.py @@ -14,7 +14,7 @@ import sqlalchemy as sa import sqlmodel.sql.sqltypes -from agentpool_storage.sql_provider.models import UTCDateTime +from wolfharness_storage.sql_provider.models import UTCDateTime if TYPE_CHECKING: diff --git a/migrations/versions/5ffc5f0266a1_initial_migration_with_renamed_token_.py b/migrations/versions/5ffc5f0266a1_initial_migration_with_renamed_token_.py index ee0c6ebdd..4a5fb261c 100644 --- a/migrations/versions/5ffc5f0266a1_initial_migration_with_renamed_token_.py +++ b/migrations/versions/5ffc5f0266a1_initial_migration_with_renamed_token_.py @@ -14,7 +14,7 @@ import sqlalchemy as sa import sqlmodel.sql.sqltypes -from agentpool_storage.sql_provider.models import UTCDateTime +from wolfharness_storage.sql_provider.models import UTCDateTime if TYPE_CHECKING: diff --git a/migrations/versions/__init__.py b/migrations/versions/__init__.py index b48d332fe..7f7bc0bc0 100644 --- a/migrations/versions/__init__.py +++ b/migrations/versions/__init__.py @@ -1 +1 @@ -"""Migration versions for agentpool database schema.""" +"""Migration versions for wolfharness database schema.""" diff --git a/mkdocs.yml b/mkdocs.yml index 5c63e9d0e..25f4f01c8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,9 +1,9 @@ site_name: "AgentPool" site_description: "Pydantic-AI based Multi-Agent Framework with YAML-based Agents, Teams, Workflows & Extended ACP / AGUI integration" -repo_url: "https://github.com/Leoyzen/agentpool/" -site_url: https://leoyzen.github.io/agentpool/ +repo_url: "https://github.com/Leoyzen/wolfharness/" +site_url: https://leoyzen.github.io/wolfharness/ site_author: "Leoyzen" -copyright: Copyright © 2025 Leoyzen (forked from phil65/agentpool) +copyright: Copyright © 2025 Leoyzen (forked from phil65/wolfharness) edit_uri: edit/main/docs/ theme: @@ -133,7 +133,7 @@ extra: - icon: fontawesome/brands/github link: https://github.com/Leoyzen - icon: fontawesome/brands/python - link: https://pypi.org/project/agentpool/ + link: https://pypi.org/project/wolfharness/ nav: - Home: index.md @@ -265,7 +265,7 @@ nav: - task: reference/cli/task.md - ACP Meta Fields: reference/acp-meta-field-reference.md - API: - - AgentPool: reference/api/agentpool.md + - AgentPool: reference/api/wolfharness.md - Agent: reference/api/agent.md - MessageNode: reference/api/messagenode.md - EventBus & SessionController: reference/api/eventbus.md @@ -284,7 +284,7 @@ nav: - Telemetry: explanation/telemetry.md - Python Features: explanation/python-features.md - Import Patterns: explanation/import-patterns.md - - Extending AgentPool: explanation/extending-agentpool.md + - Extending AgentPool: explanation/extending-wolfharness.md - Common Patterns: explanation/common-patterns.md - Special Considerations: explanation/special-considerations.md - Usage Examples: explanation/usage-examples.md diff --git a/openspec/changes/rename-agentpool-to-wolfharness/.openspec.yaml b/openspec/changes/rename-agentpool-to-wolfharness/.openspec.yaml new file mode 100644 index 000000000..84cfc1245 --- /dev/null +++ b/openspec/changes/rename-agentpool-to-wolfharness/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-08-06 diff --git a/openspec/changes/rename-agentpool-to-wolfharness/README.md b/openspec/changes/rename-agentpool-to-wolfharness/README.md new file mode 100644 index 000000000..1d028d221 --- /dev/null +++ b/openspec/changes/rename-agentpool-to-wolfharness/README.md @@ -0,0 +1,3 @@ +# rename-agentpool-to-wolfharness + +Mechanical rename of the project from AgentPool (agentpool) to WolfHarness (wolfharness): package, Python namespace, CLI, docs, CI. diff --git a/openspec/changes/rename-agentpool-to-wolfharness/design.md b/openspec/changes/rename-agentpool-to-wolfharness/design.md new file mode 100644 index 000000000..a03ef6ebb --- /dev/null +++ b/openspec/changes/rename-agentpool-to-wolfharness/design.md @@ -0,0 +1,70 @@ +# Design — rename-agentpool-to-wolfharness + +## Overview + +A one-shot mechanical rename of the project from **AgentPool** (`agentpool`) to **WolfHarness** (`wolfharness`). This supersedes the earlier `agentwolf` rename attempt (PR #324, closed, never merged to `main`). + +## Approach + +Reuse the well-tested mechanical-rename script pattern that already existed in the repository (`scripts/rename_to_agentwolf.py`), adapted for the `wolfharness` target. The rename is executed on a branch based on `origin/main` (which never contained the `agentwolf` package code, so there are no `agentwolf` package remnants to clean up). + +### Rename script (`scripts/rename_to_wolfharness.py`) + +Based on the prior `rename_to_agentwolf.py`, modified: + +1. **Directory renames** — `src/agentpool*` → `src/wolfharness*` for all 10 source packages: + - `src/agentpool` → `src/wolfharness` + - `src/agentpool_bot` → `src/wolfharness_bot` + - `src/agentpool_cli` → `src/wolfharness_cli` + - `src/agentpool_commands` → `src/wolfharness_commands` + - `src/agentpool_config` → `src/wolfharness_config` + - `src/agentpool_prompts` → `src/wolfharness_prompts` + - `src/agentpool_server` → `src/wolfharness_server` + - `src/agentpool_storage` → `src/wolfharness_storage` + - `src/agentpool_sync` → `src/wolfharness_sync` + - `src/agentpool_toolsets` → `src/wolfharness_toolsets` + +2. **Content replacements** — ordered longest-first to avoid partial-write collisions: + - `agentpool_config` → `wolfharness_config` + - `agentpool_server` → `wolfharness_server` + - `agentpool_toolsets` → `wolfharness_toolsets` + - `agentpool_storage` → `wolfharness_storage` + - `agentpool_cli` → `wolfharness_cli` + - `agentpool_commands` → `wolfharness_commands` + - `agentpool_prompts` → `wolfharness_prompts` + - `agentpool_sync` → `wolfharness_sync` + - `agentpool_bot` → `wolfharness_bot` + - `agentpool` → `wolfharness` + +3. **Excluded directories** — `.git`, `.venv`, caches, `node_modules`, `.codegraph`, `openspec/changes` (preserve historical spec docs), `.omo`. + +### Manual follow-ups (not covered by the script) + +The script's `FILE_PATTERNS` only covers `*.py`, `*.toml`, `*.yml`, `*.yaml`, `*.md`, `*.cfg`, `*.txt`, `*.rst`, `*.json`. Post-script manual fixes handled: + +- `agentpool.spec` → `wolfharness.spec` (file rename via `git mv` + content replacement). +- `alembic.ini` — `sqlalchemy.url = sqlite:///./agentpool.db` → `wolfharness.db`. +- `Dockerfile` — `ENTRYPOINT ["agentpool", ...]` → `wolfharness`. +- `docs/reference/js/run_code_config.js` — `agentpool` → `wolfharness`. +- `scripts/restart_opencode_server.sh` — `agentpool` → `wolfharness`. +- `src/wolfharness_server/opencode_server/.rules` — log paths `~/.local/state/agentpool/...` → `wolfharness`. +- Remove obsolete `scripts/rename_to_agentwolf.py`. + +### Ruff line-length fixes + +The longer `wolfharness` name pushed a few lines over the 100-char limit. Fixed by reflowing docstrings, splitting string constructions, and adding the missing `# noqa: E402` to one import in `session_controller.py` (matching the existing deliberate circular-import pattern). + +## Verification + +- `uv sync --all-extras` — resolves and builds `wolfharness==2.9.5`. +- `uv run ruff check src/ tests/` — passes. +- `uv run ruff format src/ tests/ --check` — passes. +- `uv run pytest -m unit` — results unchanged from `origin/main` baseline. + +## Out of scope + +- The GitHub repository rename `Leoyzen/agentpool` → `Leoyzen/wolfharness` (repository-settings operation, done after this PR lands). +- First `wolfharness` PyPI release and deprecation notice on the final `agentpool` release (publishing steps). +- Migration guide for users (follow-up). +- Historical `agentwolf` references in archived RFCs and archived openspec changes (document the superseded interim name; left intact). +- `uv.lock`'s `agentpool` dependency (a separate third-party PyPI package pulled by `mknodes`, not the project's own package; left intact). \ No newline at end of file diff --git a/openspec/changes/rename-agentpool-to-wolfharness/proposal.md b/openspec/changes/rename-agentpool-to-wolfharness/proposal.md new file mode 100644 index 000000000..1dff48593 --- /dev/null +++ b/openspec/changes/rename-agentpool-to-wolfharness/proposal.md @@ -0,0 +1,38 @@ +## Why + +The project is currently named **AgentPool** (`agentpool`). The new brand is **WolfHarness** (`wolfharness`). A prior rename attempt to the interim name **AgentWolf** (`agentwolf`) was never merged to `main` (PR #324 was closed). This change renames the project mechanically from `agentpool` to `wolfharness` across the repository, package distribution, Python namespace, CLI, documentation, and CI. + +## What Changes + +- **BREAKING**: Rename the PyPI package `agentpool` → `wolfharness` in `pyproject.toml` (`name`, `[project.scripts]`, entry points, URLs). +- **BREAKING**: Rename all `src/agentpool*` package directories to `src/wolfharness*` and update every Python import (`agentpool.*` → `wolfharness.*`). +- **BREAKING**: Rename the CLI entry point from `agentpool` → `wolfharness`. +- **BREAKING**: Rename the PyInstaller spec `agentpool.spec` → `wolfharness.spec` and update its metadata. +- Rename the Alembic database file `agentpool.db` → `wolfharness.db`. +- Rename Docker entrypoint, docs/js references, shell scripts, and `.rules` log paths from `agentpool` → `wolfharness`. +- Replace `AgentPool` → `WolfHarness` in README title, AGENTS.md, badges, and documentation links. +- Regenerate `uv.lock` so the package resolves as `wolfharness==2.9.5`. +- Add a `scripts/rename_to_wolfharness.py` mechanical-rename script (replaces the obsolete `scripts/rename_to_agentwolf.py`, which is removed). + +## Capabilities + +### New Capabilities + +- `wolfharness-rename`: The mechanical repository, package, namespace, CLI, docs, and CI rename from `agentpool` to `wolfharness`. + +### Modified Capabilities + +- `agent-pool`: The core orchestration capability's package namespace changes from `agentpool` to `wolfharness`. All import paths and module references throughout the framework update to the new namespace. No behavioral requirements change — only the naming surface. + +## Impact + +- `pyproject.toml`: package `name`, `[project.scripts]`, `[project.entry-points."wolfharness.capabilities"]`, project URLs. +- `src/agentpool*` → `src/wolfharness*`: all 10 source package directories and their files. +- Every `.py` file importing `agentpool.*` or `agentpool_server.*` etc. +- `tests/`: all test files referencing `agentpool` import paths. +- `docs/`: README, `docs/reference/js/run_code_config.js`, AGENTS.md references. +- `Dockerfile`, `alembic.ini`, `agentpool.spec` → `wolfharness.spec`, shell scripts, `.rules`. +- `.github/workflows/`: CI references to the package/CLI name. +- `uv.lock`: regenerated to resolve `wolfharness`. +- Historical `agentwolf` references in archived RFCs and archived openspec changes are intentionally left untouched (they document the superseded interim name). +- Historical `agentpool` references in `openspec/changes` (archived) are intentionally excluded per the rename script's design. \ No newline at end of file diff --git a/openspec/changes/rename-agentpool-to-wolfharness/specs/wolfharness-rename/spec.md b/openspec/changes/rename-agentpool-to-wolfharness/specs/wolfharness-rename/spec.md new file mode 100644 index 000000000..c4b2efb8e --- /dev/null +++ b/openspec/changes/rename-agentpool-to-wolfharness/specs/wolfharness-rename/spec.md @@ -0,0 +1,34 @@ +## ADDED Requirements + +### Requirement: Package and namespace renamed to wolfharness + +The PyPI package, Python import namespace, and CLI entry point SHALL be renamed from `agentpool` to `wolfharness`. All source packages under `src/wolfharness*` SHALL be importable via the `wolfharness` namespace. + +#### Scenario: Package builds and installs as wolfharness + +- **WHEN** `uv sync --all-extras` is run +- **THEN** the project SHALL resolve and build as `wolfharness==2.9.5` + +#### Scenario: Source directories renamed + +- **WHEN** the repository is inspected +- **THEN** `src/agentpool*` directories SHALL NOT exist +- **AND** `src/wolfharness*` directories SHALL exist for all 10 source packages (core, bot, cli, commands, config, prompts, server, storage, sync, toolsets) + +#### Scenario: CLI entry point renamed + +- **WHEN** the CLI is invoked +- **THEN** the `agentpool` command SHALL be replaced by `wolfharness` +- **AND** `wolfharness --version`, `wolfharness serve-acp`, `wolfharness serve-opencode`, `wolfharness serve-mcp`, `wolfharness serve-agui`, `wolfharness serve-api` SHALL be the canonical commands + +## MODIFIED Requirements + +### Requirement: AgentPool package namespace SHALL be renamed to wolfharness + +The core orchestration capability's package namespace SHALL change from `agentpool` to `wolfharness`. All import paths and module references throughout the framework SHALL update to the new namespace. No behavioral requirements change — only the naming surface. + +#### Scenario: Imports resolve under wolfharness namespace + +- **WHEN** a consumer imports `wolfharness` +- **THEN** the import SHALL resolve to the renamed package +- **AND** no `agentpool` import path SHALL remain in `src/`, `tests/`, or active configuration files \ No newline at end of file diff --git a/openspec/changes/rename-agentpool-to-wolfharness/tasks.md b/openspec/changes/rename-agentpool-to-wolfharness/tasks.md new file mode 100644 index 000000000..2b3a19f90 --- /dev/null +++ b/openspec/changes/rename-agentpool-to-wolfharness/tasks.md @@ -0,0 +1,50 @@ +# Tasks — rename-agentpool-to-wolfharness + +## 1. Create the mechanical rename script + +- [x] 1.1 Adapt `scripts/rename_to_agentwolf.py` → `scripts/rename_to_wolfharness.py` (replace `agentpool`→`agentwolf` with `agentpool`→`wolfharness` in `SRC_DIRS_TO_RENAME` and `REPLACEMENTS`) +- [x] 1.2 Remove the obsolete `scripts/rename_to_agentwolf.py` + +## 2. Execute the directory rename + +- [x] 2.1 Run `python3 scripts/rename_to_wolfharness.py` (dry-run first to verify) +- [x] 2.2 Verify all 10 `src/agentpool*` directories renamed to `src/wolfharness*` +- [x] 2.3 Verify entry-point files exist post-rename (`wolfharness/__init__.py`, `wolfharness_cli/__init__.py`) + +## 3. Replace references in content + +- [x] 3.1 Run the reference-replacement step (1421 files updated) +- [x] 3.2 Rename `agentpool.spec` → `wolfharness.spec` via `git mv` and replace content references +- [x] 3.3 Update `alembic.ini` — `sqlite:///./agentpool.db` → `wolfharness.db` +- [x] 3.4 Update `Dockerfile` — `ENTRYPOINT ["agentpool", ...]` → `wolfharness` +- [x] 3.5 Update `docs/reference/js/run_code_config.js` — `agentpool` → `wolfharness` +- [x] 3.6 Update `scripts/restart_opencode_server.sh` — `agentpool` → `wolfharness` +- [x] 3.7 Update `src/wolfharness_server/opencode_server/.rules` — log paths → `wolfharness` +- [x] 3.8 Verify no residual `agentpool` references remain (excluding `openspec/changes` archives and the third-party `agentpool` PyPI dependency in `uv.lock`) + - [x] 3.8.1 Rename `tests/agentpool_server/` → `tests/wolfharness_server/` (post-merge audit found the directory omitted from the original `src/*` rename list) + - [x] 3.8.2 Rename `agentpool-session-pool/` → `wolfharness-session-pool/` (same omission) + +## 4. Fix lint issues from the longer name + +- [x] 4.1 Reflow docstring in `src/wolfharness/agents/native_agent/process_history_capability.py` (E501) +- [x] 4.2 Reflow docstring in `src/wolfharness/capabilities/skill_manager_cap.py` (E501) +- [x] 4.3 Split line in `src/wolfharness/repomap/languages.py` (E501) +- [x] 4.4 Split line in `src/wolfharness_config/capabilities.py` (E501) +- [x] 4.5 Add missing `# noqa: E402` to `session_controller.py` import (matches existing circular-import pattern) +- [x] 4.6 Split line in `tests/servers/opencode_server/test_dedup.py` (E501) + +## 5. Regenerate lockfile + +- [x] 5.1 Run `uv sync --all-extras` to regenerate `uv.lock` and verify `wolfharness==2.9.5` builds + +## 6. Verify + +- [x] 6.1 `uv run ruff check src/ tests/` passes +- [x] 6.2 `uv run ruff format src/ tests/ --check` passes +- [x] 6.3 `uv run pytest -m unit` results unchanged from `origin/main` baseline + +## 7. Deliverable + +- [x] 7.1 Commit the rename as a single atomic commit +- [x] 7.2 Push branch and open PR against `origin/main` +- [x] 7.3 Link PR to issue #357 and milestone 2 ("Rebrand: AgentPool → WolfHarness") \ No newline at end of file diff --git a/openspec/specs/acp-single-execution-path/spec.md b/openspec/specs/acp-single-execution-path/spec.md index b8b4ef410..86ae9f357 100644 --- a/openspec/specs/acp-single-execution-path/spec.md +++ b/openspec/specs/acp-single-execution-path/spec.md @@ -34,7 +34,7 @@ The dead code path in `acp_agent.py` (lines 656-698) that calls `session.process - **THEN** `_acp_sessions` SHALL be iterated for `ACPSession` cleanup, while lifecycle clearing SHALL be delegated to `SessionController` ### Requirement: RunFailedEvent SHALL have a single type definition -There SHALL be exactly one `RunFailedEvent` type, defined in `agentpool/agents/events/events.py` and published via `RunHandle.fail()` to the EventBus. The signal-based `BaseAgent.RunFailedEvent` inner class SHALL be removed. +There SHALL be exactly one `RunFailedEvent` type, defined in `wolfharness/agents/events/events.py` and published via `RunHandle.fail()` to the EventBus. The signal-based `BaseAgent.RunFailedEvent` inner class SHALL be removed. #### Scenario: Run failure reporting - **WHEN** a run fails during execution diff --git a/openspec/specs/graph-visualization/spec.md b/openspec/specs/graph-visualization/spec.md index 5d08258f9..c4df1797d 100644 --- a/openspec/specs/graph-visualization/spec.md +++ b/openspec/specs/graph-visualization/spec.md @@ -12,5 +12,5 @@ AgentPool SHALL enable Mermaid diagram generation for YAML-defined team and work - **THEN** `GraphBuilder` generates a Mermaid diagram showing the node chain #### Scenario: CLI diagram access -- **WHEN** user runs `agentpool visualize ` +- **WHEN** user runs `wolfharness visualize ` - **THEN** a Mermaid diagram is printed for the specified YAML team/workflow diff --git a/openspec/specs/ws-server-integration/spec.md b/openspec/specs/ws-server-integration/spec.md index a0543cfa9..b574fe963 100644 --- a/openspec/specs/ws-server-integration/spec.md +++ b/openspec/specs/ws-server-integration/spec.md @@ -26,18 +26,18 @@ The `serve()` function SHALL dispatch to `_serve_streamable_http()` when the tra - **THEN** the resulting server SHALL use `StreamableHTTPTransport` when starting the ACP agent ### Requirement: CLI --port and --host flags for serve-acp -The `agentpool serve-acp` CLI command SHALL accept `--port` and `--host` optional flags. When provided, these flags SHALL create a `StreamableHTTPTransport` with the specified values. When neither flag is provided, the CLI SHALL default to stdio transport. +The `wolfharness serve-acp` CLI command SHALL accept `--port` and `--host` optional flags. When provided, these flags SHALL create a `StreamableHTTPTransport` with the specified values. When neither flag is provided, the CLI SHALL default to stdio transport. #### Scenario: CLI with --port flag -- **WHEN** the user runs `agentpool serve-acp config.yml --port 8080` +- **WHEN** the user runs `wolfharness serve-acp config.yml --port 8080` - **THEN** the CLI SHALL create `StreamableHTTPTransport(port=8080)` and pass it to the ACP server #### Scenario: CLI with --port and --host flags -- **WHEN** the user runs `agentpool serve-acp config.yml --host 0.0.0.0 --port 9000` +- **WHEN** the user runs `wolfharness serve-acp config.yml --host 0.0.0.0 --port 9000` - **THEN** the CLI SHALL create `StreamableHTTPTransport(host="0.0.0.0", port=9000)` #### Scenario: CLI without transport flags -- **WHEN** the user runs `agentpool serve-acp config.yml` +- **WHEN** the user runs `wolfharness serve-acp config.yml` - **THEN** the CLI SHALL use the default stdio transport (no change from current behavior) ### Requirement: YAML config schema extension diff --git a/src/agentpool/functional/py.typed b/overrides/.gitkeep similarity index 100% rename from src/agentpool/functional/py.typed rename to overrides/.gitkeep diff --git a/overrides/_dummy.txt b/overrides/_dummy.txt deleted file mode 100644 index 2a4206661..000000000 --- a/overrides/_dummy.txt +++ /dev/null @@ -1 +0,0 @@ -File exists to make sure that folder exists for git diff --git a/prototype_enqueue.py b/prototype_enqueue.py deleted file mode 100644 index 126d43db8..000000000 --- a/prototype_enqueue.py +++ /dev/null @@ -1,254 +0,0 @@ -"""Prototype script: Test PydanticAI enqueue() drain behavior with agent.iter() + next(). - -This script is NOT committed to production code. It verifies: -1. PendingMessageDrainCapability is auto-injected outermost -2. Bare `async for node in agent_run:` skips after_node_run hooks and fails -3. `agent_run.next()` drains `asap` before next ModelRequestNode -4. `agent_run.next()` drains `when_idle` after all pending tool calls resolve - -Run: uv run python prototype_enqueue.py -""" - -from __future__ import annotations - -import asyncio - -from pydantic_ai import Agent, RunContext -from pydantic_ai.models.test import TestModel -from pydantic_ai.tools import Tool - - -# --------------------------------------------------------------------------- -# Test harness -# --------------------------------------------------------------------------- - -PASS = "PASS" -FAIL = "FAIL" -results: list[tuple[str, str]] = [] - - -def test(name: str, condition: bool) -> None: - status = PASS if condition else FAIL - results.append((name, status)) - print(f" [{status}] {name}") - - -# --------------------------------------------------------------------------- -# Dummy tool that enqueues messages during execution -# --------------------------------------------------------------------------- - - -async def enqueue_test_tool(ctx: RunContext) -> str: - """Tool that enqueues messages with both priorities.""" - ctx.enqueue("when_idle_message", priority="when_idle") - ctx.enqueue("asap_message", priority="asap") - return f"tool_result_{ctx.run_step}" - - -# --------------------------------------------------------------------------- -# Test 1: Capability auto-injection -# --------------------------------------------------------------------------- - - -async def test_capability_auto_injected() -> None: - print("\n=== Test 1: PendingMessageDrainCapability auto-injected ===") - agent = Agent(model=TestModel(), tools=[Tool(enqueue_test_tool)]) - - # _root_capability is a CombinedCapability - root = agent._root_capability - capability_types = [type(c).__name__ for c in root.capabilities] - - print(f" Capabilities: {capability_types}") - test( - "PendingMessageDrainCapability is present", - "PendingMessageDrainCapability" in capability_types, - ) - test( - "PendingMessageDrainCapability is outermost (last in list)", - capability_types[-1] == "PendingMessageDrainCapability", - ) - - -# --------------------------------------------------------------------------- -# Test 2: Bare async for fails on undrained when_idle -# --------------------------------------------------------------------------- - - -async def test_bare_async_for_fails() -> None: - print("\n=== Test 2: Bare `async for` fails with undrained messages ===") - agent = Agent(model=TestModel(), tools=[Tool(enqueue_test_tool)]) - - try: - async with agent.iter("hello") as run: - async for _node in run: - pass # Bare iteration skips after_node_run hooks - test("Bare async for raises UndrainedPendingMessagesError", False) - except Exception as e: # noqa: BLE001 - test( - "Bare async for raises UndrainedPendingMessagesError", - "UndrainedPendingMessagesError" in type(e).__name__, - ) - - -# --------------------------------------------------------------------------- -# Test 3: next() drains asap before next ModelRequestNode -# --------------------------------------------------------------------------- - - -async def test_asap_drained_before_next_model_request() -> None: - print("\n=== Test 3: asap drained before next ModelRequestNode ===") - agent = Agent(model=TestModel(), tools=[Tool(enqueue_test_tool)]) - - async with agent.iter("hello") as run: - node = run.next_node - asap_seen = False - asap_drained_at: str | None = None - last_node: str | None = None - - while True: - node_name = type(node).__name__ - - if hasattr(node, "stream"): - async with node.stream(run.ctx) as stream: - async for _event in stream: - pass - - pending = [m.priority for m in run.pending_messages] - if "asap" in pending: - asap_seen = True - if asap_seen and "asap" not in pending and asap_drained_at is None: - asap_drained_at = last_node - - last_node = node_name - node = await run.next(node) - - if type(node).__name__ == "End": - break - - print(f" asap drained at transition from: {asap_drained_at}") - test( - "asap drained immediately after CallToolsNode", - asap_drained_at == "CallToolsNode", - ) - - -# --------------------------------------------------------------------------- -# Test 4: next() drains when_idle after all tool calls resolve -# --------------------------------------------------------------------------- - - -async def test_when_idle_drained_after_tool_calls() -> None: - print("\n=== Test 4: when_idle drained after all pending tool calls ===") - agent = Agent(model=TestModel(), tools=[Tool(enqueue_test_tool)]) - - async with agent.iter("hello") as run: - node = run.next_node - when_idle_seen = False - when_idle_drained_at: str | None = None - last_node: str | None = None - - while True: - node_name = type(node).__name__ - - if hasattr(node, "stream"): - async with node.stream(run.ctx) as stream: - async for _event in stream: - pass - - pending = [m.priority for m in run.pending_messages] - if "when_idle" in pending: - when_idle_seen = True - if when_idle_seen and "when_idle" not in pending and when_idle_drained_at is None: - when_idle_drained_at = last_node - - last_node = node_name - node = await run.next(node) - - if type(node).__name__ == "End": - break - - print(f" when_idle drained at transition from: {when_idle_drained_at}") - # when_idle should be drained at after_node_run of a CallToolsNode, - # after all tool calls for that node have resolved. - test( - "when_idle drained at after_node_run of CallToolsNode", - when_idle_drained_at == "CallToolsNode", - ) - - -# --------------------------------------------------------------------------- -# Test 5: Event mapping reference — document what PydanticAI yields -# --------------------------------------------------------------------------- - - -async def test_event_mapping() -> None: - print("\n=== Test 5: PydanticAI node event mapping ===") - agent = Agent(model=TestModel(), tools=[Tool(enqueue_test_tool)]) - - event_log: list[tuple[str, str]] = [] - - async with agent.iter("hello") as run: - node = run.next_node - while True: - node_name = type(node).__name__ - - if hasattr(node, "stream"): - async with node.stream(run.ctx) as stream: - event_log.extend([(node_name, type(event).__name__) async for event in stream]) - - node = await run.next(node) - if type(node).__name__ == "End": - break - - print(" Event mapping (node -> event type):") - for node_name, event_name in event_log: - print(f" {node_name:<20} -> {event_name}") - - # Verify expected events exist - events_by_node: dict[str, set[str]] = {} - for node_name, event_name in event_log: - events_by_node.setdefault(node_name, set()).add(event_name) - - test( - "ModelRequestNode yields PartStartEvent / PartEndEvent", - {"PartStartEvent", "PartEndEvent"}.issubset(events_by_node.get("ModelRequestNode", set())), - ) - test( - "CallToolsNode yields FunctionToolCallEvent / FunctionToolResultEvent", - {"FunctionToolCallEvent", "FunctionToolResultEvent"}.issubset( - events_by_node.get("CallToolsNode", set()) - ), - ) - - -# --------------------------------------------------------------------------- -# Main -# --------------------------------------------------------------------------- - - -async def main() -> None: - print("=" * 70) - print("PydanticAI enqueue() drain behavior prototype") - print("=" * 70) - - await test_capability_auto_injected() - await test_bare_async_for_fails() - await test_asap_drained_before_next_model_request() - await test_when_idle_drained_after_tool_calls() - await test_event_mapping() - - print("\n" + "=" * 70) - print("SUMMARY") - print("=" * 70) - passed = sum(1 for _, s in results if s == PASS) - failed = sum(1 for _, s in results if s == FAIL) - for name, status in results: - print(f" [{status}] {name}") - print(f"\nTotal: {passed} passed, {failed} failed") - - if failed > 0: - raise SystemExit(1) - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/prototypes/__init__.py b/prototypes/__init__.py deleted file mode 100644 index c7237bc0b..000000000 --- a/prototypes/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Prototype scripts for pydantic-graph integration validation.""" diff --git a/prototypes/pydantic_graph_validation.py b/prototypes/pydantic_graph_validation.py deleted file mode 100644 index ff3922758..000000000 --- a/prototypes/pydantic_graph_validation.py +++ /dev/null @@ -1,586 +0,0 @@ -"""Standalone prototype validating pydantic-graph's builder-based API for AgentPool. - -This script exercises: -- Parallel execution with Fork + Join and reduce_list_append -- Decision node routing based on input type -- Sequential chain of 2 Steps -- Graph.iter() streaming of intermediate steps -- Cancellation mid-stream -- Error handling in Fork branches -- DAG cycle detection (demonstrated via custom validation) -""" - -from __future__ import annotations - -import argparse -import asyncio -from dataclasses import dataclass, field -from pathlib import Path -import sys -from typing import TYPE_CHECKING, Any - -from pydantic_graph import GraphBuilder, StepContext, TypeExpression -from pydantic_graph.graph_builder import EndMarker -from pydantic_graph.join import reduce_list_append -from pydantic_graph.paths import DestinationMarker - - -if TYPE_CHECKING: - from pydantic_graph.id_types import NodeID - from pydantic_graph.node_types import AnyNode - - -# --------------------------------------------------------------------------- -# State -# --------------------------------------------------------------------------- - - -@dataclass -class GraphState: - """Shared state for graph execution.""" - - log: list[str] = field(default_factory=list[str]) - counter: int = 0 - - -# --------------------------------------------------------------------------- -# Graph builders -# --------------------------------------------------------------------------- - - -def build_parallel_graph() -> GraphBuilder[GraphState, None, None, list[str]]: - """Build a graph with 3 parallel steps joined by reduce_list_append. - - Returns: - GraphBuilder configured for parallel execution test. - """ - g = GraphBuilder(state_type=GraphState, output_type=list[str]) - - @g.step - async def source(ctx: StepContext[GraphState, None, None]) -> str: - """Emit the shared input for parallel branches.""" - return "hello" - - @g.step(node_id="branch_a") - async def branch_a(ctx: StepContext[GraphState, None, str]) -> str: - """First parallel branch.""" - ctx.state.log.append("branch_a") - return f"{ctx.inputs}-A" - - @g.step(node_id="branch_b") - async def branch_b(ctx: StepContext[GraphState, None, str]) -> str: - """Second parallel branch.""" - ctx.state.log.append("branch_b") - return f"{ctx.inputs}-B" - - @g.step(node_id="branch_c") - async def branch_c(ctx: StepContext[GraphState, None, str]) -> str: - """Third parallel branch.""" - ctx.state.log.append("branch_c") - return f"{ctx.inputs}-C" - - collect = g.join(reduce_list_append, initial_factory=list[str], node_id="join_collect") - - g.add( - g.edge_from(g.start_node).to(source), - g.edge_from(source).to(branch_a, branch_b, branch_c), - g.edge_from(branch_a, branch_b, branch_c).to(collect), - g.edge_from(collect).to(g.end_node), - ) - - return g - - -def build_decision_graph() -> GraphBuilder[GraphState, None, int, str]: - """Build a graph with a Decision node routing by input type. - - The graph takes an int input; positive values route to the int handler, - non-positive values route to the str handler after a transform. - - Returns: - GraphBuilder configured for decision routing test. - """ - g = GraphBuilder(state_type=GraphState, input_type=int, output_type=str) - - @g.step - async def emit_value(ctx: StepContext[GraphState, None, int]) -> int | str: - """Return the input if positive, otherwise a string message.""" - if ctx.inputs > 0: - return ctx.inputs - return f"negative:{ctx.inputs}" - - @g.step - async def handle_int(ctx: StepContext[GraphState, None, int]) -> str: - """Branch taken when input is an int.""" - ctx.state.log.append("int_branch") - return f"Got int: {ctx.inputs}" - - @g.step - async def handle_str(ctx: StepContext[GraphState, None, str]) -> str: - """Branch taken when input is a str.""" - ctx.state.log.append("str_branch") - return f"Got str: {ctx.inputs}" - - g.add( - g.edge_from(g.start_node).to(emit_value), - g.edge_from(emit_value).to( - g - .decision(node_id="type_decision") - .branch(g.match(TypeExpression[int]).to(handle_int)) - .branch(g.match(TypeExpression[str]).to(handle_str)) - ), - g.edge_from(handle_int, handle_str).to(g.end_node), - ) - - return g - - -def build_sequential_graph() -> GraphBuilder[GraphState, None, None, str]: - """Build a graph with a sequential chain of 2 steps. - - Returns: - GraphBuilder configured for sequential chain test. - """ - g = GraphBuilder(state_type=GraphState, output_type=str) - - @g.step - async def step_one(ctx: StepContext[GraphState, None, None]) -> int: - """First step in chain: produces an int.""" - ctx.state.log.append("step_one") - return 10 - - @g.step - async def step_two(ctx: StepContext[GraphState, None, int]) -> str: - """Second step in chain: consumes int, produces str.""" - ctx.state.log.append("step_two") - return f"Result: {ctx.inputs * 3}" - - g.add( - g.edge_from(g.start_node).to(step_one), - g.edge_from(step_one).to(step_two), - g.edge_from(step_two).to(g.end_node), - ) - - return g - - -def build_stream_graph() -> GraphBuilder[GraphState, None, None, str]: - """Build a simple graph for streaming / iter() tests. - - Returns: - GraphBuilder configured for streaming test. - """ - g = GraphBuilder(state_type=GraphState, output_type=str) - - @g.step - async def alpha(ctx: StepContext[GraphState, None, None]) -> int: - """First step.""" - ctx.state.log.append("alpha") - return 1 - - @g.step - async def beta(ctx: StepContext[GraphState, None, int]) -> str: - """Second step.""" - ctx.state.log.append("beta") - return f"final-{ctx.inputs}" - - g.add( - g.edge_from(g.start_node).to(alpha), - g.edge_from(alpha).to(beta), - g.edge_from(beta).to(g.end_node), - ) - - return g - - -def build_error_graph() -> GraphBuilder[GraphState, None, None, list[str]]: - """Build a graph where one fork branch raises an exception. - - Returns: - GraphBuilder configured for error handling test. - """ - g = GraphBuilder(state_type=GraphState, output_type=list[str]) - - @g.step - async def source(ctx: StepContext[GraphState, None, None]) -> str: - """Emit shared input.""" - return "boom" - - @g.step(node_id="ok_branch") - async def ok_branch(ctx: StepContext[GraphState, None, str]) -> str: - """Branch that succeeds.""" - return f"ok-{ctx.inputs}" - - @g.step(node_id="fail_branch") - async def fail_branch(ctx: StepContext[GraphState, None, str]) -> str: - """Branch that raises an exception.""" - raise RuntimeError("Intentional fork branch failure") - - collect = g.join(reduce_list_append, initial_factory=list[str], node_id="error_join") - - g.add( - g.edge_from(g.start_node).to(source), - g.edge_from(source).to(ok_branch, fail_branch), - g.edge_from(ok_branch, fail_branch).to(collect), - g.edge_from(collect).to(g.end_node), - ) - - return g - - -# --------------------------------------------------------------------------- -# Test runners -# --------------------------------------------------------------------------- - - -def evidence_path(name: str) -> Path: - """Return the path for an evidence file. - - Args: - name: Base name of the evidence file. - - Returns: - Path to the evidence file. - """ - base = Path(".omo/evidence") - base.mkdir(parents=True, exist_ok=True) - return base / name - - -async def test_parallel() -> dict[str, Any]: - """Test parallel execution: 3 steps run concurrently, Join collects results. - - Returns: - Dictionary with test results and metadata. - """ - g = build_parallel_graph() - graph = g.build() - state = GraphState() - result = await graph.run(state=state) - - ok = sorted(result) == ["hello-A", "hello-B", "hello-C"] - ok = ok and set(state.log) == {"branch_a", "branch_b", "branch_c"} - - return { - "name": "parallel", - "passed": ok, - "result": result, - "state_log": state.log, - } - - -async def test_decision() -> dict[str, Any]: - """Test decision routing: correct branch selected based on input type. - - Returns: - Dictionary with test results and metadata. - """ - g = build_decision_graph() - graph = g.build() - - # Positive input -> int branch - state1 = GraphState() - result1 = await graph.run(state=state1, inputs=42) - ok1 = result1 == "Got int: 42" and "int_branch" in state1.log - - # Non-positive input -> str branch (transformed to "negative:-5") - state2 = GraphState() - result2 = await graph.run(state=state2, inputs=-5) - ok2 = result2 == "Got str: negative:-5" and "str_branch" in state2.log - - return { - "name": "decision", - "passed": ok1 and ok2, - "result_int": result1, - "result_str": result2, - } - - -async def test_sequential() -> dict[str, Any]: - """Test sequential chain: output of step 1 fed to step 2. - - Returns: - Dictionary with test results and metadata. - """ - g = build_sequential_graph() - graph = g.build() - state = GraphState() - result = await graph.run(state=state) - - ok = result == "Result: 30" - ok = ok and state.log == ["step_one", "step_two"] - - return { - "name": "sequential", - "passed": ok, - "result": result, - "state_log": state.log, - } - - -async def test_stream() -> dict[str, Any]: - """Test Graph.iter() yields intermediate steps. - - Returns: - Dictionary with test results and metadata. - """ - g = build_stream_graph() - graph = g.build() - state = GraphState() - - events: list[Any] = [] - async with graph.iter(state=state) as run: - events.extend([event async for event in run]) - - # Should see task lists and a final EndMarker - task_events = [e for e in events if isinstance(e, list)] - end_events = [e for e in events if isinstance(e, EndMarker)] - - ok = len(task_events) > 0 and len(end_events) == 1 - ok = ok and end_events[0].value == "final-1" # pyright: ignore[reportUnknownMemberType] - - return { - "name": "stream", - "passed": ok, - "event_count": len(events), - "task_events": len(task_events), - "end_events": len(end_events), - } - - -async def test_cancel() -> dict[str, Any]: - """Test cancellation mid-stream: task cancels cleanly without hanging. - - Returns: - Dictionary with test results and metadata. - """ - g = build_stream_graph() - graph = g.build() - state = GraphState() - - events: list[Any] = [] - async with graph.iter(state=state) as run: - async for event in run: - events.append(event) - if len(events) >= 2: # noqa: PLR2004 - break # Cancel early - - # We broke out early; no exception should have been raised - ok = len(events) >= 2 # noqa: PLR2004 - # Not all steps should have completed - ok = ok and len(state.log) < 2 # noqa: PLR2004 - - return { - "name": "cancel", - "passed": ok, - "events_before_cancel": len(events), - "state_log": state.log, - } - - -async def test_error() -> dict[str, Any]: - """Test error handling: exception in one fork branch propagates correctly. - - Returns: - Dictionary with test results and metadata. - """ - g = build_error_graph() - graph = g.build() - state = GraphState() - - raised: BaseException | None = None - try: - await graph.run(state=state) - except Exception as exc: # noqa: BLE001 - raised = exc - - ok = raised is not None - ok = ok and isinstance(raised, RuntimeError) - ok = ok and "Intentional fork branch failure" in str(raised) - - return { - "name": "error", - "passed": ok, - "exception_type": type(raised).__name__ if raised else None, - "exception_msg": str(raised) if raised else None, - } - - -def _detect_cycles( - nodes: dict[NodeID, AnyNode], - edges_by_source: dict[NodeID, list[Any]], -) -> list[NodeID] | None: - """Detect cycles in a graph via DFS. - - Args: - nodes: All nodes in the graph. - edges_by_source: Outgoing edges indexed by source node ID. - - Returns: - A list of node IDs forming a cycle, or None if acyclic. - """ - visited: set[NodeID] = set() - rec_stack: set[NodeID] = set() - - def _neighbors(node_id: NodeID) -> list[NodeID]: - """Extract destination IDs from outgoing paths.""" - return [ - item.destination_id - for path in edges_by_source.get(node_id, []) - for item in (path.items if hasattr(path, "items") else []) - if isinstance(item, DestinationMarker) - ] - - def _dfs(node_id: NodeID) -> list[NodeID] | None: - visited.add(node_id) - rec_stack.add(node_id) - for nxt in _neighbors(node_id): - if nxt not in visited: - cycle = _dfs(nxt) - if cycle is not None: - return cycle - elif nxt in rec_stack: - return [node_id, nxt] - rec_stack.discard(node_id) - return None - - for nid in nodes: - if nid not in visited: - cycle = _dfs(nid) - if cycle is not None: - return cycle - return None - - -async def test_cycle() -> dict[str, Any]: - """Test DAG cycle detection. - - pydantic-graph's GraphBuilder does **not** detect cycles at build time. - This test validates that behavior and demonstrates a custom cycle - detector that can be used by AgentPool if needed. - - Returns: - Dictionary with test results and metadata. - """ - g = GraphBuilder(output_type=str) - - @g.step - async def a_step(ctx: StepContext[None, None, None]) -> str: - return "a" - - @g.step - async def b_step(ctx: StepContext[None, None, str]) -> str: - return "b" - - # Normal forward edges - g.add( - g.edge_from(g.start_node).to(a_step), - g.edge_from(a_step).to(b_step), - g.edge_from(b_step).to(g.end_node), - ) - - # Add a backward edge to create a cycle - g.add_edge(b_step, a_step) - - # pydantic-graph builds the graph without error - graph = g.build() - build_succeeded = graph is not None - - # Our custom cycle detector finds the cycle - cycle = _detect_cycles(graph.nodes, graph.edges_by_source) - cycle_found = cycle is not None - - ok = build_succeeded and cycle_found - - return { - "name": "cycle", - "passed": ok, - "build_succeeded": build_succeeded, - "cycle_detected": cycle_found, - "cycle_nodes": cycle, - "note": "pydantic-graph does not detect cycles; custom validation needed", - } - - -# --------------------------------------------------------------------------- -# Main / CLI -# --------------------------------------------------------------------------- - - -TESTS = { - "parallel": test_parallel, - "decision": test_decision, - "sequential": test_sequential, - "stream": test_stream, - "cancel": test_cancel, - "error": test_error, - "cycle": test_cycle, -} - - -async def run_single(name: str) -> dict[str, Any]: - """Run a single test and persist evidence. - - Args: - name: Test identifier. - - Returns: - Test result dictionary. - """ - result = await TESTS[name]() - path = evidence_path(f"task-1-{name}.txt") - path.write_text( - f"Test: {name}\nPassed: {result['passed']}\nDetails: {result}\n", - encoding="utf-8", - ) - return result - - -async def main() -> int: - """CLI entrypoint. - - Returns: - Exit code (0 on success, 1 on failure). - """ - parser = argparse.ArgumentParser(description="Validate pydantic-graph builder API") - parser.add_argument("--test-parallel", action="store_true", help="Run parallel execution test") - parser.add_argument("--test-decision", action="store_true", help="Run decision routing test") - parser.add_argument("--test-sequential", action="store_true", help="Run sequential chain test") - parser.add_argument("--test-stream", action="store_true", help="Run streaming test") - parser.add_argument("--test-cancel", action="store_true", help="Run cancellation test") - parser.add_argument("--test-error", action="store_true", help="Run error handling test") - parser.add_argument("--test-cycle", action="store_true", help="Run cycle detection test") - parser.add_argument("--test-all", action="store_true", help="Run all tests") - args = parser.parse_args() - - selected = [name for name in TESTS if getattr(args, f"test_{name}") or args.test_all] - - if not selected: - parser.print_help() - return 1 - - results: list[dict[str, Any]] = [] - for name in selected: - result = await run_single(name) - results.append(result) - status = "PASS" if result["passed"] else "FAIL" - print(f" [{status}] {name}") - - # Append findings to learnings.md - notepad = Path(".omo/notepads/migrate-to-pydantic-graph/learnings.md") - notepad.parent.mkdir(parents=True, exist_ok=True) - with notepad.open("a", encoding="utf-8") as fh: - fh.write("\n## Prototype Validation Findings\n\n") - fh.write("Date: 2026-06-03\n\n") - for r in results: - fh.write(f"- **{r['name']}**: {'PASS' if r['passed'] else 'FAIL'}\n") - if not r["passed"]: - fh.write(f" - Details: {r}\n") - fh.write("\n") - - all_passed = all(r["passed"] for r in results) - return 0 if all_passed else 1 - - -if __name__ == "__main__": - sys.exit(asyncio.run(main())) diff --git a/pyproject.toml b/pyproject.toml index 057f89134..e8db003e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ #:tombi schema.strict = false [project] -name = "agentpool" +name = "wolfharness" version = "2.9.5" description = "Pydantic-AI based Multi-Agent Framework with YAML-based Agents, Teams, Workflows & Extended ACP / AGUI integration" readme = "README.md" @@ -85,37 +85,38 @@ dependencies = [ ] [project.urls] -"Code coverage" = "https://app.codecov.io/gh/phil65/agentpool" -Discussions = "https://github.com/phil65/agentpool/discussions" -Documentation = "https://phil65.github.io/agentpool/" -Issues = "https://github.com/phil65/agentpool/issues" -Source = "https://github.com/phil65/agentpool" +"Code coverage" = "https://app.codecov.io/gh/Leoyzen/wolfharness" +Discussions = "https://github.com/Leoyzen/wolfharness/discussions" +Documentation = "https://leoyzen.github.io/wolfharness/" +Issues = "https://github.com/Leoyzen/wolfharness/issues" +Source = "https://github.com/Leoyzen/wolfharness" [project.scripts] acp-bridge = "acp.bridge.__main__:main" -agentpool = "agentpool_cli.__main__:cli" -agentpool-db = "agentpool_storage.sql_provider.cli:main" - -[project.entry-points."agentpool.capabilities"] -mcp = "agentpool.capabilities.mcp_server_cap:McpServerCap" -function_tools = "agentpool.capabilities.function_toolset:FunctionToolsetCapability" -subagent = "agentpool.capabilities.subagent_capability:SubagentCapability" -skill = "agentpool.capabilities.skill_manager_cap:SkillManagerCap" -combined = "agentpool.capabilities.combined_toolset:CombinedToolsetCapability" -code_mode = "agentpool.capabilities.code_mode_capability:CodeModeCapability" -tool_display = "agentpool.capabilities.tool_display_capability:ToolDisplayCapability" -question = "agentpool.capabilities.question:QuestionCapability" -background_task = "agentpool.capabilities.background_task:BackgroundTaskCapability" +agentpool = "wolfharness_cli.__main__:cli" +wolfharness = "wolfharness_cli.__main__:cli" +wolfharness-db = "wolfharness_storage.sql_provider.cli:main" [project.entry-points."fsspec.specs"] acp = "acp.filesystem:ACPFileSystem" [project.entry-points."jinjarope.environment"] -agentpool = "agentpool.utils:setup_env" +wolfharness = "wolfharness.utils:setup_env" [project.entry-points."universal_pathlib.implementations"] acp = "acp.filesystem:ACPPath" +[project.entry-points."wolfharness.capabilities"] +mcp = "wolfharness.capabilities.mcp_server_cap:McpServerCap" +function_tools = "wolfharness.capabilities.function_toolset:FunctionToolsetCapability" +subagent = "wolfharness.capabilities.subagent_capability:SubagentCapability" +skill = "wolfharness.capabilities.skill_manager_cap:SkillManagerCap" +combined = "wolfharness.capabilities.combined_toolset:CombinedToolsetCapability" +code_mode = "wolfharness.capabilities.code_mode_capability:CodeModeCapability" +tool_display = "wolfharness.capabilities.tool_display_capability:ToolDisplayCapability" +question = "wolfharness.capabilities.question:QuestionCapability" +background_task = "wolfharness.capabilities.background_task:BackgroundTaskCapability" + [project.optional-dependencies] a2a = ["fasta2a", "starlette"] # A2A Server bot = [ @@ -231,35 +232,35 @@ skip_covered = true [tool.importlinter] root_packages = [ - "agentpool", - "agentpool_config", - "agentpool_server", - "agentpool_toolsets", - "agentpool_storage", - "agentpool_cli", - "agentpool_commands", - "agentpool_prompts", + "wolfharness", + "wolfharness_config", + "wolfharness_server", + "wolfharness_toolsets", + "wolfharness_storage", + "wolfharness_cli", + "wolfharness_commands", + "wolfharness_prompts", "acp", ] [[tool.importlinter.contracts]] name = "Server must not import from core app logic" type = "forbidden" -source_modules = ["agentpool_server"] -forbidden_modules = ["agentpool_commands", "agentpool_cli"] +source_modules = ["wolfharness_server"] +forbidden_modules = ["wolfharness_commands", "wolfharness_cli"] allow_indirect_imports = true [[tool.importlinter.contracts]] name = "Config must not import from core" type = "forbidden" -source_modules = ["agentpool_config"] +source_modules = ["wolfharness_config"] forbidden_modules = [ - "agentpool", - "agentpool_server", - "agentpool_toolsets", - "agentpool_storage", - "agentpool_commands", - "agentpool_cli" + "wolfharness", + "wolfharness_server", + "wolfharness_toolsets", + "wolfharness_storage", + "wolfharness_commands", + "wolfharness_cli" ] # Pre-existing direct violations are listed in ignore_imports; remove entries # as imports are fixed during Phase 7 refactoring. Indirect violations are @@ -267,91 +268,95 @@ forbidden_modules = [ # are untangled (see OpenSpec thin-wrapper-refactor Phase 7 tasks). allow_indirect_imports = true ignore_imports = [ - "agentpool_config.agentpool_tools -> agentpool.prompts.conversion_manager", - "agentpool_config.agentpool_tools -> agentpool.tool_impls.agent_cli", - "agentpool_config.agentpool_tools -> agentpool.tool_impls.bash", - "agentpool_config.agentpool_tools -> agentpool.tool_impls.delete_path", - "agentpool_config.agentpool_tools -> agentpool.tool_impls.download_file", - "agentpool_config.agentpool_tools -> agentpool.tool_impls.execute_code", - "agentpool_config.agentpool_tools -> agentpool.tool_impls.grep", - "agentpool_config.agentpool_tools -> agentpool.tool_impls.list_directory", - "agentpool_config.agentpool_tools -> agentpool.tool_impls.question", - "agentpool_config.agentpool_tools -> agentpool.tool_impls.read", - "agentpool_config.agentpool_tools -> agentpool.tools.base", - "agentpool_config.compaction -> agentpool.messaging.compaction", - "agentpool_config.conditions -> agentpool.talk.registry", - "agentpool_config.conditions -> agentpool.utils.inspection", - "agentpool_config.conditions -> agentpool.utils.time_utils", - "agentpool_config.durable -> agentpool.utils.parse_time", - "agentpool_config.event_handlers -> agentpool.agents.events", - "agentpool_config.event_handlers -> agentpool.agents.events.builtin_handlers", - "agentpool_config.event_handlers -> agentpool.agents.events.tts_handlers", - "agentpool_config.event_handlers -> agentpool.common_types", - "agentpool_config.event_handlers -> agentpool.utils.importing", - "agentpool_config.events -> agentpool.messaging.events", - "agentpool_config.forward_targets -> agentpool", - "agentpool_config.forward_targets -> agentpool.messaging", - "agentpool_config.forward_targets -> agentpool.utils.inspection", - "agentpool_config.forward_targets -> agentpool.utils.model_helpers", - "agentpool_config.forward_targets -> agentpool.utils.time_utils", - "agentpool_config.hooks -> agentpool.hooks", - "agentpool_config.hooks -> agentpool.hooks.base", - "agentpool_config.knowledge -> agentpool.prompts.prompts", - "agentpool_config.loaders -> agentpool.common_types", - "agentpool_config.loaders -> agentpool.mime_utils", - "agentpool_config.loaders -> agentpool.utils.importing", - "agentpool_config.nodes -> agentpool.common_types", - "agentpool_config.prompt_hubs -> agentpool_prompts.braintrust_hub", - "agentpool_config.prompt_hubs -> agentpool_prompts.fabric", - "agentpool_config.prompt_hubs -> agentpool_prompts.langfuse_hub", - "agentpool_config.prompt_hubs -> agentpool_prompts.promptlayer_provider", - "agentpool_config.prompts -> agentpool.log", - "agentpool_config.session -> agentpool.utils.parse_time", - "agentpool_config.session -> agentpool.utils.time_utils", - "agentpool_config.storage -> agentpool_storage.acp_provider", - "agentpool_config.storage -> agentpool_storage.base", - "agentpool_config.storage -> agentpool_storage.file_provider", - "agentpool_config.storage -> agentpool_storage.memory_provider", - "agentpool_config.storage -> agentpool_storage.opencode_provider", - "agentpool_config.storage -> agentpool_storage.sql_provider", - "agentpool_config.storage -> agentpool_storage.zed_provider", - "agentpool_config.task -> agentpool.agents", - "agentpool_config.task -> agentpool.prompts.prompts", - "agentpool_config.task -> agentpool.tools.base", - "agentpool_config.task -> agentpool.utils.model_capabilities", - "agentpool_config.tools -> agentpool.tools.base", - "agentpool_config.tools -> agentpool.utils.parse_time", - "agentpool_config.toolsets -> agentpool.prompts.conversion_manager", - "agentpool_config.toolsets -> agentpool.capabilities.combined_toolset", - "agentpool_config.toolsets -> agentpool.capabilities.filtered_toolset", - "agentpool_config.toolsets -> agentpool.capabilities.function_toolset", - "agentpool_config.toolsets -> agentpool.models.model_configs", - "agentpool_config.toolsets -> agentpool.utils.importing", - "agentpool_config.toolsets -> agentpool_toolsets.builtin", - "agentpool_config.toolsets -> agentpool_toolsets.builtin.code", - "agentpool_config.toolsets -> agentpool_toolsets.builtin.debug", - "agentpool_config.toolsets -> agentpool_toolsets.builtin.subagent_tools", - "agentpool_config.toolsets -> agentpool_toolsets.builtin.workers", - "agentpool_config.toolsets -> agentpool_toolsets.composio_toolset", - "agentpool_config.toolsets -> agentpool_toolsets.config_creation", - "agentpool_config.toolsets -> agentpool_toolsets.cron", - "agentpool_config.toolsets -> agentpool_toolsets.entry_points", - "agentpool_config.toolsets -> agentpool_toolsets.fsspec_toolset", - "agentpool_config.toolsets -> agentpool_toolsets.mcp_discovery.toolset", - "agentpool_config.toolsets -> agentpool_toolsets.notifications", - "agentpool_config.toolsets -> agentpool_toolsets.openapi", - "agentpool_config.toolsets -> agentpool_toolsets.search_toolset", - "agentpool_config.toolsets -> agentpool_toolsets.vfs_toolset", + "wolfharness_config.wolfharness_tools -> wolfharness.prompts.conversion_manager", + "wolfharness_config.wolfharness_tools -> wolfharness.tool_impls.agent_cli", + "wolfharness_config.wolfharness_tools -> wolfharness.tool_impls.bash", + "wolfharness_config.wolfharness_tools -> wolfharness.tool_impls.delete_path", + "wolfharness_config.wolfharness_tools -> wolfharness.tool_impls.download_file", + "wolfharness_config.wolfharness_tools -> wolfharness.tool_impls.execute_code", + "wolfharness_config.wolfharness_tools -> wolfharness.tool_impls.grep", + "wolfharness_config.wolfharness_tools -> wolfharness.tool_impls.list_directory", + "wolfharness_config.wolfharness_tools -> wolfharness.tool_impls.question", + "wolfharness_config.wolfharness_tools -> wolfharness.tool_impls.read", + "wolfharness_config.wolfharness_tools -> wolfharness.tools.base", + "wolfharness_config.compaction -> wolfharness.messaging.compaction", + "wolfharness_config.conditions -> wolfharness.talk.registry", + "wolfharness_config.conditions -> wolfharness.utils.inspection", + "wolfharness_config.conditions -> wolfharness.utils.time_utils", + "wolfharness_config.durable -> wolfharness.utils.parse_time", + "wolfharness_config.event_handlers -> wolfharness.agents.events", + "wolfharness_config.event_handlers -> wolfharness.agents.events.builtin_handlers", + "wolfharness_config.event_handlers -> wolfharness.agents.events.tts_handlers", + "wolfharness_config.event_handlers -> wolfharness.common_types", + "wolfharness_config.event_handlers -> wolfharness.utils.importing", + "wolfharness_config.events -> wolfharness.messaging.events", + "wolfharness_config.forward_targets -> wolfharness", + "wolfharness_config.forward_targets -> wolfharness.messaging", + "wolfharness_config.forward_targets -> wolfharness.utils.inspection", + "wolfharness_config.forward_targets -> wolfharness.utils.model_helpers", + "wolfharness_config.forward_targets -> wolfharness.utils.time_utils", + "wolfharness_config.hooks -> wolfharness.hooks", + "wolfharness_config.hooks -> wolfharness.hooks.base", + "wolfharness_config.knowledge -> wolfharness.prompts.prompts", + "wolfharness_config.loaders -> wolfharness.common_types", + "wolfharness_config.loaders -> wolfharness.mime_utils", + "wolfharness_config.loaders -> wolfharness.utils.importing", + "wolfharness_config.nodes -> wolfharness.common_types", + "wolfharness_config.prompt_hubs -> wolfharness_prompts.braintrust_hub", + "wolfharness_config.prompt_hubs -> wolfharness_prompts.fabric", + "wolfharness_config.prompt_hubs -> wolfharness_prompts.langfuse_hub", + "wolfharness_config.prompt_hubs -> wolfharness_prompts.promptlayer_provider", + "wolfharness_config.prompts -> wolfharness.log", + "wolfharness_config.session -> wolfharness.utils.parse_time", + "wolfharness_config.session -> wolfharness.utils.time_utils", + "wolfharness_config.storage -> wolfharness_storage.acp_provider", + "wolfharness_config.storage -> wolfharness_storage.base", + "wolfharness_config.storage -> wolfharness_storage.file_provider", + "wolfharness_config.storage -> wolfharness_storage.memory_provider", + "wolfharness_config.storage -> wolfharness_storage.opencode_provider", + "wolfharness_config.storage -> wolfharness_storage.sql_provider", + "wolfharness_config.storage -> wolfharness_storage.zed_provider", + "wolfharness_config.task -> wolfharness.agents", + "wolfharness_config.task -> wolfharness.prompts.prompts", + "wolfharness_config.task -> wolfharness.tools.base", + "wolfharness_config.task -> wolfharness.utils.model_capabilities", + "wolfharness_config.tools -> wolfharness.tools.base", + "wolfharness_config.tools -> wolfharness.utils.parse_time", + "wolfharness_config.toolsets -> wolfharness.prompts.conversion_manager", + "wolfharness_config.toolsets -> wolfharness.capabilities.combined_toolset", + "wolfharness_config.toolsets -> wolfharness.capabilities.filtered_toolset", + "wolfharness_config.toolsets -> wolfharness.capabilities.function_toolset", + "wolfharness_config.toolsets -> wolfharness.models.model_configs", + "wolfharness_config.toolsets -> wolfharness.utils.importing", + "wolfharness_config.toolsets -> wolfharness_toolsets.builtin", + "wolfharness_config.toolsets -> wolfharness_toolsets.builtin.code", + "wolfharness_config.toolsets -> wolfharness_toolsets.builtin.debug", + "wolfharness_config.toolsets -> wolfharness_toolsets.builtin.subagent_tools", + "wolfharness_config.toolsets -> wolfharness_toolsets.builtin.workers", + "wolfharness_config.toolsets -> wolfharness_toolsets.composio_toolset", + "wolfharness_config.toolsets -> wolfharness_toolsets.config_creation", + "wolfharness_config.toolsets -> wolfharness_toolsets.cron", + "wolfharness_config.toolsets -> wolfharness_toolsets.entry_points", + "wolfharness_config.toolsets -> wolfharness_toolsets.fsspec_toolset", + "wolfharness_config.toolsets -> wolfharness_toolsets.mcp_discovery.toolset", + "wolfharness_config.toolsets -> wolfharness_toolsets.notifications", + "wolfharness_config.toolsets -> wolfharness_toolsets.openapi", + "wolfharness_config.toolsets -> wolfharness_toolsets.search_toolset", + "wolfharness_config.toolsets -> wolfharness_toolsets.vfs_toolset", ] [[tool.importlinter.contracts]] name = "ACP package must not import from server" type = "forbidden" source_modules = ["acp"] -forbidden_modules = ["agentpool_server", "agentpool_commands", "agentpool_cli"] -# No direct violations exist; all violations are indirect (acp -> agentpool.utils +forbidden_modules = [ + "wolfharness_server", + "wolfharness_commands", + "wolfharness_cli" +] +# No direct violations exist; all violations are indirect (acp -> wolfharness.utils # -> ... -> server). Indirect checks are disabled via allow_indirect_imports -# until the downstream agentpool.common_types -> agentpool_server chain is fixed +# until the downstream wolfharness.common_types -> wolfharness_server chain is fixed # (see OpenSpec thin-wrapper-refactor Phase 7 tasks). allow_indirect_imports = true @@ -442,11 +447,11 @@ ignore_missing_imports = true [[tool.mypy.overrides]] module = [ - "agentpool_bot.channels.telegram", - "agentpool_bot.channels.slack", - "agentpool_toolsets.composio_toolset", - "agentpool_prompts.langfuse_hub", - "agentpool_prompts.braintrust_hub", + "wolfharness_bot.channels.telegram", + "wolfharness_bot.channels.slack", + "wolfharness_toolsets.composio_toolset", + "wolfharness_prompts.langfuse_hub", + "wolfharness_prompts.braintrust_hub", ] disable_error_code = [ "type-arg", @@ -518,16 +523,53 @@ asyncio_mode = "auto" default-groups = ["dev", "lint", "docs"] constraint-dependencies = ["extism-sys<1.13.0"] +# Override mknodes metadata: it declares a dependency on the legacy `agentpool` +# PyPI package, which pulls in outdated code that conflicts with the renamed +# `wolfharness` project. Redirect that dependency to `wolfharness` so uv resolves +# the local workspace instead of downloading the stale PyPI release. +[[tool.uv.dependency-metadata]] +name = "mknodes" +version = "2.2.14" +requires-dist = [ + "wolfharness", + "anybadge", + "anyenv[httpx]", + "clinspector", + "coloraide", + "epregistry", + "fieldz", + "fsspec", + "git-changelog", + "githarbor", + "gitpython", + "griffelib", + "jinja2", + "jinjarope[icons]", + "mkdocstrings[python]", + "natsort", + "pipdeptree", + "pydantic", + "pytest-asyncio", + "python-dotenv", + "setuptools", + "tomli-w", + "typer", + "universal-pathlib", + "upathtools[httpx]", + "yamling", + "zensical", +] + [tool.uv.build-backend] module-name = [ - "agentpool", - "agentpool_config", - "agentpool_cli", - "agentpool_commands", - "agentpool_storage", - "agentpool_prompts", - "agentpool_server", - "agentpool_toolsets", + "wolfharness", + "wolfharness_config", + "wolfharness_cli", + "wolfharness_commands", + "wolfharness_storage", + "wolfharness_prompts", + "wolfharness_server", + "wolfharness_toolsets", "acp", ] wheel-exclude = [ diff --git a/reproduce_skill_bug.py b/reproduce_skill_bug.py deleted file mode 100644 index a7d94785e..000000000 --- a/reproduce_skill_bug.py +++ /dev/null @@ -1,70 +0,0 @@ -"""Quick red flag test: verify skill reference loading against local MCP scratchpad. - -Run from packages/agentpool directory: - uv run python reproduce_skill_bug.py -""" - -from __future__ import annotations - -import asyncio -import sys - - -sys.path.insert(0, "/Users/yuchen.liu/src/yilab/iroot-llm/packages/agentpool/src") - -from agentpool.resource_providers.mcp_provider import MCPResourceProvider - -from agentpool.skills.uri_resolver import SkillURIResolver - - -async def main(): - print("=" * 60) - print("Skill Reference Loading - Red Flag Test") - print("=" * 60) - print() - - provider = MCPResourceProvider( - server="http://127.0.0.1:8890/mcp", - name="pool_mcp_scratchpad", - ) - - try: - await provider.__aenter__() - print(f"Provider connected: {provider.server}") - - # List skills from provider - skills = await provider.get_skills() - print(f"\nSkills from provider ({len(skills)} total):") - for s in skills: - print(f" - {s.name}: {s.skill_path}") - - # Create resolver and register provider - resolver = SkillURIResolver() - resolver.register_provider("pool_mcp_scratchpad", provider) - - # Test 1: Bare skill name (should work) - print("\n--- Test 1: Bare skill name ---") - try: - skill = await resolver.resolve("systematic-troubleshooting") - print(f"OK: {skill.name}") - except Exception as e: # noqa: BLE001 - print(f"FAIL: {e}") - - # Test 2: skill:// URI with reference (the bug) - print("\n--- Test 2: skill:// URI with reference ---") - uri = "skill://systematic-troubleshooting/references/expert_knowledge/excavator/excavator-hard-starting.md" - try: - skill = await resolver.resolve(uri) - print(f"OK: {skill.name}") - ref_path = getattr(skill, "_resolved_reference_path", None) - print(f" _resolved_reference_path: {ref_path}") - except Exception as e: # noqa: BLE001 - print(f"FAIL: {e}") - - finally: - await provider.__aexit__(None, None, None) - print("\nDisconnected") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/ruff.toml b/ruff.toml index cbc66ce28..11bc6030e 100644 --- a/ruff.toml +++ b/ruff.toml @@ -143,24 +143,30 @@ max-complexity = 15 "TC001", ] # Examples don't need TYPE_CHECKING imports # Team comm tools: ctx parameter is pydantic-ai internal, not described in docstrings -"src/agentpool/capabilities/team_comm_capability.py" = ["D417"] +"src/wolfharness/capabilities/team_comm_capability.py" = ["D417"] # Viking tools: ctx is pydantic-ai internal, BLE001 is intentional for tool error handling -"src/agentpool/capabilities/viking/tools.py" = [ +"src/wolfharness/capabilities/viking/tools.py" = [ "D417", "BLE001", "TRY300", "PLR0915" ] # Viking capability: BLE001 for safe SkillResource defaults, TRY300 for early-return pattern -"src/agentpool/capabilities/viking/__init__.py" = ["BLE001", "TRY300"] +"src/wolfharness/capabilities/viking/__init__.py" = ["BLE001", "TRY300"] # Viking instructions: E501 for markdown table lines -"src/agentpool/capabilities/viking/instructions.py" = ["E501"] +"src/wolfharness/capabilities/viking/instructions.py" = ["E501"] # Resource resolver/capability: PLR0911 for multi-return routing logic, TRY300 for early-return pattern -"src/agentpool/capabilities/resource_resolver.py" = ["PLR0911"] -"src/agentpool/capabilities/resource_capability.py" = ["PLR0911", "TRY300"] +"src/wolfharness/capabilities/resource_resolver.py" = ["PLR0911"] +"src/wolfharness/capabilities/resource_capability.py" = ["PLR0911", "TRY300"] # Background task capability: PLR0915/PLR0911 for complex lifecycle/tool methods, TRY301 for re-raise pattern -"src/agentpool/capabilities/background_task/capability.py" = ["PLR0915", "TRY301"] -"src/agentpool/capabilities/background_task/manager.py" = ["PLR0915", "PLR0911"] +"src/wolfharness/capabilities/background_task/capability.py" = [ + "PLR0915", + "TRY301" +] +"src/wolfharness/capabilities/background_task/manager.py" = [ + "PLR0915", + "PLR0911" +] # Question tool tests: RUF001 — fullwidth CJK punctuation is intentional test data # for verifying CJK text parsing in the question_for_user XML "tests/tool_impls/question/test_question_for_user.py" = ["RUF001"] diff --git a/runtime_hook.py b/runtime_hook.py deleted file mode 100644 index f29e61a85..000000000 --- a/runtime_hook.py +++ /dev/null @@ -1,5 +0,0 @@ -import os - - -# Disable Pydantic plugins (logfire) to avoid source code inspection issues in frozen apps -os.environ["PYDANTIC_DISABLE_PLUGINS"] = "1" diff --git a/schema/config-schema.json b/schema/config-schema.json index 2950b61a2..97f3d8463 100644 --- a/schema/config-schema.json +++ b/schema/config-schema.json @@ -988,7 +988,7 @@ }, "AGUIAgentConfig": { "additionalProperties": false, - "description": "Configuration for AG-UI protocol agents.\n\nAG-UI agents connect to remote HTTP endpoints that implement the AG-UI protocol,\nenabling integration of any AG-UI compatible server into the agentpool pool.\n\nExample:\n ```yaml\n agents:\n remote_assistant:\n type: agui\n endpoint: http://localhost:8000/agent/run\n timeout: 30.0\n headers:\n X-API-Key: ${API_KEY}\n tools:\n - import_path: mymodule.my_tool_function\n\n managed_agent:\n endpoint: http://localhost:8765/agent/run\n startup_command: \"uv run ag-ui-server config.yml\"\n startup_delay: 3.0\n tools:\n - import_path: package.tool_one\n - import_path: package.tool_two\n ```", + "description": "Configuration for AG-UI protocol agents.\n\nAG-UI agents connect to remote HTTP endpoints that implement the AG-UI protocol,\nenabling integration of any AG-UI compatible server into the wolfharness pool.\n\nExample:\n ```yaml\n agents:\n remote_assistant:\n type: agui\n endpoint: http://localhost:8000/agent/run\n timeout: 30.0\n headers:\n X-API-Key: ${API_KEY}\n tools:\n - import_path: mymodule.my_tool_function\n\n managed_agent:\n endpoint: http://localhost:8765/agent/run\n startup_command: \"uv run ag-ui-server config.yml\"\n startup_delay: 3.0\n tools:\n - import_path: package.tool_one\n - import_path: package.tool_two\n ```", "properties": { "name": { "default": null, @@ -1836,7 +1836,7 @@ "service_name": { "default": null, "examples": [ - "agentpool", + "wolfharness", "my-ai-service", "production-bot" ], @@ -2730,7 +2730,7 @@ "service_name": { "default": null, "examples": [ - "agentpool", + "wolfharness", "my-ai-service", "production-bot" ], @@ -3728,7 +3728,7 @@ "service_name": { "default": null, "examples": [ - "agentpool", + "wolfharness", "my-ai-service", "production-bot" ], @@ -5889,7 +5889,7 @@ ], "default": null, "description": "System prompt for the agent.\n Can be a string or list of strings/prompt configs", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/system_prompts_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/system_prompts_configuration/", "examples": [ "You are a helpful assistant.", [ @@ -6190,7 +6190,7 @@ "type": "boolean" }, "tools": { - "description": "Tools and toolsets to expose to this Claude Code agent via MCP bridge.\n\nSupports both single tools and toolsets. These will be started as an\nin-process MCP server and made available to Claude Code.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/tool_configuration/", + "description": "Tools and toolsets to expose to this Claude Code agent via MCP bridge.\n\nSupports both single tools and toolsets. These will be started as an\nin-process MCP server and made available to Claude Code.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/tool_configuration/", "examples": [ [ { @@ -6581,7 +6581,7 @@ }, "ClaudeStorageConfig": { "additionalProperties": false, - "description": "Claude Code native storage format configuration.\n\nReads/writes to Claude Code's native JSONL format in ~/.claude/projects/.\nUseful for sharing conversation history between agentpool and Claude Code CLI.", + "description": "Claude Code native storage format configuration.\n\nReads/writes to Claude Code's native JSONL format in ~/.claude/projects/.\nUseful for sharing conversation history between wolfharness and Claude Code CLI.", "properties": { "type": { "const": "claude", @@ -7237,7 +7237,7 @@ }, "CodexAgentConfig": { "additionalProperties": false, - "description": "Configuration for Codex app-server agent.\n\nWraps the Codex app-server via its JSON-RPC protocol, enabling\nintegration with agentpool's agent ecosystem.", + "description": "Configuration for Codex app-server agent.\n\nWraps the Codex app-server via its JSON-RPC protocol, enabling\nintegration with wolfharness's agent ecosystem.", "properties": { "name": { "default": null, @@ -8674,7 +8674,7 @@ }, "CronToolsetConfig": { "additionalProperties": false, - "description": "Configuration for cron scheduling toolset.\n\nGives agents the ability to schedule, list, and remove recurring or\none-shot jobs at runtime. Jobs are persisted to a JSON file.\n\nRequires the ``bot`` extra: ``pip install agentpool[bot]``", + "description": "Configuration for cron scheduling toolset.\n\nGives agents the ability to schedule, list, and remove recurring or\none-shot jobs at runtime. Jobs are persisted to a JSON file.\n\nRequires the ``bot`` extra: ``pip install wolfharness[bot]``", "properties": { "namespace": { "default": null, @@ -8697,10 +8697,10 @@ "type": "string" }, "store_path": { - "default": "~/.agentpool/cron_jobs.json", + "default": "~/.wolfharness/cron_jobs.json", "description": "Path to the JSON file where scheduled jobs are persisted.", "examples": [ - "~/.agentpool/cron_jobs.json", + "~/.wolfharness/cron_jobs.json", "/tmp/cron.json" ], "title": "Job store path", @@ -8732,7 +8732,7 @@ "service_name": { "default": null, "examples": [ - "agentpool", + "wolfharness", "my-ai-service", "production-bot" ], @@ -18969,7 +18969,7 @@ "description": "The task instruction/prompt.", "examples": [ "Analyze the following code", - "agentpool.prompts.prompts:BasePrompt" + "wolfharness.prompts.prompts:BasePrompt" ], "title": "Task prompt" }, @@ -18988,7 +18988,7 @@ "default": null, "description": "Dependencies or context data needed for task execution", "examples": [ - "agentpool.agents.context:AgentContext" + "wolfharness.agents.context:AgentContext" ], "title": "Required dependencies", "type": [ @@ -19390,7 +19390,7 @@ }, "Knowledge": { "additionalProperties": false, - "description": "Collection of context sources for an agent.\n\nSupports both simple paths and rich resource types for content loading,\nplus AgentPool's prompt system for dynamic content generation.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/knowledge_configuration/", + "description": "Collection of context sources for an agent.\n\nSupports both simple paths and rich resource types for content loading,\nplus AgentPool's prompt system for dynamic content generation.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/knowledge_configuration/", "properties": { "paths": { "description": "Quick access to files and URLs.\n\nPaths are automatically resolved relative to the config file location\nvia ConfigPath validation.", @@ -19642,7 +19642,7 @@ "service_name": { "default": null, "examples": [ - "agentpool", + "wolfharness", "my-ai-service", "production-bot" ], @@ -20502,7 +20502,7 @@ "service_name": { "default": null, "examples": [ - "agentpool", + "wolfharness", "my-ai-service", "production-bot" ], @@ -20576,7 +20576,7 @@ }, "MCPDiscoveryToolsetConfig": { "additionalProperties": false, - "description": "Configuration for MCP discovery toolset.\n\nEnables dynamic discovery and use of MCP servers without preloading tools.\nUses semantic search over 1000+ indexed servers for intelligent matching.\n\nRequires the `mcp-discovery` extra: `pip install agentpool[mcp-discovery]`", + "description": "Configuration for MCP discovery toolset.\n\nEnables dynamic discovery and use of MCP servers without preloading tools.\nUses semantic search over 1000+ indexed servers for intelligent matching.\n\nRequires the `mcp-discovery` extra: `pip install wolfharness[mcp-discovery]`", "properties": { "namespace": { "default": null, @@ -22635,7 +22635,7 @@ }, "NativeAgentConfig": { "additionalProperties": false, - "description": "Configuration for a single agent in the system.\n\nDefines an agent's complete configuration including its model, environment,\nand behavior settings.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/agent_configuration/", + "description": "Configuration for a single agent in the system.\n\nDefines an agent's complete configuration including its model, environment,\nand behavior settings.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/agent_configuration/", "properties": { "name": { "default": null, @@ -23889,16 +23889,16 @@ "type": "string" } ], - "description": "The model to use for this agent. Can be either a simple model name\nstring (e.g. 'openai:gpt-5') or a structured model definition.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/model_configuration/", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/model_configuration/", + "description": "The model to use for this agent. Can be either a simple model name\nstring (e.g. 'openai:gpt-5') or a structured model definition.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/model_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/model_configuration/", "examples": [ "openai:gpt-5-nano" ], "title": "Model configuration or name" }, "tools": { - "description": "A list of tools and toolsets to register with this agent.\n\nSupports both single tools (bash, import, web_search, etc.) and\ntoolsets (file_access, process_management, code, etc.).\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/tool_configuration/", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/tool_configuration/", + "description": "A list of tools and toolsets to register with this agent.\n\nSupports both single tools (bash, import, web_search, etc.) and\ntoolsets (file_access, process_management, code, etc.).\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/tool_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/tool_configuration/", "examples": [ [ "webbrowser:open", @@ -24153,8 +24153,8 @@ } ], "default": null, - "description": "Session configuration for conversation recovery.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/session_configuration/", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/session_configuration/", + "description": "Session configuration for conversation recovery.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/session_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/session_configuration/", "examples": [ "main_session", "user_123" @@ -24278,7 +24278,7 @@ ], "default": null, "description": "System prompt for the agent.\n Can be a string or list of strings/prompt configs", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/system_prompts_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/system_prompts_configuration/", "examples": [ "You are a helpful assistant.", [ @@ -24298,13 +24298,13 @@ } ], "default": null, - "description": "Knowledge sources for this agent.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/knowledge_configuration/", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/knowledge_configuration/", + "description": "Knowledge sources for this agent.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/knowledge_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/knowledge_configuration/", "title": "Knowledge sources" }, "workers": { - "description": "Worker agents which will be available as tools.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/worker_configuration/", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/worker_configuration/", + "description": "Worker agents which will be available as tools.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/worker_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/worker_configuration/", "examples": [ [ { @@ -27432,7 +27432,7 @@ }, "PromptLibraryConfig": { "additionalProperties": false, - "description": "Complete prompt configuration.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/prompt_configuration/", + "description": "Complete prompt configuration.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/prompt_configuration/", "properties": { "system_prompts": { "additionalProperties": { @@ -32231,7 +32231,7 @@ }, "StorageConfig": { "additionalProperties": false, - "description": "Global storage configuration.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/storage_configuration/", + "description": "Global storage configuration.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/storage_configuration/", "properties": { "providers": { "anyOf": [ @@ -34309,7 +34309,7 @@ }, "StructuredResponseConfig": { "additionalProperties": false, - "description": "Base class for response definitions.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/response_configuration/", + "description": "Base class for response definitions.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/response_configuration/", "properties": { "response_schema": { "description": "A model describing the response schema.", @@ -34811,7 +34811,7 @@ }, "TeamConfig": { "additionalProperties": false, - "description": "Configuration for a team or chain of message nodes.\n\nTeams can be either parallel execution groups or sequential chains.\nThey can contain both agents and other teams as members.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/team_configuration/", + "description": "Configuration for a team or chain of message nodes.\n\nTeams can be either parallel execution groups or sequential chains.\nThey can contain both agents and other teams as members.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/team_configuration/", "properties": { "name": { "default": null, @@ -38406,7 +38406,7 @@ }, "additionalProperties": true, "description": "Complete agent configuration manifest defining all available agents.\n\nThis is the root configuration that:\n- Defines available response types (both inline and imported)\n- Configures all agent instances and their settings\n- Sets up custom role definitions and capabilities\n- Manages environment configurations\n\nA single manifest can define multiple agents that can work independently\nor collaborate through the orchestrator.", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/manifest_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/manifest_configuration/", "patternProperties": { "^\\.": { "description": "YAML anchor or hidden field" @@ -38761,8 +38761,8 @@ } ] }, - "description": "Mapping of agent IDs to their configurations.\n\nAll agent types are unified under this single dict, discriminated by the 'type' field:\n- type: \"native\" (default) - pydantic-ai based agents\n- type: \"agui\" - AG-UI protocol agents\n- type: \"claude_code\" - Claude Agent SDK agents\n- type: \"acp\" - ACP protocol agents (further discriminated by 'provider')\n\nExample:\n ```yaml\n agents:\n assistant:\n type: native\n model: openai:gpt-4\n system_prompt: \"You are a helpful assistant.\"\n\n coder:\n type: claude_code\n cwd: /path/to/project\n model: claude-sonnet-4-5\n\n orchestrator:\n type: acp\n provider: claude\n model: sonnet\n\n remote:\n type: agui\n endpoint: http://localhost:8000/agent/run\n ```\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/agent_configuration/", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/agent_configuration/", + "description": "Mapping of agent IDs to their configurations.\n\nAll agent types are unified under this single dict, discriminated by the 'type' field:\n- type: \"native\" (default) - pydantic-ai based agents\n- type: \"agui\" - AG-UI protocol agents\n- type: \"claude_code\" - Claude Agent SDK agents\n- type: \"acp\" - ACP protocol agents (further discriminated by 'provider')\n\nExample:\n ```yaml\n agents:\n assistant:\n type: native\n model: openai:gpt-4\n system_prompt: \"You are a helpful assistant.\"\n\n coder:\n type: claude_code\n cwd: /path/to/project\n model: claude-sonnet-4-5\n\n orchestrator:\n type: acp\n provider: claude\n model: sonnet\n\n remote:\n type: agui\n endpoint: http://localhost:8000/agent/run\n ```\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/agent_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/agent_configuration/", "title": "Agents", "type": "object" }, @@ -38810,15 +38810,15 @@ "additionalProperties": { "$ref": "#/$defs/TeamConfig" }, - "description": "Mapping of team IDs to their configurations.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/team_configuration/", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/team_configuration/", + "description": "Mapping of team IDs to their configurations.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/team_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/team_configuration/", "title": "Teams", "type": "object" }, "storage": { "$ref": "#/$defs/StorageConfig", - "description": "Storage provider configuration.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/storage_configuration/", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/storage_configuration/" + "description": "Storage provider configuration.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/storage_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/storage_configuration/" }, "observability": { "$ref": "#/$defs/ObservabilityConfig", @@ -38832,8 +38832,8 @@ "additionalProperties": { "$ref": "#/$defs/StructuredResponseConfig" }, - "description": "Mapping of response names to their definitions.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/response_configuration/", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/response_configuration/", + "description": "Mapping of response names to their definitions.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/response_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/response_configuration/", "title": "Responses", "type": "object" }, @@ -38938,8 +38938,8 @@ "type": "object" }, "mcp_servers": { - "description": "List of MCP server configurations:\n\nThese MCP servers are used to provide tools and other resources to the nodes.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/mcp_configuration/", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/mcp_configuration/", + "description": "List of MCP server configurations:\n\nThese MCP servers are used to provide tools and other resources to the nodes.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/mcp_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/mcp_configuration/", "examples": [ [ "uvx some-server" @@ -38996,8 +38996,8 @@ }, "prompts": { "$ref": "#/$defs/PromptLibraryConfig", - "description": "Prompt library configuration.\n\nThis configuration defines the prompt library, which is used to provide prompts to the nodes.\n\nDocs: https://phil65.github.io/agentpool/YAML%20Configuration/prompt_configuration/", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/prompt_configuration/" + "description": "Prompt library configuration.\n\nThis configuration defines the prompt library, which is used to provide prompts to the nodes.\n\nDocs: https://phil65.github.io/wolfharness/YAML%20Configuration/prompt_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/prompt_configuration/" }, "skills": { "$ref": "#/$defs/SkillsConfig", diff --git a/scripts/add_frontmatter.py b/scripts/add_frontmatter.py index ebc76b0d3..c520fa1e0 100644 --- a/scripts/add_frontmatter.py +++ b/scripts/add_frontmatter.py @@ -8,7 +8,7 @@ # Root paths -DOCS_CODE_DIR = Path("src/agentpool_docs") +DOCS_CODE_DIR = Path("src/wolfharness_docs") DOCS_DIR = Path("docs") diff --git a/scripts/build_mcp_registry_index.py b/scripts/build_mcp_registry_index.py index cae02299b..731aeab8b 100644 --- a/scripts/build_mcp_registry_index.py +++ b/scripts/build_mcp_registry_index.py @@ -23,7 +23,7 @@ DEFAULT_OUTPUT = ( Path(__file__).parent.parent / "src" - / "agentpool_toolsets" + / "wolfharness_toolsets" / "mcp_discovery" / "data" / "mcp_servers.parquet" diff --git a/scripts/check_union_docs.py b/scripts/check_union_docs.py index 908d6032e..f3a1b4709 100644 --- a/scripts/check_union_docs.py +++ b/scripts/check_union_docs.py @@ -9,13 +9,13 @@ from pathlib import Path import sys -from agentpool.docs.utils import check_docs_for_union, discriminator_to_filename +from wolfharness.docs.utils import check_docs_for_union, discriminator_to_filename def main() -> int: """Run checks for known union types.""" # Import here to avoid import errors if dependencies missing - from agentpool_config.toolsets import ToolsetConfig + from wolfharness_config.toolsets import ToolsetConfig checks = [ (ToolsetConfig, Path("docs/configuration/toolsets"), "Toolsets"), @@ -46,7 +46,7 @@ def main() -> int: print(f" - {filename}.md") if not missing and not extra: - from agentpool.docs.utils import get_discriminator_values + from wolfharness.docs.utils import get_discriminator_values count = len(get_discriminator_values(union_type)) print(f" All {count} types documented") diff --git a/scripts/diagnose_skills.py b/scripts/diagnose_skills.py index 6b365ccf7..2dfe54def 100644 --- a/scripts/diagnose_skills.py +++ b/scripts/diagnose_skills.py @@ -40,7 +40,7 @@ async def diagnose(config_path: str | None = None) -> None: # noqa: PLR0915 # ============================================================ print_header("Stage 1: Filesystem Discovery") - from agentpool_config.skills import DEFAULT_SKILLS_PATHS + from wolfharness_config.skills import DEFAULT_SKILLS_PATHS # Check default skill directories for dp in DEFAULT_SKILLS_PATHS: @@ -90,7 +90,7 @@ async def diagnose(config_path: str | None = None) -> None: # noqa: PLR0915 else "MISSING", ) # Check for unknown keys - from agentpool.skills.skill import SkillMetadata + from wolfharness.skills.skill import SkillMetadata try: SkillMetadata.model_validate(frontmatter) @@ -124,7 +124,7 @@ async def diagnose(config_path: str | None = None) -> None: # noqa: PLR0915 if config_path: print("\n --- Custom paths from config ---") try: - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest.from_file(config_path) if manifest.skills: @@ -152,15 +152,15 @@ async def diagnose(config_path: str | None = None) -> None: # noqa: PLR0915 # Stage 2: SkillsManager / SkillsRegistry print_header("Stage 2: SkillsManager / SkillsRegistry") - from agentpool.skills.manager import SkillsManager + from wolfharness.skills.manager import SkillsManager try: config_file_path = to_upath(config_path) if config_path else None - from agentpool_config.skills import SkillsConfig + from wolfharness_config.skills import SkillsConfig skills_config: SkillsConfig | None = None if config_path: - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest.from_file(config_path) skills_config = manifest.skills @@ -190,7 +190,7 @@ async def diagnose(config_path: str | None = None) -> None: # noqa: PLR0915 print_header("Stage 3: AgentPool Initialization") try: - from agentpool.delegation import AgentPool + from wolfharness.delegation import AgentPool async with AgentPool(config_path) as pool: # Check skill_provider @@ -237,11 +237,11 @@ async def diagnose(config_path: str | None = None) -> None: # noqa: PLR0915 if config_path: try: - from agentpool.delegation import AgentPool + from wolfharness.delegation import AgentPool async with AgentPool(config_path) as pool: # Simulate what server.py does - from agentpool_server.opencode_server.skill_bridge import OpenCodeSkillBridge + from wolfharness_server.opencode_server.skill_bridge import OpenCodeSkillBridge bridge = OpenCodeSkillBridge(skill_provider=pool.skill_provider) @@ -320,7 +320,7 @@ async def diagnose(config_path: str | None = None) -> None: # noqa: PLR0915 4. Relative paths resolve against the CONFIG FILE location, not CWD. 5. Check server logs with: - OBSERVABILITY_ENABLED=true agentpool serve-opencode config.yml + OBSERVABILITY_ENABLED=true wolfharness serve-opencode config.yml 6. If pool.skill_provider is None, the OpenCode bridge won't have commands. """) diff --git a/scripts/generate_mcp_registry_models.py b/scripts/generate_mcp_registry_models.py index 6c81e42e1..bc7d6f779 100644 --- a/scripts/generate_mcp_registry_models.py +++ b/scripts/generate_mcp_registry_models.py @@ -21,7 +21,7 @@ REGISTRY_URL = "https://registry.modelcontextprotocol.io/v0/servers" -OUTPUT_FILE = Path(__file__).parent.parent / "src" / "agentpool_config" / "mcp_registry.py" +OUTPUT_FILE = Path(__file__).parent.parent / "src" / "wolfharness_config" / "mcp_registry.py" @dataclass @@ -405,7 +405,7 @@ def generate_single_file(servers: list[ServerDef]) -> str: "", "from pydantic import Field, HttpUrl", "", - "from agentpool_config.mcp_server import (", + "from wolfharness_config.mcp_server import (", " BaseMCPServerConfig,", " SSEMCPServerConfig,", " StdioMCPServerConfig,", diff --git a/scripts/generate_openresponses_models.py b/scripts/generate_openresponses_models.py index c62eba09a..fb26852bd 100644 --- a/scripts/generate_openresponses_models.py +++ b/scripts/generate_openresponses_models.py @@ -24,7 +24,7 @@ "https://raw.githubusercontent.com/openresponses/openresponses/main/public/openapi/openapi.json" ) PROJECT_ROOT = Path(__file__).parent.parent -OUTPUT_DIR = PROJECT_ROOT / "src" / "agentpool" / "models" / "openresponses" +OUTPUT_DIR = PROJECT_ROOT / "src" / "wolfharness" / "models" / "openresponses" OUTPUT_FILE = OUTPUT_DIR / "models.py" TEMP_OPENAPI = "/tmp/openresponses_openapi.json" @@ -78,7 +78,7 @@ def generate_models() -> None: "--use-one-literal-as-default", "--collapse-root-models", "--base-class", - "agentpool.models.openresponses.base.OpenResponsesBase", + "wolfharness.models.openresponses.base.OpenResponsesBase", "--formatters", "ruff-check", "ruff-format", diff --git a/scripts/generate_schema.py b/scripts/generate_schema.py index 8982012d8..f81fcc9ea 100644 --- a/scripts/generate_schema.py +++ b/scripts/generate_schema.py @@ -14,8 +14,8 @@ import sys from typing import Any, Literal -from agentpool import AgentsManifest -from agentpool.log import configure_logging, get_logger +from wolfharness import AgentsManifest +from wolfharness.log import configure_logging, get_logger logger = get_logger(__name__) diff --git a/scripts/qa_test_server.py b/scripts/qa_test_server.py index fa422860f..13ceab713 100644 --- a/scripts/qa_test_server.py +++ b/scripts/qa_test_server.py @@ -12,16 +12,16 @@ import uvicorn -from agentpool.storage import StorageManager -from agentpool.utils.streams import FileOpsTracker -from agentpool.utils.todos import TodoTracker -from agentpool_server.opencode_server.server import create_app +from wolfharness.storage import StorageManager +from wolfharness.utils.streams import FileOpsTracker +from wolfharness.utils.todos import TodoTracker +from wolfharness_server.opencode_server.server import create_app if TYPE_CHECKING: from fastapi import FastAPI - from agentpool.sessions.models import SessionData + from wolfharness.sessions.models import SessionData def create_test_app() -> FastAPI: # noqa: PLR0915 @@ -33,7 +33,7 @@ def create_test_app() -> FastAPI: # noqa: PLR0915 pool.manifest.opencode = Mock() # Storage - from agentpool_config.storage import MemoryStorageConfig, StorageConfig + from wolfharness_config.storage import MemoryStorageConfig, StorageConfig storage_manager = StorageManager(config=StorageConfig(providers=[MemoryStorageConfig()])) pool.storage = storage_manager @@ -60,7 +60,7 @@ async def _mock_create_session( ) -> Mock: from datetime import datetime - from agentpool.sessions.models import SessionData + from wolfharness.sessions.models import SessionData data = SessionData( session_id=session_id, @@ -97,7 +97,7 @@ async def _mock_close_session(session_id: str) -> None: def _mock_session_state(): from datetime import datetime - from agentpool.orchestrator.core import SessionState + from wolfharness.orchestrator.core import SessionState state = Mock(spec=SessionState) state.created_at = datetime.now().timestamp() diff --git a/scripts/rename_to_agentwolf.py b/scripts/rename_to_wolfharness.py similarity index 67% rename from scripts/rename_to_agentwolf.py rename to scripts/rename_to_wolfharness.py index 5fd3e1387..6856832e5 100755 --- a/scripts/rename_to_agentwolf.py +++ b/scripts/rename_to_wolfharness.py @@ -1,19 +1,23 @@ #!/usr/bin/env python3 -"""Rename agentpool → agentwolf across the entire codebase. +"""Rename agentpool → wolfharness across the entire codebase. -Phase 8 of the thin-wrapper refactor. This script performs a one-shot -mechanical rename of all agentpool references to agentwolf. +Mechanical rename of the project from AgentPool (wolfharness) to +WolfHarness (wolfharness). Supersedes the earlier wolfharness → agentwolf +rename (which was never merged to main). + +This script performs a one-shot mechanical rename of all wolfharness +references to wolfharness. Usage: - python scripts/rename_to_agentwolf.py [--dry-run] + python scripts/rename_to_wolfharness.py [--dry-run] Pre-requisites: - - All Phase 1-7 PRs merged into refactor/thin-wrapper + - Based on origin/main (which never contained agentwolf package code) - Clean working tree (no uncommitted changes) - Run from repository root What this script does: - 1. Rename src/ directories (agentpool → agentwolf, agentpool_* → agentwolf_*) + 1. Rename src/ directories (wolfharness → wolfharness, wolfharness_* → wolfharness_*) 2. Replace all references in .py/.toml/.yml/.md/.json/etc files 3. Verify entry point files exist post-rename 4. Print verification checklist @@ -28,7 +32,7 @@ 2. Run `uv run pytest` to verify all tests pass 3. Run `uv run ruff check src/` to verify linting 4. Run `uv run mypy src/` to verify type checking - 5. Verify `agentwolf --version` works + 5. Verify `wolfharness --version` works 6. Commit as a single atomic commit """ @@ -42,29 +46,29 @@ REPO_ROOT = Path(__file__).resolve().parent.parent SRC_DIRS_TO_RENAME = [ - ("src/agentpool", "src/agentwolf"), - ("src/agentpool_bot", "src/agentwolf_bot"), - ("src/agentpool_cli", "src/agentwolf_cli"), - ("src/agentpool_commands", "src/agentwolf_commands"), - ("src/agentpool_config", "src/agentwolf_config"), - ("src/agentpool_prompts", "src/agentwolf_prompts"), - ("src/agentpool_server", "src/agentwolf_server"), - ("src/agentpool_storage", "src/agentwolf_storage"), - ("src/agentpool_sync", "src/agentwolf_sync"), - ("src/agentpool_toolsets", "src/agentwolf_toolsets"), + ("src/wolfharness", "src/wolfharness"), + ("src/wolfharness_bot", "src/wolfharness_bot"), + ("src/wolfharness_cli", "src/wolfharness_cli"), + ("src/wolfharness_commands", "src/wolfharness_commands"), + ("src/wolfharness_config", "src/wolfharness_config"), + ("src/wolfharness_prompts", "src/wolfharness_prompts"), + ("src/wolfharness_server", "src/wolfharness_server"), + ("src/wolfharness_storage", "src/wolfharness_storage"), + ("src/wolfharness_sync", "src/wolfharness_sync"), + ("src/wolfharness_toolsets", "src/wolfharness_toolsets"), ] REPLACEMENTS = [ - ("agentpool_config", "agentwolf_config"), - ("agentpool_server", "agentwolf_server"), - ("agentpool_toolsets", "agentwolf_toolsets"), - ("agentpool_storage", "agentwolf_storage"), - ("agentpool_cli", "agentwolf_cli"), - ("agentpool_commands", "agentwolf_commands"), - ("agentpool_prompts", "agentwolf_prompts"), - ("agentpool_sync", "agentwolf_sync"), - ("agentpool_bot", "agentwolf_bot"), - ("agentpool", "agentwolf"), + ("wolfharness_config", "wolfharness_config"), + ("wolfharness_server", "wolfharness_server"), + ("wolfharness_toolsets", "wolfharness_toolsets"), + ("wolfharness_storage", "wolfharness_storage"), + ("wolfharness_cli", "wolfharness_cli"), + ("wolfharness_commands", "wolfharness_commands"), + ("wolfharness_prompts", "wolfharness_prompts"), + ("wolfharness_sync", "wolfharness_sync"), + ("wolfharness_bot", "wolfharness_bot"), + ("wolfharness", "wolfharness"), ] FILE_PATTERNS = [ @@ -100,7 +104,7 @@ def rename_directories(dry_run: bool) -> None: - """Rename src/ directories from agentpool* to agentwolf*.""" + """Rename src/ directories from wolfharness* to wolfharness*.""" print("Step 1: Renaming source directories") for old, new in SRC_DIRS_TO_RENAME: old_path = REPO_ROOT / old @@ -117,7 +121,7 @@ def rename_directories(dry_run: bool) -> None: def replace_references(dry_run: bool) -> None: - """Replace all agentpool references in source files.""" + """Replace all wolfharness references in source files.""" print("\nStep 2: Replacing references in files") files_changed = 0 for pattern in FILE_PATTERNS: @@ -144,9 +148,9 @@ def check_entry_points() -> None: """Check that renamed entry point files exist.""" print("\nStep 3: Checking entry points") entry_files = [ - REPO_ROOT / "src" / "agentwolf" / "__init__.py", - REPO_ROOT / "src" / "agentwolf_cli" / "__init__.py", - REPO_ROOT / "src" / "agentwolf_cli" / "cli.py", + REPO_ROOT / "src" / "wolfharness" / "__init__.py", + REPO_ROOT / "src" / "wolfharness_cli" / "__init__.py", + REPO_ROOT / "src" / "wolfharness_cli" / "cli.py", ] for ef in entry_files: if ef.exists(): @@ -162,10 +166,9 @@ def print_verification_checklist() -> None: print(" [ ] Run: uv run pytest") print(" [ ] Run: uv run ruff check src/") print(" [ ] Run: uv run mypy src/") - print(" [ ] Run: agentwolf --version") - print(" [ ] Run: agentwolf serve-acp config.yml") - print(" [ ] Commit: git add -A && git commit -m 'refactor: rename agentpool to agentwolf'") - print(" [ ] Push: git push million refactor/thin-wrapper --force") + print(" [ ] Run: wolfharness --version") + print(" [ ] Run: wolfharness serve-acp config.yml") + print(" [ ] Commit: git add -A && git commit -m 'refactor: rename wolfharness to wolfharness'") def main() -> None: diff --git a/scripts/restart_opencode_server.sh b/scripts/restart_opencode_server.sh index 456433a33..8561f02ff 100755 --- a/scripts/restart_opencode_server.sh +++ b/scripts/restart_opencode_server.sh @@ -22,8 +22,8 @@ fi echo "" echo "To start the server again with updated code, run:" -echo " cd /home/phil65/dev/oss/agentpool" -echo " agentpool ui desktop" +echo " cd /home/phil65/dev/oss/wolfharness" +echo " wolfharness ui desktop" echo "" echo "Or if you want to run just the server (without desktop app):" -echo " agentpool serve-opencode --port 4096" +echo " wolfharness serve-opencode --port 4096" diff --git a/scripts/tts_performance.py b/scripts/tts_performance.py index 7ca06d1ba..da6cb6770 100644 --- a/scripts/tts_performance.py +++ b/scripts/tts_performance.py @@ -15,15 +15,15 @@ import anyio from pydantic_ai import PartDeltaEvent, PartStartEvent, TextPart, TextPartDelta -from agentpool import Agent -from agentpool_config.event_handlers import EdgeTTSEventHandlerConfig, TTSEventHandlerConfig +from wolfharness import Agent +from wolfharness_config.event_handlers import EdgeTTSEventHandlerConfig, TTSEventHandlerConfig if TYPE_CHECKING: from anyvoice import TTSMode - from agentpool.agents.context import AgentContext - from agentpool.agents.events import RichAgentStreamEvent + from wolfharness.agents.context import AgentContext + from wolfharness.agents.events import RichAgentStreamEvent TTSProvider = Literal["openai", "edge"] diff --git a/src/acp/AGENTS.md b/src/acp/AGENTS.md index b46d8aed8..1c175edc7 100644 --- a/src/acp/AGENTS.md +++ b/src/acp/AGENTS.md @@ -2,7 +2,7 @@ ## Overview -Standalone JSON-RPC 2.0 protocol implementation for the Agent Communication Protocol (69 files). Independent from agentpool framework -- used by it, not part of it. +Standalone JSON-RPC 2.0 protocol implementation for the Agent Communication Protocol (69 files). Independent from wolfharness framework -- used by it, not part of it. ## Where To Look @@ -39,4 +39,4 @@ Standalone JSON-RPC 2.0 protocol implementation for the Agent Communication Prot - The `connection.py` `Connection` class is the central wire-protocol engine. It handles JSON-RPC framing, message dispatch, stream observers, and bidirectional communication. Both `AgentSideConnection` and `ClientSideConnection` wrap it with protocol-specific method handlers. - `ToolCallState` sends delta-only updates (per ACP spec, all fields except `toolCallId` are optional in updates). Re-sends nothing unless data changed. - Entry points in pyproject.toml: `acp-bridge` console script, `acp = ACPFileSystem` (fsspec), `acp = ACPPath` (universal_pathlib). -- The debug server at `agent/implementations/debug_server/` provides a full standalone ACP agent + HTML UI for testing without agentpool. +- The debug server at `agent/implementations/debug_server/` provides a full standalone ACP agent + HTML UI for testing without wolfharness. diff --git a/src/acp/agent/acp_agent_api.py b/src/acp/agent/acp_agent_api.py index e7120a3bf..ad8cb252c 100644 --- a/src/acp/agent/acp_agent_api.py +++ b/src/acp/agent/acp_agent_api.py @@ -65,7 +65,7 @@ class ACPAgentAPI: Avoids manual instantiation of request/notification objects. When optional ``state`` and ``update_event`` are provided, the instance - also satisfies the :class:`~agentpool.agents.acp_agent.turn.ACPClientProtocol` + also satisfies the :class:`~wolfharness.agents.acp_agent.turn.ACPClientProtocol` protocol by implementing :meth:`stream_events` and :meth:`get_messages`. """ diff --git a/src/acp/agent/notifications.py b/src/acp/agent/notifications.py index f43ad88e4..0b90947db 100644 --- a/src/acp/agent/notifications.py +++ b/src/acp/agent/notifications.py @@ -35,7 +35,7 @@ from acp.schema.tool_call import ToolCallLocation from acp.tool_call_reporter import ToolCallReporter from acp.utils import generate_tool_title, infer_tool_kind, to_acp_content_blocks -from agentpool.utils.pydantic_ai_helpers import safe_args_as_dict +from wolfharness.utils.pydantic_ai_helpers import safe_args_as_dict if TYPE_CHECKING: diff --git a/src/acp/bridge/__main__.py b/src/acp/bridge/__main__.py index 10c4788f7..4a625e23a 100644 --- a/src/acp/bridge/__main__.py +++ b/src/acp/bridge/__main__.py @@ -7,7 +7,7 @@ # WebSocket bridge uv run -m acp.bridge --transport websocket [args...] - uv run -m acp.bridge -t ws --port 8765 -- uv run agentpool serve-acp + uv run -m acp.bridge -t ws --port 8765 -- uv run wolfharness serve-acp """ from __future__ import annotations @@ -31,7 +31,7 @@ def main() -> None: " acp-bridge --port 8080 -- your-agent --config config.yml\n" "\n" " # WebSocket bridge\n" - " acp-bridge -t ws -- uv run agentpool serve-acp\n" + " acp-bridge -t ws -- uv run wolfharness serve-acp\n" " acp-bridge --transport websocket --port 8765 -- uv run my-agent\n" ), formatter_class=argparse.RawTextHelpFormatter, diff --git a/src/acp/bridge/ws_server.py b/src/acp/bridge/ws_server.py index 77907ba9d..00063ace2 100644 --- a/src/acp/bridge/ws_server.py +++ b/src/acp/bridge/ws_server.py @@ -4,7 +4,7 @@ allowing clients like mcp-ws to connect. Usage: - python -m acp.bridge.ws_server "uv run agentpool serve-acp" --port 8765 + python -m acp.bridge.ws_server "uv run wolfharness serve-acp" --port 8765 """ from __future__ import annotations diff --git a/src/acp/bridge/ws_server_cli.py b/src/acp/bridge/ws_server_cli.py index 85dbb7a3d..78a37b94f 100644 --- a/src/acp/bridge/ws_server_cli.py +++ b/src/acp/bridge/ws_server_cli.py @@ -1,8 +1,8 @@ """CLI entry point for the ACP WebSocket server bridge. Usage: - python -m acp.bridge.ws_server_cli "uv run agentpool serve-acp" - python -m acp.bridge.ws_server_cli --port 8765 -- uv run agentpool serve-acp + python -m acp.bridge.ws_server_cli "uv run wolfharness serve-acp" + python -m acp.bridge.ws_server_cli --port 8765 -- uv run wolfharness serve-acp """ from __future__ import annotations @@ -21,8 +21,8 @@ def main() -> None: description="Bridge a stdio ACP agent to WebSocket transport.", epilog=( "Examples:\n" - ' acp-ws-server "uv run agentpool serve-acp"\n' - " acp-ws-server --port 8765 -- uv run agentpool serve-acp\n" + ' acp-ws-server "uv run wolfharness serve-acp"\n' + " acp-ws-server --port 8765 -- uv run wolfharness serve-acp\n" " acp-ws-server -H 0.0.0.0 -p 9000 -- uv run my-agent\n" ), formatter_class=argparse.RawTextHelpFormatter, diff --git a/src/acp/filesystem.py b/src/acp/filesystem.py index 342ca2132..c31b50cf5 100644 --- a/src/acp/filesystem.py +++ b/src/acp/filesystem.py @@ -13,7 +13,7 @@ from acp.agent.acp_requests import ACPRequests from acp.agent.notifications import ACPNotifications -from agentpool.mime_utils import guess_type, is_text_mime +from wolfharness.mime_utils import guess_type, is_text_mime if TYPE_CHECKING: diff --git a/src/agentpool/__init__.py b/src/agentpool/__init__.py index 6c1b44e10..43b573547 100644 --- a/src/agentpool/__init__.py +++ b/src/agentpool/__init__.py @@ -1,80 +1,56 @@ -"""AgentPool: main package. +"""agentpool — backward-compatible shim for wolfharness. -Pydantic-AI based Multi-Agent Framework with YAML-based Agents, Teams, Workflows & -Extended ACP / AGUI integration. +This package has been renamed to ``wolfharness``. Importing ``agentpool`` +is deprecated and will be removed in a future release. + +Submodule imports are forwarded to the corresponding ``wolfharness`` submodule. """ from __future__ import annotations -from importlib.metadata import version -from upathtools import register_http_filesystems - -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest - -# Builtin toolsets imports removed to avoid circular dependency -# Import them directly from agentpool_toolsets.builtin when needed -from agentpool.agents import Agent, AgentContext, ACPAgent -from agentpool.delegation import AgentPool, BaseTeam -from dotenv import load_dotenv -from agentpool.messaging.messages import ChatMessage -from agentpool.tools import Tool, ToolCallInfo -from agentpool.messaging.messagenode import MessageNode -from agentpool.testing import acp_test_session -from pydantic_ai import ( - AudioUrl, - BinaryContent, - BinaryImage, - DocumentUrl, - ImageUrl, - VideoUrl, +import importlib +import sys +import warnings +from importlib import abc, machinery + +from wolfharness import * # noqa: F403 + +warnings.warn( + "``agentpool`` has been renamed to ``wolfharness``. " + "Update your imports: `from wolfharness import ...`", + DeprecationWarning, + stacklevel=2, ) -__version__ = version("agentpool") -__title__ = "AgentPool" -__author__ = "Philipp Temminghoff" -__author_email__ = "philipptemminghoff@googlemail.com" -__copyright__ = "Copyright (c) 2025 Philipp Temminghoff" -__license__ = "MIT" -__url__ = "https://github.com/phil65/agentpool" - -load_dotenv() -register_http_filesystems() - -# Rebuild models with forward references that couldn't be resolved during -# module initialization due to circular import avoidance. -# PromptType and BasePrompt are imported under TYPE_CHECKING in -# agentpool_config.knowledge and agentpool_config.task to break a circular -# import chain. By this point, agentpool.prompts.prompts is fully loaded, -# so we can resolve the forward references. -from agentpool.prompts.prompts import BasePrompt, PromptType -from agentpool_config.knowledge import Knowledge -from agentpool_config.task import Job - -_ns = {"PromptType": PromptType, "BasePrompt": BasePrompt} -Knowledge.model_rebuild(_types_namespace=_ns) -Job.model_rebuild(_types_namespace=_ns) -NativeAgentConfig.model_rebuild(_types_namespace=_ns) -AgentsManifest.model_rebuild(_types_namespace=_ns) - -__all__ = [ - "ACPAgent", - "Agent", - "AgentContext", - "AgentPool", - "AgentsManifest", - "AudioUrl", - "BaseTeam", - "BinaryContent", - "BinaryImage", - "ChatMessage", - "DocumentUrl", - "ImageUrl", - "MessageNode", - "NativeAgentConfig", - "Tool", - "ToolCallInfo", - "VideoUrl", - "__version__", - "acp_test_session", -] + +def __getattr__(name: str) -> object: + """Forward top-level attribute access to wolfharness.""" + import wolfharness + + return getattr(wolfharness, name) + + +class _ShimFinder(abc.MetaPathFinder): + """Redirect agentpool.X submodule imports to wolfharness.X.""" + + _prefix = "agentpool." + _target = "wolfharness" + + def find_spec( + self, fullname: str, path: object = None, target: object = None + ) -> machinery.ModuleSpec | None: + if not fullname.startswith(self._prefix): + return None + + wolf_name = self._target + fullname[len(self._prefix) - 1 :] + try: + wolf_mod = importlib.import_module(wolf_name) + except ModuleNotFoundError: + return None + + sys.modules[fullname] = wolf_mod + return machinery.ModuleSpec(fullname, loader=None) + + +if not any(isinstance(f, _ShimFinder) for f in sys.meta_path): + sys.meta_path.insert(0, _ShimFinder()) diff --git a/src/agentpool/__main__.py b/src/agentpool/__main__.py deleted file mode 100644 index 65aa5fb74..000000000 --- a/src/agentpool/__main__.py +++ /dev/null @@ -1,7 +0,0 @@ -"""CLI entry point - forwards to agentpool_cli for faster startup.""" - -from agentpool_cli.__main__ import cli - - -if __name__ == "__main__": - cli() diff --git a/src/agentpool/agents/__init__.py b/src/agentpool/agents/__init__.py deleted file mode 100644 index ff06ed5ae..000000000 --- a/src/agentpool/agents/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -"""CLI commands for agentpool.""" - -from __future__ import annotations - -from agentpool.agents.native_agent import Agent -from agentpool.agents.acp_agent import ACPAgent -from agentpool.agents.events import ( - detailed_print_handler, - resolve_event_handlers, - simple_print_handler, -) -from agentpool.agents.context import AgentContext -from agentpool.agents.interactions import Interactions -from agentpool.agents.prompt_injection import PromptInjectionManager -from agentpool.agents.sys_prompts import SystemPrompts -from agentpool.agents.exceptions import DelegationDepthError, MAX_DELEGATION_DEPTH - - -__all__ = [ - "MAX_DELEGATION_DEPTH", - "ACPAgent", - "Agent", - "AgentContext", - "DelegationDepthError", - "Interactions", - "PromptInjectionManager", - "SystemPrompts", - "detailed_print_handler", - "resolve_event_handlers", - "simple_print_handler", -] diff --git a/src/agentpool/delegation/__init__.py b/src/agentpool/delegation/__init__.py deleted file mode 100644 index c9b3e9904..000000000 --- a/src/agentpool/delegation/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Agent delegation and collaboration functionality.""" - -from agentpool.delegation.pool import AgentPool -from agentpool.delegation.base_team import BaseTeam - -__all__ = ["AgentPool", "BaseTeam"] diff --git a/src/agentpool/hooks/__init__.py b/src/agentpool/hooks/__init__.py deleted file mode 100644 index 5a5418e26..000000000 --- a/src/agentpool/hooks/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Runtime hook classes for agent lifecycle events.""" - -from __future__ import annotations - -from agentpool.hooks.agent_hooks import AgentHooks -from agentpool.hooks.base import Hook, HookEvent, HookInput, HookResult -from agentpool.hooks.callable import CallableHook -from agentpool.hooks.command import CommandHook -from agentpool.hooks.prompt import PromptHook - -__all__ = [ - "AgentHooks", - "CallableHook", - "CommandHook", - "Hook", - "HookEvent", - "HookInput", - "HookResult", - "PromptHook", -] diff --git a/src/agentpool/mcp_server/__init__.py b/src/agentpool/mcp_server/__init__.py deleted file mode 100644 index 3f6b140ef..000000000 --- a/src/agentpool/mcp_server/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""MCP server integration for AgentPool.""" - -from agentpool.mcp_server.client import MCPClient -from agentpool.mcp_server.tool_bridge import ToolManagerBridge - -__all__ = ["MCPClient", "ToolManagerBridge"] diff --git a/src/agentpool/models/__init__.py b/src/agentpool/models/__init__.py deleted file mode 100644 index 60ea571cf..000000000 --- a/src/agentpool/models/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Core data models for AgentPool.""" - -from __future__ import annotations - -from agentpool.models.acp_agents import ACPAgentConfig, ACPAgentConfigTypes, BaseACPAgentConfig -from agentpool.models.agents import AnyToolConfig, NativeAgentConfig # noqa: F401 -from agentpool.models.manifest import AgentsManifest, AnyAgentConfig -from agentpool.models.pending_interaction import PendingPermission, PendingQuestion - - -__all__ = [ - "ACPAgentConfig", - "ACPAgentConfigTypes", - "AgentsManifest", - "AnyAgentConfig", - "BaseACPAgentConfig", - "NativeAgentConfig", - "PendingPermission", - "PendingQuestion", -] diff --git a/src/agentpool/running/__init__.py b/src/agentpool/running/__init__.py deleted file mode 100644 index 8aeaa908c..000000000 --- a/src/agentpool/running/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Decorator auto-injection / run package.""" - -from __future__ import annotations - -from agentpool.running.decorators import with_nodes -from agentpool.running.discovery import NodeFunction, node_function -from agentpool.running.executor import execute_single, execute_functions -from agentpool.running.run_nodes import run_nodes_async, run_nodes -from agentpool.running.injection import NodeInjectionError - -__all__ = [ - "NodeFunction", - "NodeInjectionError", - "execute_functions", - "execute_single", - "node_function", - "run_nodes", - "run_nodes_async", - "with_nodes", -] diff --git a/src/agentpool/skills/__init__.py b/src/agentpool/skills/__init__.py deleted file mode 100644 index 1ca591654..000000000 --- a/src/agentpool/skills/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Skills package for Claude Code Skills support.""" - -from agentpool.skills.manager import SkillsManager -from agentpool.skills.skill import Skill, to_prompt - -__all__ = ["Skill", "SkillsManager", "to_prompt"] diff --git a/src/agentpool/talk/__init__.py b/src/agentpool/talk/__init__.py deleted file mode 100644 index 35467fe95..000000000 --- a/src/agentpool/talk/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Talk classes.""" - -from agentpool.talk.stats import TalkStats, AggregatedTalkStats -from agentpool.talk.talk import Talk, TeamTalk -from agentpool.talk.registry import ConnectionRegistry - -__all__ = [ - "AggregatedTalkStats", - "ConnectionRegistry", - "Talk", - "TalkStats", - "TeamTalk", -] diff --git a/src/agentpool_bot/__init__.py b/src/agentpool_bot/__init__.py index c18221138..27ae64ed1 100644 --- a/src/agentpool_bot/__init__.py +++ b/src/agentpool_bot/__init__.py @@ -1,3 +1,56 @@ -"""agentpool_bot - Chat channel integrations for agentpool.""" +"""agentpool_bot — backward-compatible shim for wolfharness_bot. + +This package has been renamed to ``wolfharness_bot``. Importing ``agentpool_bot`` +is deprecated and will be removed in a future release. + +Submodule imports are forwarded to the corresponding ``wolfharness_bot`` submodule. +""" from __future__ import annotations + +import importlib +import sys +import warnings +from importlib import abc, machinery + +from wolfharness_bot import * # noqa: F403 + +warnings.warn( + "``agentpool_bot`` has been renamed to ``wolfharness_bot``. " + "Update your imports: `from wolfharness_bot import ...`", + DeprecationWarning, + stacklevel=2, +) + + +def __getattr__(name: str) -> object: + """Forward top-level attribute access to wolfharness_bot.""" + import wolfharness_bot + + return getattr(wolfharness_bot, name) + + +class _ShimFinder(abc.MetaPathFinder): + """Redirect agentpool_bot.X submodule imports to wolfharness_bot.X.""" + + _prefix = "agentpool_bot." + _target = "wolfharness_bot" + + def find_spec( + self, fullname: str, path: object = None, target: object = None + ) -> machinery.ModuleSpec | None: + if not fullname.startswith(self._prefix): + return None + + wolf_name = self._target + fullname[len(self._prefix) - 1 :] + try: + wolf_mod = importlib.import_module(wolf_name) + except ModuleNotFoundError: + return None + + sys.modules[fullname] = wolf_mod + return machinery.ModuleSpec(fullname, loader=None) + + +if not any(isinstance(f, _ShimFinder) for f in sys.meta_path): + sys.meta_path.insert(0, _ShimFinder()) diff --git a/src/agentpool_cli/__init__.py b/src/agentpool_cli/__init__.py index 71ffb0e98..37c8f9998 100644 --- a/src/agentpool_cli/__init__.py +++ b/src/agentpool_cli/__init__.py @@ -1,34 +1,56 @@ -"""CLI commands for agentpool.""" +"""agentpool_cli — backward-compatible shim for wolfharness_cli. + +This package has been renamed to ``wolfharness_cli``. Importing ``agentpool_cli`` +is deprecated and will be removed in a future release. + +Submodule imports are forwarded to the corresponding ``wolfharness_cli`` submodule. +""" from __future__ import annotations -from agentpool_cli.store import ConfigStore +import importlib +import sys +import warnings +from importlib import abc, machinery + +from wolfharness_cli import * # noqa: F403 + +warnings.warn( + "``agentpool_cli`` has been renamed to ``wolfharness_cli``. " + "Update your imports: `from wolfharness_cli import ...`", + DeprecationWarning, + stacklevel=2, +) + + +def __getattr__(name: str) -> object: + """Forward top-level attribute access to wolfharness_cli.""" + import wolfharness_cli + return getattr(wolfharness_cli, name) -agent_store = ConfigStore("agents.json") +class _ShimFinder(abc.MetaPathFinder): + """Redirect agentpool_cli.X submodule imports to wolfharness_cli.X.""" -def resolve_agent_config(config: str | None) -> str: - """Resolve agent configuration path from name or direct path. + _prefix = "agentpool_cli." + _target = "wolfharness_cli" - Args: - config: Configuration name or path. If None, uses active config. + def find_spec( + self, fullname: str, path: object = None, target: object = None + ) -> machinery.ModuleSpec | None: + if not fullname.startswith(self._prefix): + return None - Returns: - Resolved configuration path + wolf_name = self._target + fullname[len(self._prefix) - 1 :] + try: + wolf_mod = importlib.import_module(wolf_name) + except ModuleNotFoundError: + return None - Raises: - ValueError: If no configuration is found or no active config is set - """ - if not config: - if active := agent_store.get_active(): - return active.path + sys.modules[fullname] = wolf_mod + return machinery.ModuleSpec(fullname, loader=None) - raise ValueError("No active agent configuration set. Use 'agents set' to set one.") - try: - # First try as stored config name - return agent_store.get_config(config) - except KeyError: - # If not found, treat as direct path - return config +if not any(isinstance(f, _ShimFinder) for f in sys.meta_path): + sys.meta_path.insert(0, _ShimFinder()) diff --git a/src/agentpool_commands/__init__.py b/src/agentpool_commands/__init__.py index de56505b3..e17d1424b 100644 --- a/src/agentpool_commands/__init__.py +++ b/src/agentpool_commands/__init__.py @@ -1,192 +1,56 @@ -"""Built-in commands for AgentPool.""" +"""agentpool_commands — backward-compatible shim for wolfharness_commands. + +This package has been renamed to ``wolfharness_commands``. Importing ``agentpool_commands`` +is deprecated and will be removed in a future release. + +Submodule imports are forwarded to the corresponding ``wolfharness_commands`` submodule. +""" from __future__ import annotations -from agentpool_commands.agents import ( - CreateAgentCommand, - CreateTeamCommand, - ListAgentsCommand, - ShowAgentCommand, - # SwitchAgentCommand, -) -from agentpool_commands.connections import ( - ConnectCommand, - DisconnectCommand, - ListConnectionsCommand, - DisconnectAllCommand, -) -from agentpool_commands.history import SearchHistoryCommand -from agentpool_commands.mcp import ( - AddMCPServerCommand, - AddRemoteMCPServerCommand, - ListMCPServersCommand, -) -from agentpool_commands.models import SetModelCommand -from agentpool_commands.prompts import ListPromptsCommand, ShowPromptCommand -from agentpool_commands.resources import ( - ListResourcesCommand, - ShowResourceCommand, - AddResourceCommand, -) -from agentpool_commands.session import ClearCommand, ResetCommand -from agentpool_commands.read import ReadCommand -from agentpool_commands.tools import ( - DisableToolCommand, - EnableToolCommand, - ListToolsCommand, - RegisterCodeToolCommand, - RegisterToolCommand, - ShowToolCommand, -) -from agentpool_commands.workers import AddWorkerCommand, RemoveWorkerCommand, ListWorkersCommand -from agentpool_commands.utils import ( - CopyClipboardCommand, - EditAgentFileCommand, - GetLogsCommand, - ShareHistoryCommand, +import importlib +import sys +import warnings +from importlib import abc, machinery + +from wolfharness_commands import * # noqa: F403 + +warnings.warn( + "``agentpool_commands`` has been renamed to ``wolfharness_commands``. " + "Update your imports: `from wolfharness_commands import ...`", + DeprecationWarning, + stacklevel=2, ) -from agentpool_commands.pool import ListPoolsCommand, SpawnCommand - -# CompactCommand is only for Native Agent (has its own history) -# Other agents (ClaudeCode, ACP, AGUI) don't control their own history -from agentpool_commands.pool import CompactCommand # noqa: F401 -from typing import TYPE_CHECKING, Any - -if TYPE_CHECKING: - from collections.abc import Sequence - - from slashed import BaseCommand - - -def get_agent_commands(**kwargs: Any) -> Sequence[BaseCommand]: - """Get commands that operate primarily on a single agent.""" - command_map = { - "enable_clear": ClearCommand(), - "enable_reset": ResetCommand(), - "enable_copy_clipboard": CopyClipboardCommand(), - "enable_share_history": ShareHistoryCommand(), - "enable_set_model": SetModelCommand(), - "enable_list_tools": ListToolsCommand(), - "enable_show_tool": ShowToolCommand(), - "enable_enable_tool": EnableToolCommand(), - "enable_disable_tool": DisableToolCommand(), - "enable_register_tool": RegisterToolCommand(), - "enable_register_code_tool": RegisterCodeToolCommand(), - "enable_list_resources": ListResourcesCommand(), - "enable_show_resource": ShowResourceCommand(), - "enable_add_resource": AddResourceCommand(), - "enable_list_prompts": ListPromptsCommand(), - "enable_show_prompt": ShowPromptCommand(), - "enable_add_worker": AddWorkerCommand(), - "enable_remove_worker": RemoveWorkerCommand(), - "enable_list_workers": ListWorkersCommand(), - "enable_connect": ConnectCommand(), - "enable_disconnect": DisconnectCommand(), - "enable_list_connections": ListConnectionsCommand(), - "enable_disconnect_all": DisconnectAllCommand(), - "enable_read": ReadCommand(), - "enable_add_mcp_server": AddMCPServerCommand(), - "enable_add_remote_mcp_server": AddRemoteMCPServerCommand(), - "enable_list_mcp_servers": ListMCPServersCommand(), - "enable_search_history": SearchHistoryCommand(), - "enable_get_logs": GetLogsCommand(), - } - return [command for flag, command in command_map.items() if kwargs.get(flag, True)] - - -def get_pool_commands(**kwargs: Any) -> Sequence[BaseCommand]: - """Get commands that operate on multiple agents or the pool itself.""" - command_map = { - "enable_create_agent": CreateAgentCommand(), - "enable_create_team": CreateTeamCommand(), - "enable_list_agents": ListAgentsCommand(), - "enable_show_agent": ShowAgentCommand(), - "enable_edit_agent_file": EditAgentFileCommand(), - "enable_list_pools": ListPoolsCommand(), - "enable_spawn": SpawnCommand(), - } - return [command for flag, command in command_map.items() if kwargs.get(flag, True)] - - -def get_commands( - *, - enable_clear: bool = True, - enable_reset: bool = True, - enable_copy_clipboard: bool = True, - enable_share_history: bool = True, - enable_set_model: bool = True, - enable_list_tools: bool = True, - enable_show_tool: bool = True, - enable_enable_tool: bool = True, - enable_disable_tool: bool = True, - enable_register_tool: bool = True, - enable_register_code_tool: bool = True, - enable_list_resources: bool = True, - enable_show_resource: bool = True, - enable_add_resource: bool = True, - enable_list_prompts: bool = True, - enable_show_prompt: bool = True, - enable_add_worker: bool = True, - enable_remove_worker: bool = True, - enable_list_workers: bool = True, - enable_connect: bool = True, - enable_disconnect: bool = True, - enable_list_connections: bool = True, - enable_disconnect_all: bool = True, - enable_read: bool = True, - enable_add_mcp_server: bool = True, - enable_add_remote_mcp_server: bool = True, - enable_list_mcp_servers: bool = True, - enable_search_history: bool = True, - enable_get_logs: bool = True, - enable_create_agent: bool = True, - enable_create_team: bool = True, - enable_list_agents: bool = True, - enable_show_agent: bool = True, - enable_edit_agent_file: bool = True, - enable_list_pools: bool = True, - enable_spawn: bool = True, -) -> list[BaseCommand]: - """Get all built-in commands.""" - agent_kwargs = { - "enable_clear": enable_clear, - "enable_reset": enable_reset, - "enable_copy_clipboard": enable_copy_clipboard, - "enable_share_history": enable_share_history, - "enable_set_model": enable_set_model, - "enable_list_tools": enable_list_tools, - "enable_show_tool": enable_show_tool, - "enable_enable_tool": enable_enable_tool, - "enable_disable_tool": enable_disable_tool, - "enable_register_tool": enable_register_tool, - "enable_register_code_tool": enable_register_code_tool, - "enable_list_resources": enable_list_resources, - "enable_show_resource": enable_show_resource, - "enable_add_resource": enable_add_resource, - "enable_list_prompts": enable_list_prompts, - "enable_show_prompt": enable_show_prompt, - "enable_add_worker": enable_add_worker, - "enable_remove_worker": enable_remove_worker, - "enable_list_workers": enable_list_workers, - "enable_connect": enable_connect, - "enable_disconnect": enable_disconnect, - "enable_list_connections": enable_list_connections, - "enable_disconnect_all": enable_disconnect_all, - "enable_read": enable_read, - "enable_add_mcp_server": enable_add_mcp_server, - "enable_add_remote_mcp_server": enable_add_remote_mcp_server, - "enable_list_mcp_servers": enable_list_mcp_servers, - "enable_search_history": enable_search_history, - "enable_get_logs": enable_get_logs, - } - pool_kwargs = { - "enable_create_agent": enable_create_agent, - "enable_create_team": enable_create_team, - "enable_list_agents": enable_list_agents, - "enable_show_agent": enable_show_agent, - "enable_edit_agent_file": enable_edit_agent_file, - "enable_list_pools": enable_list_pools, - "enable_spawn": enable_spawn, - } - - return [*get_agent_commands(**agent_kwargs), *get_pool_commands(**pool_kwargs)] + + +def __getattr__(name: str) -> object: + """Forward top-level attribute access to wolfharness_commands.""" + import wolfharness_commands + + return getattr(wolfharness_commands, name) + + +class _ShimFinder(abc.MetaPathFinder): + """Redirect agentpool_commands.X submodule imports to wolfharness_commands.X.""" + + _prefix = "agentpool_commands." + _target = "wolfharness_commands" + + def find_spec( + self, fullname: str, path: object = None, target: object = None + ) -> machinery.ModuleSpec | None: + if not fullname.startswith(self._prefix): + return None + + wolf_name = self._target + fullname[len(self._prefix) - 1 :] + try: + wolf_mod = importlib.import_module(wolf_name) + except ModuleNotFoundError: + return None + + sys.modules[fullname] = wolf_mod + return machinery.ModuleSpec(fullname, loader=None) + + +if not any(isinstance(f, _ShimFinder) for f in sys.meta_path): + sys.meta_path.insert(0, _ShimFinder()) diff --git a/src/agentpool_commands/base.py b/src/agentpool_commands/base.py deleted file mode 100644 index ea82abdea..000000000 --- a/src/agentpool_commands/base.py +++ /dev/null @@ -1,12 +0,0 @@ -"""Base command class with node-type filtering support. - -Re-exports from ``agentpool.commands.base`` for backward compatibility. -New code should import from ``agentpool.commands.base`` directly. -""" - -from __future__ import annotations - -from agentpool.commands.base import AgentCommand, NodeCommand - - -__all__ = ["AgentCommand", "NodeCommand"] diff --git a/src/agentpool_config/__init__.py b/src/agentpool_config/__init__.py index fc490b167..f88aee81f 100644 --- a/src/agentpool_config/__init__.py +++ b/src/agentpool_config/__init__.py @@ -1,137 +1,56 @@ -"""Core data models for AgentPool.""" +"""agentpool_config — backward-compatible shim for wolfharness_config. + +This package has been renamed to ``wolfharness_config``. Importing ``agentpool_config`` +is deprecated and will be removed in a future release. + +Submodule imports are forwarded to the corresponding ``wolfharness_config`` submodule. +""" from __future__ import annotations +import importlib +import sys +import warnings +from importlib import abc, machinery -from typing import Annotated -from pydantic import Field - -from agentpool_config.tools import ImportToolConfig, BaseToolConfig -from agentpool_config.agentpool_tools import AgentpoolToolConfig -from agentpool_config.builtin_tools import BuiltinToolConfig - -from agentpool_config.capabilities import CapabilityConfig -from agentpool_config.forward_targets import ForwardingTarget -from agentpool_config.session import SessionQuery -from agentpool_config.session_pool import ACPConfig, OpenCodeConfig, SessionPoolConfig -from agentpool_config.teams import TeamConfig, TeamMemberConfig -from agentpool_config.durable import CheckpointConfig, DeferredToolConfig -from agentpool_config.mcp_server import ( - BaseMCPServerConfig, - StdioMCPServerConfig, - StreamableHTTPMCPServerConfig, - MCPServerConfig, - SSEMCPServerConfig, -) -from agentpool_config.event_handlers import ( - BaseEventHandlerConfig, - StdoutEventHandlerConfig, - CallbackEventHandlerConfig, - EventHandlerConfig, - resolve_handler_configs, -) -from agentpool_config.hooks import ( - BaseHookConfig, - CallableHookConfig, - CommandHookConfig, - HookConfig, - HooksConfig, - PromptHookConfig, -) -from agentpool_config.graph_config import ( - GraphConfig, - GraphEdgeConfig, - GraphJoinConfig, - GraphStepConfig, -) -from agentpool_config.graph_translation import ( - build_steps_from_agents, - translate_config_to_graph, - translate_connections_to_edges, - translate_team_to_graph, - translate_teams_to_graphs, -) -from agentpool_config.toolsets import ToolsetConfig -from agentpool_config.skills import SkillsConfig, DEFAULT_SKILLS_PATHS -from agentpool_config.skill_commands import SkillSlashConfig, SkillCommandConfig -from agentpool_config.resolution import ( - ConfigLayer, - ConfigSource, - ResolvedConfig, - find_project_config, - get_global_config_dir, - get_global_config_path, - resolve_config, - resolve_config_for_server, +from wolfharness_config import * # noqa: F403 + +warnings.warn( + "``agentpool_config`` has been renamed to ``wolfharness_config``. " + "Update your imports: `from wolfharness_config import ...`", + DeprecationWarning, + stacklevel=2, ) -ToolConfig = Annotated[ - ImportToolConfig | AgentpoolToolConfig, - Field(discriminator="type"), -] - -NativeAgentToolConfig = Annotated[ - ToolConfig | BuiltinToolConfig, - Field(discriminator="type"), -] - -# Unified type for all tool configurations (single tools + toolsets) -AnyToolConfig = Annotated[ - NativeAgentToolConfig | ToolsetConfig, - Field(discriminator="type"), -] -__all__ = [ - "DEFAULT_SKILLS_PATHS", - "ACPConfig", - "AnyToolConfig", - "BaseEventHandlerConfig", - "BaseHookConfig", - "BaseMCPServerConfig", - "BaseToolConfig", - "CallableHookConfig", - "CallbackEventHandlerConfig", - "CapabilityConfig", - "CheckpointConfig", - "CommandHookConfig", - "ConfigLayer", - "ConfigSource", - "DeferredToolConfig", - "EventHandlerConfig", - "ForwardingTarget", - "GraphConfig", - "GraphEdgeConfig", - "GraphJoinConfig", - "GraphStepConfig", - "HookConfig", - "HooksConfig", - "MCPServerConfig", - "NativeAgentToolConfig", - "OpenCodeConfig", - "PromptHookConfig", - "ResolvedConfig", - "SSEMCPServerConfig", - "SessionPoolConfig", - "SessionQuery", - "SkillCommandConfig", - "SkillSlashConfig", - "SkillsConfig", - "StdioMCPServerConfig", - "StdoutEventHandlerConfig", - "StreamableHTTPMCPServerConfig", - "TeamConfig", - "TeamMemberConfig", - "ToolConfig", - "ToolsetConfig", - "build_steps_from_agents", - "find_project_config", - "get_global_config_dir", - "get_global_config_path", - "resolve_config", - "resolve_config_for_server", - "resolve_handler_configs", - "translate_config_to_graph", - "translate_connections_to_edges", - "translate_team_to_graph", - "translate_teams_to_graphs", -] +def __getattr__(name: str) -> object: + """Forward top-level attribute access to wolfharness_config.""" + import wolfharness_config + + return getattr(wolfharness_config, name) + + +class _ShimFinder(abc.MetaPathFinder): + """Redirect agentpool_config.X submodule imports to wolfharness_config.X.""" + + _prefix = "agentpool_config." + _target = "wolfharness_config" + + def find_spec( + self, fullname: str, path: object = None, target: object = None + ) -> machinery.ModuleSpec | None: + if not fullname.startswith(self._prefix): + return None + + wolf_name = self._target + fullname[len(self._prefix) - 1 :] + try: + wolf_mod = importlib.import_module(wolf_name) + except ModuleNotFoundError: + return None + + sys.modules[fullname] = wolf_mod + return machinery.ModuleSpec(fullname, loader=None) + + +if not any(isinstance(f, _ShimFinder) for f in sys.meta_path): + sys.meta_path.insert(0, _ShimFinder()) diff --git a/src/agentpool_prompts/__init__.py b/src/agentpool_prompts/__init__.py index 61cbd8fcf..6a8be8ec3 100644 --- a/src/agentpool_prompts/__init__.py +++ b/src/agentpool_prompts/__init__.py @@ -1 +1,56 @@ -"""Prompts package.""" +"""agentpool_prompts — backward-compatible shim for wolfharness_prompts. + +This package has been renamed to ``wolfharness_prompts``. Importing ``agentpool_prompts`` +is deprecated and will be removed in a future release. + +Submodule imports are forwarded to the corresponding ``wolfharness_prompts`` submodule. +""" + +from __future__ import annotations + +import importlib +import sys +import warnings +from importlib import abc, machinery + +from wolfharness_prompts import * # noqa: F403 + +warnings.warn( + "``agentpool_prompts`` has been renamed to ``wolfharness_prompts``. " + "Update your imports: `from wolfharness_prompts import ...`", + DeprecationWarning, + stacklevel=2, +) + + +def __getattr__(name: str) -> object: + """Forward top-level attribute access to wolfharness_prompts.""" + import wolfharness_prompts + + return getattr(wolfharness_prompts, name) + + +class _ShimFinder(abc.MetaPathFinder): + """Redirect agentpool_prompts.X submodule imports to wolfharness_prompts.X.""" + + _prefix = "agentpool_prompts." + _target = "wolfharness_prompts" + + def find_spec( + self, fullname: str, path: object = None, target: object = None + ) -> machinery.ModuleSpec | None: + if not fullname.startswith(self._prefix): + return None + + wolf_name = self._target + fullname[len(self._prefix) - 1 :] + try: + wolf_mod = importlib.import_module(wolf_name) + except ModuleNotFoundError: + return None + + sys.modules[fullname] = wolf_mod + return machinery.ModuleSpec(fullname, loader=None) + + +if not any(isinstance(f, _ShimFinder) for f in sys.meta_path): + sys.meta_path.insert(0, _ShimFinder()) diff --git a/src/agentpool_server/__init__.py b/src/agentpool_server/__init__.py index 1c58d53fa..c92921705 100644 --- a/src/agentpool_server/__init__.py +++ b/src/agentpool_server/__init__.py @@ -1,9 +1,56 @@ -"""AgentPool Server implementations.""" +"""agentpool_server — backward-compatible shim for wolfharness_server. -from agentpool_server.a2a_server import A2AServer -from agentpool_server.aggregating_server import AggregatingServer -from agentpool_server.agui_server import AGUIServer -from agentpool_server.base import BaseServer -from agentpool_server.http_server import HTTPServer +This package has been renamed to ``wolfharness_server``. Importing ``agentpool_server`` +is deprecated and will be removed in a future release. -__all__ = ["A2AServer", "AGUIServer", "AggregatingServer", "BaseServer", "HTTPServer"] +Submodule imports are forwarded to the corresponding ``wolfharness_server`` submodule. +""" + +from __future__ import annotations + +import importlib +import sys +import warnings +from importlib import abc, machinery + +from wolfharness_server import * # noqa: F403 + +warnings.warn( + "``agentpool_server`` has been renamed to ``wolfharness_server``. " + "Update your imports: `from wolfharness_server import ...`", + DeprecationWarning, + stacklevel=2, +) + + +def __getattr__(name: str) -> object: + """Forward top-level attribute access to wolfharness_server.""" + import wolfharness_server + + return getattr(wolfharness_server, name) + + +class _ShimFinder(abc.MetaPathFinder): + """Redirect agentpool_server.X submodule imports to wolfharness_server.X.""" + + _prefix = "agentpool_server." + _target = "wolfharness_server" + + def find_spec( + self, fullname: str, path: object = None, target: object = None + ) -> machinery.ModuleSpec | None: + if not fullname.startswith(self._prefix): + return None + + wolf_name = self._target + fullname[len(self._prefix) - 1 :] + try: + wolf_mod = importlib.import_module(wolf_name) + except ModuleNotFoundError: + return None + + sys.modules[fullname] = wolf_mod + return machinery.ModuleSpec(fullname, loader=None) + + +if not any(isinstance(f, _ShimFinder) for f in sys.meta_path): + sys.meta_path.insert(0, _ShimFinder()) diff --git a/src/agentpool_server/acp_server/__init__.py b/src/agentpool_server/acp_server/__init__.py deleted file mode 100644 index 77f23a92e..000000000 --- a/src/agentpool_server/acp_server/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -"""ACP (Agent Client Protocol) integration for agentpool.""" - -from __future__ import annotations - -from agentpool_server.acp_server.handler import ACPProtocolHandler -from agentpool_server.acp_server.server import ACPServer -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent -from agentpool_server.acp_server.session import ACPSession -from agentpool_server.acp_server.session_manager import ACPSessionManager -from agentpool_server.acp_server.converters import ( - convert_acp_mcp_server_to_config, - from_acp_content, -) - - -__all__ = [ - "ACPProtocolHandler", - "ACPServer", - "ACPSession", - "ACPSessionManager", - "AgentPoolACPAgent", - "convert_acp_mcp_server_to_config", - "from_acp_content", -] diff --git a/src/agentpool_server/opencode_server/routes/__init__.py b/src/agentpool_server/opencode_server/routes/__init__.py deleted file mode 100644 index 79a03fb47..000000000 --- a/src/agentpool_server/opencode_server/routes/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -"""Route handlers for the OpenCode API.""" - -from agentpool_server.opencode_server.routes.global_routes import router as global_router -from agentpool_server.opencode_server.routes.app_routes import router as app_router -from agentpool_server.opencode_server.routes.config_routes import router as config_router -from agentpool_server.opencode_server.routes.session_routes import router as session_router -from agentpool_server.opencode_server.routes.message_routes import router as message_router -from agentpool_server.opencode_server.routes.file_routes import router as file_router -from agentpool_server.opencode_server.routes.agent_routes import router as agent_router -from agentpool_server.opencode_server.routes.permission_routes import router as permission_router -from agentpool_server.opencode_server.routes.question_routes import router as question_router -from agentpool_server.opencode_server.routes.pty_routes import router as pty_router -from agentpool_server.opencode_server.routes.tui_routes import router as tui_router -from agentpool_server.opencode_server.routes.lsp_routes import router as lsp_router - -__all__ = [ - "agent_router", - "app_router", - "config_router", - "file_router", - "global_router", - "lsp_router", - "message_router", - "permission_router", - "pty_router", - "question_router", - "session_router", - "tui_router", -] diff --git a/src/agentpool_storage/__init__.py b/src/agentpool_storage/__init__.py index 9cfc526bb..f6d777a7e 100644 --- a/src/agentpool_storage/__init__.py +++ b/src/agentpool_storage/__init__.py @@ -1,37 +1,56 @@ -"""Storage provider package.""" - -from agentpool_storage.adapter import StorageProviderAdapter -from agentpool_storage.base import StorageProvider -from agentpool_storage.project_store import ( - ProjectStore, - detect_project_root, - discover_config_path, - generate_project_id, - resolve_config, -) -from agentpool_storage.protocols import ( - CheckpointStore, - CommandLog, - MessagePersistence, - ProjectStoreProtocol, - SessionMetadata, - SessionPersistence, - StatsAggregator, +"""agentpool_storage — backward-compatible shim for wolfharness_storage. + +This package has been renamed to ``wolfharness_storage``. Importing ``agentpool_storage`` +is deprecated and will be removed in a future release. + +Submodule imports are forwarded to the corresponding ``wolfharness_storage`` submodule. +""" + +from __future__ import annotations + +import importlib +import sys +import warnings +from importlib import abc, machinery + +from wolfharness_storage import * # noqa: F403 + +warnings.warn( + "``agentpool_storage`` has been renamed to ``wolfharness_storage``. " + "Update your imports: `from wolfharness_storage import ...`", + DeprecationWarning, + stacklevel=2, ) -__all__ = [ - "CheckpointStore", - "CommandLog", - "MessagePersistence", - "ProjectStore", - "ProjectStoreProtocol", - "SessionMetadata", - "SessionPersistence", - "StatsAggregator", - "StorageProvider", - "StorageProviderAdapter", - "detect_project_root", - "discover_config_path", - "generate_project_id", - "resolve_config", -] + +def __getattr__(name: str) -> object: + """Forward top-level attribute access to wolfharness_storage.""" + import wolfharness_storage + + return getattr(wolfharness_storage, name) + + +class _ShimFinder(abc.MetaPathFinder): + """Redirect agentpool_storage.X submodule imports to wolfharness_storage.X.""" + + _prefix = "agentpool_storage." + _target = "wolfharness_storage" + + def find_spec( + self, fullname: str, path: object = None, target: object = None + ) -> machinery.ModuleSpec | None: + if not fullname.startswith(self._prefix): + return None + + wolf_name = self._target + fullname[len(self._prefix) - 1 :] + try: + wolf_mod = importlib.import_module(wolf_name) + except ModuleNotFoundError: + return None + + sys.modules[fullname] = wolf_mod + return machinery.ModuleSpec(fullname, loader=None) + + +if not any(isinstance(f, _ShimFinder) for f in sys.meta_path): + sys.meta_path.insert(0, _ShimFinder()) diff --git a/src/agentpool_storage/file_provider/__init__.py b/src/agentpool_storage/file_provider/__init__.py deleted file mode 100644 index 918417b94..000000000 --- a/src/agentpool_storage/file_provider/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -"""File provider for agentpool.""" - -from __future__ import annotations - -from agentpool_storage.file_provider.provider import FileProvider - -__all__ = ["FileProvider"] diff --git a/src/agentpool_storage/memory_provider/__init__.py b/src/agentpool_storage/memory_provider/__init__.py deleted file mode 100644 index 2fe4671d1..000000000 --- a/src/agentpool_storage/memory_provider/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -"""Memory provider for agentpool.""" - -from __future__ import annotations - -from agentpool_storage.memory_provider.provider import MemoryStorageProvider - -__all__ = ["MemoryStorageProvider"] diff --git a/src/agentpool_sync/__init__.py b/src/agentpool_sync/__init__.py index 645edc04f..e5b037eff 100644 --- a/src/agentpool_sync/__init__.py +++ b/src/agentpool_sync/__init__.py @@ -1,73 +1,56 @@ -"""File sync system for tracking dependencies and triggering reconciliation. - -This module provides a system for: -- Defining file dependencies via in-file metadata - (PEP723-style for Python, frontmatter for Markdown) -- Tracking changes via git -- Tracking external URL resources -- Tracking Python package version changes -- Triggering LLM-powered reconciliation when dependencies change +"""agentpool_sync — backward-compatible shim for wolfharness_sync. + +This package has been renamed to ``wolfharness_sync``. Importing ``agentpool_sync`` +is deprecated and will be removed in a future release. + +Submodule imports are forwarded to the corresponding ``wolfharness_sync`` submodule. """ from __future__ import annotations -from agentpool_sync.config import ( - FileSyncConfig, - PackageSyncConfig, - SyncConfig, - UrlSyncConfig, -) -from agentpool_sync.git import GitError, GitRepo -from agentpool_sync.handlers import AgentReconciler, LoggingHandler -from agentpool_sync.manager import InitMode, SyncManager -from agentpool_sync.models import FileChange, SyncMetadata, UrlChange -from agentpool_sync.packages import ( - PackageChange, - PackageRegistry, - PackageState, - is_significant_bump, -) -from agentpool_sync.parsers import ( - BUILTIN_PARSERS, - MarkdownSyncParser, - MetadataParser, - PythonSyncParser, - get_parser_for_file, +import importlib +import sys +import warnings +from importlib import abc, machinery + +from wolfharness_sync import * # noqa: F403 + +warnings.warn( + "``agentpool_sync`` has been renamed to ``wolfharness_sync``. " + "Update your imports: `from wolfharness_sync import ...`", + DeprecationWarning, + stacklevel=2, ) -from agentpool_sync.resources import ResourceChange, ResourceRegistry, ResourceState - -__all__ = [ - # Parsers - "BUILTIN_PARSERS", - # Handlers - "AgentReconciler", - # Models - "FileChange", - # Config - "FileSyncConfig", - # Git - "GitError", - "GitRepo", - # Core - "InitMode", - "LoggingHandler", - "MarkdownSyncParser", - "MetadataParser", - # Packages - "PackageChange", - "PackageRegistry", - "PackageState", - "PackageSyncConfig", - "PythonSyncParser", - # Resources - "ResourceChange", - "ResourceRegistry", - "ResourceState", - "SyncConfig", - "SyncManager", - "SyncMetadata", - "UrlChange", - "UrlSyncConfig", - "get_parser_for_file", - "is_significant_bump", -] + + +def __getattr__(name: str) -> object: + """Forward top-level attribute access to wolfharness_sync.""" + import wolfharness_sync + + return getattr(wolfharness_sync, name) + + +class _ShimFinder(abc.MetaPathFinder): + """Redirect agentpool_sync.X submodule imports to wolfharness_sync.X.""" + + _prefix = "agentpool_sync." + _target = "wolfharness_sync" + + def find_spec( + self, fullname: str, path: object = None, target: object = None + ) -> machinery.ModuleSpec | None: + if not fullname.startswith(self._prefix): + return None + + wolf_name = self._target + fullname[len(self._prefix) - 1 :] + try: + wolf_mod = importlib.import_module(wolf_name) + except ModuleNotFoundError: + return None + + sys.modules[fullname] = wolf_mod + return machinery.ModuleSpec(fullname, loader=None) + + +if not any(isinstance(f, _ShimFinder) for f in sys.meta_path): + sys.meta_path.insert(0, _ShimFinder()) diff --git a/src/agentpool_toolsets/__init__.py b/src/agentpool_toolsets/__init__.py index 50fcdb6f1..837eb1137 100644 --- a/src/agentpool_toolsets/__init__.py +++ b/src/agentpool_toolsets/__init__.py @@ -1,13 +1,56 @@ -"""Toolsets package.""" - -from agentpool_toolsets.config_creation import ConfigCreationTools -from agentpool_toolsets.fsspec_toolset import FSSpecTools -from agentpool_toolsets.notifications import NotificationsTools -from agentpool_toolsets.vfs_toolset import VFSTools - -__all__ = [ - "ConfigCreationTools", - "FSSpecTools", - "NotificationsTools", - "VFSTools", -] +"""agentpool_toolsets — backward-compatible shim for wolfharness_toolsets. + +This package has been renamed to ``wolfharness_toolsets``. Importing ``agentpool_toolsets`` +is deprecated and will be removed in a future release. + +Submodule imports are forwarded to the corresponding ``wolfharness_toolsets`` submodule. +""" + +from __future__ import annotations + +import importlib +import sys +import warnings +from importlib import abc, machinery + +from wolfharness_toolsets import * # noqa: F403 + +warnings.warn( + "``agentpool_toolsets`` has been renamed to ``wolfharness_toolsets``. " + "Update your imports: `from wolfharness_toolsets import ...`", + DeprecationWarning, + stacklevel=2, +) + + +def __getattr__(name: str) -> object: + """Forward top-level attribute access to wolfharness_toolsets.""" + import wolfharness_toolsets + + return getattr(wolfharness_toolsets, name) + + +class _ShimFinder(abc.MetaPathFinder): + """Redirect agentpool_toolsets.X submodule imports to wolfharness_toolsets.X.""" + + _prefix = "agentpool_toolsets." + _target = "wolfharness_toolsets" + + def find_spec( + self, fullname: str, path: object = None, target: object = None + ) -> machinery.ModuleSpec | None: + if not fullname.startswith(self._prefix): + return None + + wolf_name = self._target + fullname[len(self._prefix) - 1 :] + try: + wolf_mod = importlib.import_module(wolf_name) + except ModuleNotFoundError: + return None + + sys.modules[fullname] = wolf_mod + return machinery.ModuleSpec(fullname, loader=None) + + +if not any(isinstance(f, _ShimFinder) for f in sys.meta_path): + sys.meta_path.insert(0, _ShimFinder()) diff --git a/src/agentpool_toolsets/builtin/__init__.py b/src/agentpool_toolsets/builtin/__init__.py deleted file mode 100644 index 7abda0f05..000000000 --- a/src/agentpool_toolsets/builtin/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Built-in toolsets for agent capabilities.""" - -from __future__ import annotations - - -# Import provider classes -from agentpool_toolsets.builtin.code import CodeTools -from agentpool_toolsets.builtin.debug import DebugTools -from agentpool_toolsets.builtin.execution_environment import ProcessManagementTools -from agentpool_toolsets.builtin.question_tools import QuestionTools -from agentpool_toolsets.builtin.subagent_tools import SubagentTools -from agentpool_toolsets.builtin.workers import WorkersTools - - -__all__ = [ - # Provider classes - "CodeTools", - "DebugTools", - "ProcessManagementTools", - "QuestionTools", - "SubagentTools", - "WorkersTools", -] diff --git a/src/agentpool/AGENTS.md b/src/wolfharness/AGENTS.md similarity index 96% rename from src/agentpool/AGENTS.md rename to src/wolfharness/AGENTS.md index 83e6034d3..84d5236de 100644 --- a/src/agentpool/AGENTS.md +++ b/src/wolfharness/AGENTS.md @@ -1,4 +1,4 @@ -# agentpool (Core Framework) +# wolfharness (Core Framework) ## Overview @@ -37,7 +37,7 @@ | CommChannel implementations (Direct, Protocol) | `lifecycle/comm_channel.py` | | EventTransport (InProcess) | `lifecycle/event_transport.py` | | Dimension factory from config | `lifecycle/factory.py` | -| LifecycleConfig Pydantic model | `agentpool_config/lifecycle.py` | +| LifecycleConfig Pydantic model | `wolfharness_config/lifecycle.py` | | Capability base + all capabilities | `capabilities/{function_toolset,filtered_toolset,combined_toolset,...}.py` | | Skill YAML frontmatter model | `skills/skill.py` | | Skill as pydantic-ai capability (instructions, tools, MCP) | `skills/capability.py` (`SkillCapability`) | @@ -46,7 +46,7 @@ | Skill auto-discovery from paths | `skills/registry.py` | | Skill wrapped as slash commands | `skills/command.py`, `command_registry.py` | | Skill URI resolver (`skill://`) | `skills/uri_resolver.py` | -| Skill config models (McpServerConfig, ToolConfig) | `agentpool_config/skills.py` | +| Skill config models (McpServerConfig, ToolConfig) | `wolfharness_config/skills.py` | | MCP client + tool bridge | `mcp_server/{client,manager,tool_bridge}.py` | | Hook types (callable, command, prompt) | `hooks/{base,callable,command,prompt}.py` | | AgentHooks container (deprecated) | `hooks/agent_hooks.py` | @@ -79,10 +79,10 @@ - **`connect_to()` at runtime**: Deprecated. Define connections in YAML `graph:` or `connections:` sections. - **Bare `async for` in agent loops**: Use `RunExecutor`. The bare pattern silently drops `after_node_run` capability hooks. - **Mutable state on Agent objects**: `AgentRunContext` is per-execution isolation. Stashing mutable state on the `Agent` instance leaks between runs. -- **Config model imports from core**: Import config types from `agentpool_config.*`, not `agentpool.models`, to avoid circular deps. +- **Config model imports from core**: Import config types from `wolfharness_config.*`, not `wolfharness.models`, to avoid circular deps. - **Direct tool code in `tools/`**: Tool framework goes in `tools/`. Concrete implementations go in `tool_impls/`. - **Accessing `agent_pool` read-only**: Use `host_context` (immutable `HostContext`) instead. The `agent_pool` property emits `DeprecationWarning` as of M2. -- **Mixing `lifecycle.EventEnvelope` with `orchestrator.event_bus.EventEnvelope`**: These are separate types with different roles. Import from `agentpool.lifecycle.types` for lifecycle transport envelopes; from `agentpool.orchestrator.event_bus` for internal EventBus envelopes. +- **Mixing `lifecycle.EventEnvelope` with `orchestrator.event_bus.EventEnvelope`**: These are separate types with different roles. Import from `wolfharness.lifecycle.types` for lifecycle transport envelopes; from `wolfharness.orchestrator.event_bus` for internal EventBus envelopes. - **Blocking calls in async paths**: MCP connections, tool execution, and hooks all expect async methods. Use `anyio` or `asyncio`. - **Bare `asyncio.create_task()` without span**: Produces orphan traces. Always ensure a `logfire.span` is active at the call site. @@ -100,7 +100,7 @@ - **SkillCapability injection order matters**: In `get_agentlet()`, skill capabilities are injected at position 5 (after MCP, deferred bridge, approval bridge, and hook capabilities). Each skill produces one `SkillCapability` instance with its own `SkillMcpManager` and `SkillToolManager` — there is one manager tree shared across all skills from the same agentlet creation call. - **mcp.json format follows Claude Desktop**: The companion file uses `{"mcpServers": {"name": {"command": "...", "args": [...], ...}}}` JSON format. The `_load_mcp_json()` function handles env var expansion and converts entries to `SkillMcpServerConfig` objects. Only filesystem skills (UPath paths) can have companion files — virtual skills (PurePosixPath) cannot. - **Tool prefixing prevents name collisions**: Python tools get the prefix `{skill_name}__tool__` and MCP tools get `{skill_name}__mcp__`. This ensures tool names from different skills never collide in the agent's tool namespace. -- **Config model lives in separate package**: `agentpool_config/` exists solely to prevent import cycles with protocol servers. +- **Config model lives in separate package**: `wolfharness_config/` exists solely to prevent import cycles with protocol servers. ## Stream Event Types diff --git a/src/wolfharness/__init__.py b/src/wolfharness/__init__.py new file mode 100644 index 000000000..3c0cdc626 --- /dev/null +++ b/src/wolfharness/__init__.py @@ -0,0 +1,80 @@ +"""AgentPool: main package. + +Pydantic-AI based Multi-Agent Framework with YAML-based Agents, Teams, Workflows & +Extended ACP / AGUI integration. +""" + +from __future__ import annotations + +from importlib.metadata import version +from upathtools import register_http_filesystems + +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest + +# Builtin toolsets imports removed to avoid circular dependency +# Import them directly from wolfharness_toolsets.builtin when needed +from wolfharness.agents import Agent, AgentContext, ACPAgent +from wolfharness.delegation import AgentPool, BaseTeam +from dotenv import load_dotenv +from wolfharness.messaging.messages import ChatMessage +from wolfharness.tools import Tool, ToolCallInfo +from wolfharness.messaging.messagenode import MessageNode +from wolfharness.testing import acp_test_session +from pydantic_ai import ( + AudioUrl, + BinaryContent, + BinaryImage, + DocumentUrl, + ImageUrl, + VideoUrl, +) + +__version__ = version("wolfharness") +__title__ = "AgentPool" +__author__ = "Philipp Temminghoff" +__author_email__ = "philipptemminghoff@googlemail.com" +__copyright__ = "Copyright (c) 2025 Philipp Temminghoff" +__license__ = "MIT" +__url__ = "https://github.com/phil65/wolfharness" + +load_dotenv() +register_http_filesystems() + +# Rebuild models with forward references that couldn't be resolved during +# module initialization due to circular import avoidance. +# PromptType and BasePrompt are imported under TYPE_CHECKING in +# wolfharness_config.knowledge and wolfharness_config.task to break a circular +# import chain. By this point, wolfharness.prompts.prompts is fully loaded, +# so we can resolve the forward references. +from wolfharness.prompts.prompts import BasePrompt, PromptType +from wolfharness_config.knowledge import Knowledge +from wolfharness_config.task import Job + +_ns = {"PromptType": PromptType, "BasePrompt": BasePrompt} +Knowledge.model_rebuild(_types_namespace=_ns) +Job.model_rebuild(_types_namespace=_ns) +NativeAgentConfig.model_rebuild(_types_namespace=_ns) +AgentsManifest.model_rebuild(_types_namespace=_ns) + +__all__ = [ + "ACPAgent", + "Agent", + "AgentContext", + "AgentPool", + "AgentsManifest", + "AudioUrl", + "BaseTeam", + "BinaryContent", + "BinaryImage", + "ChatMessage", + "DocumentUrl", + "ImageUrl", + "MessageNode", + "NativeAgentConfig", + "Tool", + "ToolCallInfo", + "VideoUrl", + "__version__", + "acp_test_session", +] diff --git a/src/wolfharness/__main__.py b/src/wolfharness/__main__.py new file mode 100644 index 000000000..7c9230e84 --- /dev/null +++ b/src/wolfharness/__main__.py @@ -0,0 +1,7 @@ +"""CLI entry point - forwards to wolfharness_cli for faster startup.""" + +from wolfharness_cli.__main__ import cli + + +if __name__ == "__main__": + cli() diff --git a/src/wolfharness/agents/__init__.py b/src/wolfharness/agents/__init__.py new file mode 100644 index 000000000..f8aa4afd7 --- /dev/null +++ b/src/wolfharness/agents/__init__.py @@ -0,0 +1,31 @@ +"""CLI commands for wolfharness.""" + +from __future__ import annotations + +from wolfharness.agents.native_agent import Agent +from wolfharness.agents.acp_agent import ACPAgent +from wolfharness.agents.events import ( + detailed_print_handler, + resolve_event_handlers, + simple_print_handler, +) +from wolfharness.agents.context import AgentContext +from wolfharness.agents.interactions import Interactions +from wolfharness.agents.prompt_injection import PromptInjectionManager +from wolfharness.agents.sys_prompts import SystemPrompts +from wolfharness.agents.exceptions import DelegationDepthError, MAX_DELEGATION_DEPTH + + +__all__ = [ + "MAX_DELEGATION_DEPTH", + "ACPAgent", + "Agent", + "AgentContext", + "DelegationDepthError", + "Interactions", + "PromptInjectionManager", + "SystemPrompts", + "detailed_print_handler", + "resolve_event_handlers", + "simple_print_handler", +] diff --git a/src/agentpool/agents/acp_agent/__init__.py b/src/wolfharness/agents/acp_agent/__init__.py similarity index 100% rename from src/agentpool/agents/acp_agent/__init__.py rename to src/wolfharness/agents/acp_agent/__init__.py diff --git a/src/agentpool/agents/acp_agent/acp_agent.py b/src/wolfharness/agents/acp_agent/acp_agent.py similarity index 92% rename from src/agentpool/agents/acp_agent/acp_agent.py rename to src/wolfharness/agents/acp_agent/acp_agent.py index 15a2f0a96..2c614e479 100644 --- a/src/agentpool/agents/acp_agent/acp_agent.py +++ b/src/wolfharness/agents/acp_agent/acp_agent.py @@ -2,7 +2,7 @@ This module provides an agent implementation that communicates with external ACP (Agent Client Protocol) servers via stdio, enabling integration of any -ACP-compatible agent into the agentpool pool. +ACP-compatible agent into the wolfharness pool. The ACPAgent class acts as an ACP client, spawning an ACP server subprocess and communicating with it via JSON-RPC over stdio. This allows: @@ -12,7 +12,7 @@ Example: ```python - from agentpool.models.acp_agents import ACPAgentConfig + from wolfharness.models.acp_agents import ACPAgentConfig config = ACPAgentConfig( command="claude-code-acp", @@ -49,25 +49,25 @@ from acp import InitializeRequest from acp.agent import ACPAgentAPI -from agentpool.agents.acp_agent.session_state import ACPSessionState -from agentpool.agents.acp_agent.turn import ACPClientProtocol, ACPTurn -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.events import ( +from wolfharness.agents.acp_agent.session_state import ACPSessionState +from wolfharness.agents.acp_agent.turn import ACPClientProtocol, ACPTurn +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.events import ( RunStartedEvent, StreamCompleteEvent, ToolCallCompleteEvent, ToolResultMetadataEvent, ) -from agentpool.agents.events.processors import event_to_part -from agentpool.agents.exceptions import ( +from wolfharness.agents.events.processors import event_to_part +from wolfharness.agents.exceptions import ( AgentNotInitializedError, UnknownCategoryError, UnknownModeError, ) -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage -from agentpool.utils.subprocess_utils import SubprocessError, run_with_process_monitor -from agentpool.utils.token_breakdown import calculate_usage_from_parts +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage +from wolfharness.utils.subprocess_utils import SubprocessError, run_with_process_monitor +from wolfharness.utils.token_breakdown import calculate_usage_from_parts if TYPE_CHECKING: @@ -86,25 +86,25 @@ from acp.schema import Implementation, RequestPermissionRequest, RequestPermissionResponse from acp.schema.capabilities import AgentCapabilities from acp.schema.mcp import McpServer - from agentpool.agents.acp_agent.client_handler import ACPClientHandler - from agentpool.agents.context import AgentRunContext - from agentpool.agents.events import RichAgentStreamEvent - from agentpool.agents.modes import ModeCategory - from agentpool.common_types import AnyEventHandlerType - from agentpool.delegation import AgentPool - from agentpool.hooks import AgentHooks - from agentpool.messaging import MessageHistory - from agentpool.models.acp_agents import BaseACPAgentConfig - from agentpool.orchestrator.turn import Turn - from agentpool.sessions import SessionData - from agentpool.ui.base import InputProvider - from agentpool_config.mcp_server import MCPServerConfig + from wolfharness.agents.acp_agent.client_handler import ACPClientHandler + from wolfharness.agents.context import AgentRunContext + from wolfharness.agents.events import RichAgentStreamEvent + from wolfharness.agents.modes import ModeCategory + from wolfharness.common_types import AnyEventHandlerType + from wolfharness.delegation import AgentPool + from wolfharness.hooks import AgentHooks + from wolfharness.messaging import MessageHistory + from wolfharness.models.acp_agents import BaseACPAgentConfig + from wolfharness.orchestrator.turn import Turn + from wolfharness.sessions import SessionData + from wolfharness.ui.base import InputProvider + from wolfharness_config.mcp_server import MCPServerConfig logger = get_logger(__name__) def get_updated_at(date_str: str | None) -> datetime: - from agentpool.utils.time_utils import get_now + from wolfharness.utils.time_utils import get_now updated_at = get_now() if date_str: @@ -116,7 +116,7 @@ def get_updated_at(date_str: str | None) -> datetime: class ACPAgent[TDeps = None](BaseAgent[TDeps, str]): """MessageNode that wraps an external ACP agent subprocess. - This allows integrating any ACP-compatible agent into the agentpool + This allows integrating any ACP-compatible agent into the wolfharness pool, enabling composition with native agents via connections, teams, etc. """ @@ -155,7 +155,7 @@ def __init__( hooks: AgentHooks | None = None, session_id: str | None = None, ) -> None: - from agentpool.mcp_server.tool_bridge import ToolManagerBridge + from wolfharness.mcp_server.tool_bridge import ToolManagerBridge super().__init__( name=name or command, @@ -182,7 +182,7 @@ def __init__( self._env_vars = env_vars or {} self._client_env = client_execution_env # ACP initialization - self._init_request = init_request or InitializeRequest.create_for_package("agentpool") + self._init_request = init_request or InitializeRequest.create_for_package("wolfharness") # Tools self._tool_providers = tool_providers or [] # Provider type for model messages @@ -235,7 +235,7 @@ def from_config( client_execution_env=config.get_client_execution_environment(), # ACP initialization init_request=InitializeRequest.create_for_package( - "agentpool", + "wolfharness", allow_terminal=config.allow_terminal, allow_file_operations=config.allow_file_operations, ), @@ -333,7 +333,7 @@ async def _start_process(self) -> Process: async def _initialize(self) -> None: """Initialize the ACP connection.""" from acp.client.connection import ClientSideConnection - from agentpool.agents.acp_agent.client_handler import ACPClientHandler + from wolfharness.agents.acp_agent.client_handler import ACPClientHandler if not self._process or not self._process.stdin or not self._process.stdout: raise RuntimeError("Process not started") @@ -357,8 +357,8 @@ async def _initialize(self) -> None: async def _create_session(self) -> None: """Create a new ACP session with configured MCP servers.""" - from agentpool.agents.acp_agent.acp_converters import mcp_config_to_acp - from agentpool.agents.acp_agent.helpers import filter_servers_by_capabilities + from wolfharness.agents.acp_agent.acp_converters import mcp_config_to_acp + from wolfharness.agents.acp_agent.helpers import filter_servers_by_capabilities if not self._api: raise AgentNotInitializedError @@ -427,7 +427,7 @@ async def _stream_events( # noqa: PLR0915 # type: ignore[override] store_history: bool = True, **pydantic_ai_kwargs: Any, ) -> AsyncIterator[RichAgentStreamEvent[str]]: - from agentpool.agents.acp_agent.acp_converters import to_finish_reason + from wolfharness.agents.acp_agent.acp_converters import to_finish_reason if input_provider is not None and self._client_handler: self._client_handler._input_provider = input_provider @@ -640,7 +640,7 @@ async def get_available_models(self) -> list[ModelInfo] | None: async def get_modes(self) -> list[ModeCategory]: """Get available modes from the ACP session state.""" - from agentpool.agents.acp_agent.acp_converters import get_modes + from wolfharness.agents.acp_agent.acp_converters import get_modes if not self._state: return [] @@ -691,7 +691,7 @@ async def list_sessions( limit: int | None = None, ) -> list[SessionData]: """List sessions from the remote ACP server.""" - from agentpool.sessions.models import SessionData + from wolfharness.sessions.models import SessionData if not self._api: raise RuntimeError("Not connected to ACP server") @@ -728,13 +728,13 @@ async def list_sessions( async def load_session(self, session_id: str) -> SessionData | None: """Load and restore a session from the remote ACP server.""" - from agentpool.agents.acp_agent.acp_converters import ( + from wolfharness.agents.acp_agent.acp_converters import ( acp_notifications_to_messages, mcp_config_to_acp, ) - from agentpool.agents.acp_agent.helpers import filter_servers_by_capabilities - from agentpool.sessions.models import SessionData - from agentpool.utils.time_utils import get_now + from wolfharness.agents.acp_agent.helpers import filter_servers_by_capabilities + from wolfharness.sessions.models import SessionData + from wolfharness.utils.time_utils import get_now if not self._api: self.log.error("Cannot load session: not connected to ACP server") diff --git a/src/agentpool/agents/acp_agent/acp_converters.py b/src/wolfharness/agents/acp_agent/acp_converters.py similarity index 97% rename from src/agentpool/agents/acp_agent/acp_converters.py rename to src/wolfharness/agents/acp_agent/acp_converters.py index d5516e420..14fcd6f4a 100644 --- a/src/agentpool/agents/acp_agent/acp_converters.py +++ b/src/wolfharness/agents/acp_agent/acp_converters.py @@ -1,6 +1,6 @@ """ACP to native event converters. -This module provides conversion from ACP session updates to native agentpool +This module provides conversion from ACP session updates to native wolfharness streaming events, enabling ACPAgent to yield the same event types as native agents. This is the reverse of the conversion done in acp_server/session.py handle_event(). @@ -55,7 +55,7 @@ UsageUpdate, UserMessageChunk, ) -from agentpool.agents.events import ( +from wolfharness.agents.events import ( DiffContentItem, LocationContentItem, PartDeltaEvent, @@ -88,10 +88,10 @@ ToolCallLocation, ) from acp.schema.mcp import AcpMcpServer - from agentpool.agents.events import RichAgentStreamEvent, ToolCallContentItem - from agentpool.agents.modes import ModeCategory, ModeInfo - from agentpool.messaging.messages import ChatMessage - from agentpool_config.mcp_server import ( + from wolfharness.agents.events import RichAgentStreamEvent, ToolCallContentItem + from wolfharness.agents.modes import ModeCategory, ModeInfo + from wolfharness.messaging.messages import ChatMessage + from wolfharness_config.mcp_server import ( AcpMCPServerConfig, MCPServerConfig, SSEMCPServerConfig, @@ -113,7 +113,7 @@ def get_modes( available_modes: SessionModeState | None, available_models: SessionModelState | None, ) -> list[ModeCategory]: - from agentpool.agents.modes import ModeCategory, ModeInfo + from wolfharness.agents.modes import ModeCategory, ModeInfo categories: list[ModeCategory] = [] @@ -213,7 +213,7 @@ def convert_acp_content(content: Sequence[ToolCallContent] | None) -> list[ToolC case FileEditToolCallContent(path=path, old_text=old_text, new_text=new_text): result.append(DiffContentItem(path=path, old_text=old_text, new_text=new_text)) case ContentToolCallContent(content=TextContentBlock(text=text)): - from agentpool.agents.events import TextContentItem + from wolfharness.agents.events import TextContentItem result.append(TextContentItem(text=text)) return result @@ -360,7 +360,7 @@ def acp_to_native_event( # noqa: PLR0911 # Plan update -> PlanUpdateEvent case AgentPlanUpdate(entries=entries): - from agentpool.utils.todos import PlanEntry + from wolfharness.utils.todos import PlanEntry native_entries = [ PlanEntry(content=e.content, priority=e.priority, status=e.status) for e in entries @@ -410,14 +410,14 @@ def mcp_config_to_acp(config: MCPServerConfig) -> McpServer: the server is wrapped with mcp-filter proxy to apply the filtering. Args: - config: agentpool MCP server configuration + config: wolfharness MCP server configuration Returns: ACP-compatible McpServer instance, or None if conversion not possible """ from acp.schema.common import EnvVariable from acp.schema.mcp import AcpMcpServer, HttpMcpServer, SseMcpServer, StdioMcpServer - from agentpool_config.mcp_server import ( + from wolfharness_config.mcp_server import ( AcpMCPServerConfig, SSEMCPServerConfig, StdioMCPServerConfig, @@ -533,7 +533,7 @@ def reset(self) -> None: def _finalize_current_message(self) -> None: """Finalize the current message and add it to the messages list.""" - from agentpool.messaging.messages import ChatMessage + from wolfharness.messaging.messages import ChatMessage if self._current_role is None: return diff --git a/src/agentpool/agents/acp_agent/client_handler.py b/src/wolfharness/agents/acp_agent/client_handler.py similarity index 97% rename from src/agentpool/agents/acp_agent/client_handler.py rename to src/wolfharness/agents/acp_agent/client_handler.py index 1251983ec..f74111434 100644 --- a/src/agentpool/agents/acp_agent/client_handler.py +++ b/src/wolfharness/agents/acp_agent/client_handler.py @@ -21,8 +21,8 @@ WaitForTerminalExitResponse, WriteTextFileResponse, ) -from agentpool.agents.exceptions import OperationNotAllowedError, ResourceNotFoundError -from agentpool.log import get_logger +from wolfharness.agents.exceptions import OperationNotAllowedError, ResourceNotFoundError +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -46,9 +46,9 @@ WaitForTerminalExitRequest, WriteTextFileRequest, ) - from agentpool.agents.acp_agent import ACPAgent - from agentpool.agents.acp_agent.session_state import ACPSessionState - from agentpool.ui.base import InputProvider + from wolfharness.agents.acp_agent import ACPAgent + from wolfharness.agents.acp_agent.session_state import ACPSessionState + from wolfharness.ui.base import InputProvider logger = get_logger(__name__) @@ -133,7 +133,7 @@ async def session_update(self, params: SessionNotification[Any]) -> None: CurrentModelUpdate, CurrentModeUpdate, ) - from agentpool.agents.modes import ModeInfo + from wolfharness.agents.modes import ModeInfo # Handle state updates - these modify session state, not stream data match params.update: @@ -408,8 +408,8 @@ async def ext_method(self, method: str, params: dict[str, Any]) -> dict[str, Any async def ext_notification(self, method: str, params: dict[str, Any]) -> None: """Handle extension notifications.""" match method: - case "_agentpool/toast": - from agentpool.agents.events import ToastInfo + case "_wolfharness/toast": + from wolfharness.agents.events import ToastInfo toast = ToastInfo( message=params.get("message", ""), @@ -489,11 +489,11 @@ async def run_cmd(ctx: Any, args: list[str], kwargs: dict[str, str]) -> None: if __name__ == "__main__": - from agentpool.agents.acp_agent import ACPAgent + from wolfharness.agents.acp_agent import ACPAgent async def main() -> None: """Demo: Basic call to an ACP agent.""" - args = ["run", "agentpool", "serve-acp"] + args = ["run", "wolfharness", "serve-acp"] cwd = str(Path.cwd()) async with ACPAgent(command="uv", args=args, cwd=cwd, event_handlers=["detailed"]) as agent: print("Response (streaming): ", end="", flush=True) diff --git a/src/agentpool/agents/acp_agent/helpers.py b/src/wolfharness/agents/acp_agent/helpers.py similarity index 97% rename from src/agentpool/agents/acp_agent/helpers.py rename to src/wolfharness/agents/acp_agent/helpers.py index a347cf349..c1f737c2e 100644 --- a/src/agentpool/agents/acp_agent/helpers.py +++ b/src/wolfharness/agents/acp_agent/helpers.py @@ -23,7 +23,7 @@ def filter_servers_by_capabilities( """Filter MCP servers based on agent's supported transports. Args: - servers: ACP-schema MCP servers to filter (not agentpool_config types) + servers: ACP-schema MCP servers to filter (not wolfharness_config types) agent_capabilities: Agent's capabilities (None = no HTTP/SSE support) logger: Optional logger for warnings about unsupported servers diff --git a/src/agentpool/agents/acp_agent/modes.py b/src/wolfharness/agents/acp_agent/modes.py similarity index 98% rename from src/agentpool/agents/acp_agent/modes.py rename to src/wolfharness/agents/acp_agent/modes.py index f0d2762a1..88f500209 100644 --- a/src/agentpool/agents/acp_agent/modes.py +++ b/src/wolfharness/agents/acp_agent/modes.py @@ -5,13 +5,13 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, ClassVar -from agentpool.agents.exceptions import UnknownModeError -from agentpool.agents.modes import ConfigOptionChanged, ModeCategoryProtocol, ModeInfo +from wolfharness.agents.exceptions import UnknownModeError +from wolfharness.agents.modes import ConfigOptionChanged, ModeCategoryProtocol, ModeInfo if TYPE_CHECKING: from acp.schema import SessionConfigOption, SessionModelState, SessionModeState - from agentpool.agents.acp_agent.acp_agent import ACPAgent + from wolfharness.agents.acp_agent.acp_agent import ACPAgent # ============================================================================= diff --git a/src/agentpool/agents/acp_agent/session_state.py b/src/wolfharness/agents/acp_agent/session_state.py similarity index 98% rename from src/agentpool/agents/acp_agent/session_state.py rename to src/wolfharness/agents/acp_agent/session_state.py index 18762c6f5..6f4318a2b 100644 --- a/src/agentpool/agents/acp_agent/session_state.py +++ b/src/wolfharness/agents/acp_agent/session_state.py @@ -6,7 +6,7 @@ from dataclasses import dataclass, field as dataclass_field from typing import TYPE_CHECKING -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: diff --git a/src/agentpool/agents/acp_agent/turn.py b/src/wolfharness/agents/acp_agent/turn.py similarity index 90% rename from src/agentpool/agents/acp_agent/turn.py rename to src/wolfharness/agents/acp_agent/turn.py index 7d013d516..554d3168d 100644 --- a/src/agentpool/agents/acp_agent/turn.py +++ b/src/wolfharness/agents/acp_agent/turn.py @@ -1,8 +1,8 @@ """ACP Turn — wraps ACP session/prompt stream into a single reactive Turn. -This module provides :class:`ACPTurn`, a :class:`~agentpool.orchestrator.turn.Turn` +This module provides :class:`ACPTurn`, a :class:`~wolfharness.orchestrator.turn.Turn` subclass that drives an ACP client through a single prompt → stream → complete -cycle, yielding :class:`~agentpool.agents.events.RichAgentStreamEvent` items +cycle, yielding :class:`~wolfharness.agents.events.RichAgentStreamEvent` items and populating ``message_history`` / ``final_message`` after execution. """ @@ -17,13 +17,13 @@ from pydantic import ValidationError from acp.exceptions import RequestError -from agentpool.agents.events import ( +from wolfharness.agents.events import ( RunErrorEvent, StreamCompleteEvent, ) -from agentpool.observability.spans import safe_span -from agentpool.orchestrator.turn import HookAwareTurn, Turn -from agentpool.utils.pydantic_ai_helpers import flatten_prompts +from wolfharness.observability.spans import safe_span +from wolfharness.orchestrator.turn import HookAwareTurn, Turn +from wolfharness.utils.pydantic_ai_helpers import flatten_prompts if TYPE_CHECKING: @@ -33,10 +33,10 @@ from pydantic_ai import ModelMessage, UserContent from acp.schema import ContentBlock, PromptResponse, SessionUpdate - from agentpool.agents.context import AgentRunContext - from agentpool.agents.events import RichAgentStreamEvent - from agentpool.hooks import AgentHooks - from agentpool.messaging import ChatMessage + from wolfharness.agents.context import AgentRunContext + from wolfharness.agents.events import RichAgentStreamEvent + from wolfharness.hooks import AgentHooks + from wolfharness.messaging import ChatMessage @runtime_checkable @@ -66,15 +66,15 @@ def _convert_updates_to_model_messages( ) -> tuple[list[ModelMessage], ChatMessage[str] | None]: """Convert ACP session updates to model messages and final chat message. - Uses :class:`~agentpool.agents.acp_agent.acp_converters.ACPMessageAccumulator` - to build :class:`~agentpool.messaging.ChatMessage` objects from the raw + Uses :class:`~wolfharness.agents.acp_agent.acp_converters.ACPMessageAccumulator` + to build :class:`~wolfharness.messaging.ChatMessage` objects from the raw session updates, then flattens the model messages. Returns: A tuple of (model_messages, final_chat_message). The final chat message is the last assistant message, or None if no messages were produced. """ - from agentpool.agents.acp_agent.acp_converters import ACPMessageAccumulator + from wolfharness.agents.acp_agent.acp_converters import ACPMessageAccumulator accumulator = ACPMessageAccumulator( session_id=session_id, @@ -153,11 +153,11 @@ async def execute(self) -> AsyncGenerator[RichAgentStreamEvent[Any]]: # noqa: P """ from pydantic_ai import RunUsage - from agentpool.agents.acp_agent.acp_converters import ( + from wolfharness.agents.acp_agent.acp_converters import ( acp_to_native_event, convert_to_acp_content, ) - from agentpool.agents.events import ( + from wolfharness.agents.events import ( StepUsageEvent, ToolCallCompleteEvent, ToolCallStartEvent, @@ -170,7 +170,7 @@ async def execute(self) -> AsyncGenerator[RichAgentStreamEvent[Any]]: # noqa: P turn_id=self._run_ctx.turn_id, session_id=self._run_ctx.session_id, ): - from agentpool.observability.trace import get_trace_id + from wolfharness.observability.trace import get_trace_id logfire.info( "Turn started", @@ -185,7 +185,7 @@ async def execute(self) -> AsyncGenerator[RichAgentStreamEvent[Any]]: # noqa: P pre_turn_result = await self._fire_pre_turn_hooks() if pre_turn_result is not None and pre_turn_result.get("decision") == "deny": self._run_ctx.cancelled = True - from agentpool.messaging import ChatMessage + from wolfharness.messaging import ChatMessage self._final_message = ChatMessage[str]( content="", @@ -296,7 +296,7 @@ async def execute(self) -> AsyncGenerator[RichAgentStreamEvent[Any]]: # noqa: P if final_msg is not None: self._final_message = final_msg else: - from agentpool.messaging import ChatMessage + from wolfharness.messaging import ChatMessage self._final_message = ChatMessage[str]( content="", diff --git a/src/agentpool/agents/base_agent.py b/src/wolfharness/agents/base_agent.py similarity index 96% rename from src/agentpool/agents/base_agent.py rename to src/wolfharness/agents/base_agent.py index 2d8c2859b..cb282a642 100644 --- a/src/agentpool/agents/base_agent.py +++ b/src/wolfharness/agents/base_agent.py @@ -19,21 +19,21 @@ import anyio from upathtools.filesystems import IsolatedMemoryFileSystem -from agentpool.agents.context import AgentContext, AgentRunContext -from agentpool.agents.events import ( +from wolfharness.agents.context import AgentContext, AgentRunContext +from wolfharness.agents.events import ( RunErrorEvent, StreamCompleteEvent, resolve_event_handlers, ) -from agentpool.agents.modes import ModeInfo -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.common_types import IndividualEventHandler -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage, MessageHistory, MessageNode -from agentpool.observability.spans import safe_span -from agentpool.prompts.convert import convert_prompts -from agentpool.utils.inspection import call_with_context -from agentpool.utils.time_utils import get_now +from wolfharness.agents.modes import ModeInfo +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.common_types import IndividualEventHandler +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage, MessageHistory, MessageNode +from wolfharness.observability.spans import safe_span +from wolfharness.prompts.convert import convert_prompts +from wolfharness.utils.inspection import call_with_context +from wolfharness.utils.time_utils import get_now if TYPE_CHECKING: @@ -51,16 +51,16 @@ from upathtools.filesystems import OverlayFileSystem from acp.schema import AvailableCommandsUpdate - from agentpool.agents.events import ( + from wolfharness.agents.events import ( CommandCompleteEvent, CommandOutputEvent, RichAgentStreamEvent, StreamWithCommandsEvent, ToastInfo, ) - from agentpool.agents.modes import ConfigOptionChanged, ModeCategory, ModeCategoryId - from agentpool.agents.native_agent import Agent - from agentpool.common_types import ( + from wolfharness.agents.modes import ConfigOptionChanged, ModeCategory, ModeCategoryId + from wolfharness.agents.native_agent import Agent + from wolfharness.common_types import ( AgentName, AnyEventHandlerType, MCPServerStatus, @@ -68,17 +68,17 @@ PromptCompatible, StrPath, ) - from agentpool.delegation import AgentPool, BaseTeam - from agentpool.hooks import AgentHooks - from agentpool.messaging import ChatMessage - from agentpool.orchestrator.core import EventBus, SessionPool, SessionState - from agentpool.orchestrator.run import RunHandle - from agentpool.orchestrator.turn import Turn - from agentpool.sessions import SessionData - from agentpool.talk.stats import MessageStats - from agentpool.ui.base import InputProvider - from agentpool_config.lifecycle import LifecycleConfig - from agentpool_config.mcp_server import MCPServerConfig + from wolfharness.delegation import AgentPool, BaseTeam + from wolfharness.hooks import AgentHooks + from wolfharness.messaging import ChatMessage + from wolfharness.orchestrator.core import EventBus, SessionPool, SessionState + from wolfharness.orchestrator.run import RunHandle + from wolfharness.orchestrator.turn import Turn + from wolfharness.sessions import SessionData + from wolfharness.talk.stats import MessageStats + from wolfharness.ui.base import InputProvider + from wolfharness_config.lifecycle import LifecycleConfig + from wolfharness_config.mcp_server import MCPServerConfig # Union type for state updates emitted via state_updated signal type StateUpdate = ( @@ -234,8 +234,8 @@ def __init__( from exxec import ExecutionEnvironment, LocalExecutionEnvironment from slashed import CommandStore - from agentpool.agents.staged_content import StagedContent - from agentpool_commands import get_commands + from wolfharness.agents.staged_content import StagedContent + from wolfharness_commands import get_commands super().__init__( name=name, @@ -373,8 +373,8 @@ def __and__(self, other: MessageNode[Any, Any] | ProcessorCallback[Any]) -> Base group = analyzer & planner & executor # Create group of 3 group = analyzer & existing_group # Add to existing group """ - from agentpool.agents.native_agent import Agent - from agentpool.delegation.base_team import BaseTeam + from wolfharness.agents.native_agent import Agent + from wolfharness.delegation.base_team import BaseTeam match other: case BaseTeam(): @@ -398,8 +398,8 @@ def __or__(self, other: ProcessorCallback[Any]) -> BaseTeam[Any, Any]: ... def __or__(self, other: MessageNode[Any, Any] | ProcessorCallback[Any]) -> BaseTeam[Any, Any]: # Create new execution with sequential mode (for piping) - from agentpool.agents.native_agent import Agent - from agentpool.delegation.base_team import BaseTeam + from wolfharness.agents.native_agent import Agent + from wolfharness.delegation.base_team import BaseTeam if callable(other): other = Agent.from_callback(other, agent_pool=self._agent_pool) @@ -407,7 +407,7 @@ def __or__(self, other: MessageNode[Any, Any] | ProcessorCallback[Any]) -> BaseT return BaseTeam([self, other], mode="sequential") async def update_state(self, config_id: str, value_id: str) -> None: - from agentpool.agents.modes import ConfigOptionChanged + from wolfharness.agents.modes import ConfigOptionChanged self.log.info("Config option changed", config_id=config_id, mode=value_id) change = ConfigOptionChanged(config_id=config_id, value_id=value_id) @@ -572,9 +572,9 @@ async def get_resource(self, name: str) -> Any: """ import asyncio - from agentpool.capabilities.extension_registry import Scope, ScopeLevel - from agentpool.capabilities.resource_protocols import ResourceAccess - from agentpool.tools.exceptions import ToolError + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.resource_protocols import ResourceAccess + from wolfharness.tools.exceptions import ToolError all_resources: list[Any] = [] @@ -626,9 +626,9 @@ async def list_prompts(self) -> list[Any]: Returns: List of prompt objects from capabilities that provide prompts """ - from agentpool.capabilities.extension_registry import Scope, ScopeLevel - from agentpool.capabilities.function_toolset import FunctionToolsetCapability - from agentpool.prompts.prompts import MCPClientPrompt as MCPPrompt + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.prompts.prompts import MCPClientPrompt as MCPPrompt all_prompts: list[Any] = [] @@ -693,7 +693,7 @@ async def _temporary_tools( Yields: List of registered tool infos """ - from agentpool.tools.base import Tool as ToolClass + from wolfharness.tools.base import Tool as ToolClass match tools: case str() | Callable() | ToolClass(): @@ -820,7 +820,7 @@ def create_run( A RunHandle wired with agent, event_bus, session, and run_ctx, ready to be started via ``start(prompt)``. """ - from agentpool.orchestrator.run import RunHandle + from wolfharness.orchestrator.run import RunHandle return RunHandle( run_id=run_ctx.run_id, @@ -1203,7 +1203,7 @@ def _maybe_pool_stream( _skip_pool: bool, ) -> AsyncIterator[RichAgentStreamEvent[TResult]] | None: """Return async iterator for pool-based streaming, or None if not applicable.""" - from agentpool.utils.identifiers import generate_session_id + from wolfharness.utils.identifiers import generate_session_id if ( not _skip_pool @@ -1303,8 +1303,8 @@ async def _prepare_standalone_context( Returns: (run_ctx, effective_session_id, local_bus, stream, created_local_bus) """ - from agentpool.orchestrator.core import EventBus - from agentpool.utils.identifiers import generate_session_id + from wolfharness.orchestrator.core import EventBus + from wolfharness.utils.identifiers import generate_session_id if _run_ctx is not None: run_ctx = _run_ctx @@ -1408,7 +1408,7 @@ async def run_stream( # type: ignore[override] # noqa: PLR0915 Yields: Stream events during execution """ - from agentpool.orchestrator.core import drain_and_merge + from wolfharness.orchestrator.core import drain_and_merge # --- Path A: SessionPool available & outside a turn context --- pool_stream = self._maybe_pool_stream( @@ -1454,7 +1454,7 @@ async def run_stream( # type: ignore[override] # noqa: PLR0915 # SessionController). When None or all-defaults, RunHandle's # __post_init__ creates in-memory defaults automatically. if self._lifecycle_config is not None and not self._lifecycle_config.is_all_defaults(): - from agentpool.lifecycle.factory import create_dimensions + from wolfharness.lifecycle.factory import create_dimensions self._lifecycle_dimensions = create_dimensions( self._lifecycle_config, @@ -1567,7 +1567,7 @@ async def _run_stream_once( Yields: Stream events during execution """ - from agentpool.messaging import ChatMessage + from wolfharness.messaging import ChatMessage # Convert prompts to standard UserContent format converted_prompts = await convert_prompts(prompts) @@ -1685,7 +1685,7 @@ async def _execute_slash_command_streaming( CommandOutputEvent as SlashedCommandOutputEvent, ) - from agentpool.agents.events import CommandCompleteEvent, CommandOutputEvent + from wolfharness.agents.events import CommandCompleteEvent, CommandOutputEvent parsed = _parse_slash_command(command_text) if not parsed: @@ -1931,7 +1931,7 @@ async def _interrupt(self, run_ctx: AgentRunContext | None = None) -> None: async def get_stats(self) -> MessageStats: """Get message statistics.""" - from agentpool.talk.stats import MessageStats + from wolfharness.talk.stats import MessageStats return MessageStats(messages=list(self.conversation.chat_messages)) @@ -2153,7 +2153,7 @@ async def load_rules(self, project_dir: str | None = None) -> None: """Load agent rules from global and project locations. Searches for AGENTS.md/CLAUDE.md files in: - 1. Global: ~/.config/agentpool/AGENTS.md (user-wide rules) + 1. Global: ~/.config/wolfharness/AGENTS.md (user-wide rules) 2. Project: {project_dir}/AGENTS.md (project-specific rules) Both are merged and staged for injection into the first prompt. @@ -2164,7 +2164,7 @@ async def load_rules(self, project_dir: str | None = None) -> None: project_dir: Project directory to search for rules. Falls back to env.cwd if not provided. """ - from agentpool_config.resolution import get_global_config_dir + from wolfharness_config.resolution import get_global_config_dir effective_project_dir = project_dir or self.env.cwd fs = self.env.get_fs() diff --git a/src/agentpool/agents/context.py b/src/wolfharness/agents/context.py similarity index 96% rename from src/agentpool/agents/context.py rename to src/wolfharness/agents/context.py index af3de8c27..d83a6be21 100644 --- a/src/agentpool/agents/context.py +++ b/src/wolfharness/agents/context.py @@ -17,23 +17,23 @@ ErrorData, ) -from agentpool.agents.prompt_injection import PromptInjectionManager -from agentpool.log import get_logger -from agentpool.messaging.context import NodeContext -from agentpool.tools import CallDeferred -from agentpool.ui.elicitation import normalize_elicit_content +from wolfharness.agents.prompt_injection import PromptInjectionManager +from wolfharness.log import get_logger +from wolfharness.messaging.context import NodeContext +from wolfharness.tools import CallDeferred +from wolfharness.ui.elicitation import normalize_elicit_content if TYPE_CHECKING: from upathtools.filesystems import IsolatedMemoryFileSystem, OverlayFileSystem - from agentpool import Agent - from agentpool.agents.events import StreamEventEmitter - from agentpool.agents.native_agent.checkpoint import CheckpointManager - from agentpool.agents.native_agent.elicitation_bridge import ElicitationFutureRegistry - from agentpool.orchestrator.core import EventBus - from agentpool.orchestrator.run import RunHandle - from agentpool.tools.base import Tool + from wolfharness import Agent + from wolfharness.agents.events import StreamEventEmitter + from wolfharness.agents.native_agent.checkpoint import CheckpointManager + from wolfharness.agents.native_agent.elicitation_bridge import ElicitationFutureRegistry + from wolfharness.orchestrator.core import EventBus + from wolfharness.orchestrator.run import RunHandle + from wolfharness.tools.base import Tool ConfirmationResult = Literal["allow", "skip", "abort_run", "abort_chain"] @@ -269,7 +269,7 @@ class AgentContext[TDeps = Any](NodeContext[TDeps]): @property def native_agent(self) -> Agent[TDeps, Any]: """Current agent, type-narrowed to native pydantic-ai Agent.""" - from agentpool import Agent + from wolfharness import Agent assert isinstance(self.node, Agent) return self.node # ty: ignore[invalid-return-type] @@ -382,8 +382,8 @@ async def handle_elicitation(self, params: ElicitRequestParams) -> ElicitResult # Checkpoint the session for crash recovery. if run_ctx.checkpoint_manager is not None: try: - from agentpool.agents.events.events import ElicitationDeferredEvent - from agentpool.sessions.models import PendingDeferredCall + from wolfharness.agents.events.events import ElicitationDeferredEvent + from wolfharness.sessions.models import PendingDeferredCall pending_call = PendingDeferredCall( tool_call_id=handle, @@ -481,7 +481,7 @@ async def handle_elicitation(self, params: ElicitRequestParams) -> ElicitResult else: payload = await future except TimeoutError: - from agentpool.tasks.exceptions import RunAbortedError + from wolfharness.tasks.exceptions import RunAbortedError logger.warning( "Elicitation timed out — aborting agent run", @@ -599,7 +599,7 @@ def get_session_state(self) -> Any | None: async def report_progress(self, progress: float, total: float | None, message: str) -> None: """Report progress by emitting event into the agent's stream.""" - from agentpool.agents.events import ToolCallProgressEvent + from wolfharness.agents.events import ToolCallProgressEvent logger.info("Reporting tool call progress", progress=progress, total=total, message=message) progress_event = ToolCallProgressEvent( @@ -620,7 +620,7 @@ async def report_progress(self, progress: float, total: float | None, message: s @property def events(self) -> StreamEventEmitter: """Get event emitter with context automatically injected.""" - from agentpool.agents.events import StreamEventEmitter + from wolfharness.agents.events import StreamEventEmitter event_bus = self.run_ctx.event_bus if self.run_ctx else None return StreamEventEmitter(self, event_bus=event_bus) @@ -745,12 +745,12 @@ async def create_child_session( **agent_kwargs, ) else: - from agentpool.utils.identifiers import generate_session_id + from wolfharness.utils.identifiers import generate_session_id child_sid = generate_session_id() else: # Fallback: no pool, no session_pool — generate ephemeral ID. - from agentpool.utils.identifiers import generate_session_id + from wolfharness.utils.identifiers import generate_session_id child_sid = generate_session_id() @@ -763,7 +763,7 @@ async def create_child_session( raise SubagentDepthError( f"Subagent depth {child_depth} exceeds limit {MAX_SUBAGENT_DEPTH}", ) - from agentpool.agents.events.events import SpawnSessionStart + from wolfharness.agents.events.events import SpawnSessionStart event_spawn_mechanism: Literal["task", "spawn"] = ( "task" if spawn_mechanism == "task" else "spawn" diff --git a/src/agentpool/agents/events/__init__.py b/src/wolfharness/agents/events/__init__.py similarity index 100% rename from src/agentpool/agents/events/__init__.py rename to src/wolfharness/agents/events/__init__.py diff --git a/src/agentpool/agents/events/builtin_handlers.py b/src/wolfharness/agents/events/builtin_handlers.py similarity index 95% rename from src/agentpool/agents/events/builtin_handlers.py rename to src/wolfharness/agents/events/builtin_handlers.py index 16255fba2..695e48895 100644 --- a/src/agentpool/agents/events/builtin_handlers.py +++ b/src/wolfharness/agents/events/builtin_handlers.py @@ -18,22 +18,22 @@ ToolReturnPart, ) -from agentpool.agents.events import ( +from wolfharness.agents.events import ( RunErrorEvent, StreamCompleteEvent, ToolCallProgressEvent, ToolCallStartEvent, UserMessageInsertedEvent, ) -from agentpool.utils.pydantic_ai_helpers import safe_args_as_dict +from wolfharness.utils.pydantic_ai_helpers import safe_args_as_dict if TYPE_CHECKING: from collections.abc import Sequence - from agentpool.agents.context import AgentContext - from agentpool.agents.events import RichAgentStreamEvent - from agentpool.common_types import AnyEventHandlerType, IndividualEventHandler + from wolfharness.agents.context import AgentContext + from wolfharness.agents.events import RichAgentStreamEvent + from wolfharness.common_types import AnyEventHandlerType, IndividualEventHandler async def simple_print_handler(ctx: AgentContext[Any], event: RichAgentStreamEvent[Any]) -> None: diff --git a/src/agentpool/agents/events/event_emitter.py b/src/wolfharness/agents/events/event_emitter.py similarity index 96% rename from src/agentpool/agents/events/event_emitter.py rename to src/wolfharness/agents/events/event_emitter.py index 2c7d4d22e..a0fc08105 100644 --- a/src/agentpool/agents/events/event_emitter.py +++ b/src/wolfharness/agents/events/event_emitter.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Any, Literal -from agentpool.agents.events import ( +from wolfharness.agents.events import ( CustomEvent, DiffContentItem, LocationContentItem, @@ -13,18 +13,18 @@ ToolCallProgressEvent, ToolCallStartEvent, ) -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: from collections.abc import Sequence - from agentpool.agents.context import AgentContext - from agentpool.agents.events import RichAgentStreamEvent, ToolCallContentItem - from agentpool.agents.events.events import ToolCallStatus - from agentpool.orchestrator.core import EventBus - from agentpool.tools.base import ToolKind - from agentpool.utils.todos import PlanEntry + from wolfharness.agents.context import AgentContext + from wolfharness.agents.events import RichAgentStreamEvent, ToolCallContentItem + from wolfharness.agents.events.events import ToolCallStatus + from wolfharness.orchestrator.core import EventBus + from wolfharness.tools.base import ToolKind + from wolfharness.utils.todos import PlanEntry logger = get_logger(__name__) diff --git a/src/agentpool/agents/events/events.py b/src/wolfharness/agents/events/events.py similarity index 99% rename from src/agentpool/agents/events/events.py rename to src/wolfharness/agents/events/events.py index 3f435ef14..3f59a492b 100644 --- a/src/agentpool/agents/events/events.py +++ b/src/wolfharness/agents/events/events.py @@ -33,16 +33,16 @@ ToolCallPartDelta, ) -from agentpool.messaging import ChatMessage # noqa: TC001 +from wolfharness.messaging import ChatMessage # noqa: TC001 if TYPE_CHECKING: from collections.abc import Sequence - from agentpool.lifecycle.types import RunState - from agentpool.messaging.messages import TokenCost - from agentpool.tools.base import ToolKind - from agentpool.utils.todos import PlanEntry + from wolfharness.lifecycle.types import RunState + from wolfharness.messaging.messages import TokenCost + from wolfharness.tools.base import ToolKind + from wolfharness.utils.todos import PlanEntry ToolCallStatus = Literal["pending", "in_progress", "completed", "failed"] diff --git a/src/agentpool/agents/events/infer_info.py b/src/wolfharness/agents/events/infer_info.py similarity index 97% rename from src/agentpool/agents/events/infer_info.py rename to src/wolfharness/agents/events/infer_info.py index dd539564a..c05365fff 100644 --- a/src/agentpool/agents/events/infer_info.py +++ b/src/wolfharness/agents/events/infer_info.py @@ -5,14 +5,14 @@ from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any -from agentpool.agents.events import DiffContentItem, LocationContentItem +from wolfharness.agents.events import DiffContentItem, LocationContentItem if TYPE_CHECKING: from clawd_code_sdk.models import ToolInput - from agentpool.agents.events import ToolCallContentItem - from agentpool.tools.base import ToolKind + from wolfharness.agents.events import ToolCallContentItem + from wolfharness.tools.base import ToolKind @dataclass diff --git a/src/agentpool/agents/events/processors.py b/src/wolfharness/agents/events/processors.py similarity index 97% rename from src/agentpool/agents/events/processors.py rename to src/wolfharness/agents/events/processors.py index 6e38ec9f9..465992e21 100644 --- a/src/agentpool/agents/events/processors.py +++ b/src/wolfharness/agents/events/processors.py @@ -35,13 +35,13 @@ async def log_events(stream): ToolReturnPart, ) -from agentpool.agents.events import ToolCallProgressEvent, ToolCallStartEvent +from wolfharness.agents.events import ToolCallProgressEvent, ToolCallStartEvent if TYPE_CHECKING: from collections.abc import AsyncIterator, Coroutine - from agentpool.agents.events.events import RichAgentStreamEvent + from wolfharness.agents.events.events import RichAgentStreamEvent # Type alias for processor callables diff --git a/src/agentpool/agents/events/tts_handlers.py b/src/wolfharness/agents/events/tts_handlers.py similarity index 95% rename from src/agentpool/agents/events/tts_handlers.py rename to src/wolfharness/agents/events/tts_handlers.py index 7c03d1169..7047393d9 100644 --- a/src/agentpool/agents/events/tts_handlers.py +++ b/src/wolfharness/agents/events/tts_handlers.py @@ -7,14 +7,14 @@ from pydantic_ai import PartDeltaEvent, PartStartEvent, TextPart, TextPartDelta -from agentpool.agents.events import UserMessageInsertedEvent +from wolfharness.agents.events import UserMessageInsertedEvent if TYPE_CHECKING: from anyvoice import TTSStream - from agentpool.agents.context import AgentContext - from agentpool.agents.events import RichAgentStreamEvent + from wolfharness.agents.context import AgentContext + from wolfharness.agents.events import RichAgentStreamEvent TTSMode = Literal["sync_sentence", "sync_run", "async_queue", "async_cancel"] TTSModel = Literal["tts-1", "tts-1-hd"] @@ -71,7 +71,7 @@ async def _close_stream(self) -> None: async def __call__(self, ctx: AgentContext[Any], event: RichAgentStreamEvent[Any]) -> None: """Handle stream events and trigger TTS synthesis.""" - from agentpool.agents.events import RunStartedEvent, StreamCompleteEvent + from wolfharness.agents.events import RunStartedEvent, StreamCompleteEvent match event: case RunStartedEvent(): diff --git a/src/agentpool/agents/exceptions.py b/src/wolfharness/agents/exceptions.py similarity index 100% rename from src/agentpool/agents/exceptions.py rename to src/wolfharness/agents/exceptions.py diff --git a/src/agentpool/agents/interactions.py b/src/wolfharness/agents/interactions.py similarity index 96% rename from src/agentpool/agents/interactions.py rename to src/wolfharness/agents/interactions.py index 446032f1d..c5ec71da8 100644 --- a/src/agentpool/agents/interactions.py +++ b/src/wolfharness/agents/interactions.py @@ -8,8 +8,8 @@ from schemez import Schema -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage if TYPE_CHECKING: @@ -17,10 +17,10 @@ from toprompt import AnyPromptType - from agentpool import AgentPool, MessageNode - from agentpool.agents import Agent - from agentpool.common_types import SupportsStructuredOutput - from agentpool.delegation.base_team import BaseTeam + from wolfharness import AgentPool, MessageNode + from wolfharness.agents import Agent + from wolfharness.common_types import SupportsStructuredOutput + from wolfharness.delegation.base_team import BaseTeam ExtractionMode = Literal["structured", "tool_calls"] @@ -72,7 +72,7 @@ def get_label(item: Any) -> str: - types use __name__ - others use __repr__ for unique identifiable string """ - from agentpool import MessageNode + from wolfharness import MessageNode match item: case str(): @@ -209,8 +209,8 @@ async def pick[T]( # Get items and create label mapping from toprompt import to_prompt - from agentpool import AgentPool - from agentpool.delegation.base_team import BaseTeam + from wolfharness import AgentPool + from wolfharness.delegation.base_team import BaseTeam match selections: case dict(): @@ -308,8 +308,8 @@ async def pick_multiple[T]( """ from toprompt import to_prompt - from agentpool import AgentPool - from agentpool.delegation.base_team import BaseTeam + from wolfharness import AgentPool + from wolfharness.delegation.base_team import BaseTeam match selections: case AgentPool(): diff --git a/src/agentpool/agents/modes.py b/src/wolfharness/agents/modes.py similarity index 98% rename from src/agentpool/agents/modes.py rename to src/wolfharness/agents/modes.py index c105b1d77..50d87a6ec 100644 --- a/src/agentpool/agents/modes.py +++ b/src/wolfharness/agents/modes.py @@ -11,7 +11,7 @@ if TYPE_CHECKING: - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent # TypeVar for generic protocol - contravariant because it's used in method parameters AgentT_contra = TypeVar("AgentT_contra", bound="BaseAgent", contravariant=True) diff --git a/src/agentpool/agents/native_agent/__init__.py b/src/wolfharness/agents/native_agent/__init__.py similarity index 100% rename from src/agentpool/agents/native_agent/__init__.py rename to src/wolfharness/agents/native_agent/__init__.py diff --git a/src/agentpool/agents/native_agent/agent.py b/src/wolfharness/agents/native_agent/agent.py similarity index 93% rename from src/agentpool/agents/native_agent/agent.py rename to src/wolfharness/agents/native_agent/agent.py index 36646d303..7fd02314e 100644 --- a/src/agentpool/agents/native_agent/agent.py +++ b/src/wolfharness/agents/native_agent/agent.py @@ -20,20 +20,20 @@ from pydantic_ai.capabilities import NativeTool, ProcessHistory from pydantic_ai.models import Model -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentContext -from agentpool.agents.events import ( +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentContext +from wolfharness.agents.events import ( RunErrorEvent, ) -from agentpool.agents.exceptions import UnknownCategoryError, UnknownModeError -from agentpool.agents.native_agent.turn import NativeTurn -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage, MessageHistory -from agentpool.storage import StorageManager -from agentpool.tools import Tool -from agentpool.tools.exceptions import ToolError -from agentpool.utils.result_utils import to_type +from wolfharness.agents.exceptions import UnknownCategoryError, UnknownModeError +from wolfharness.agents.native_agent.turn import NativeTurn +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage, MessageHistory +from wolfharness.storage import StorageManager +from wolfharness.tools import Tool +from wolfharness.tools.exceptions import ToolError +from wolfharness.utils.result_utils import to_type if TYPE_CHECKING: @@ -53,10 +53,10 @@ from toprompt import AnyPromptType from upathtools import JoinablePathLike - from agentpool.agents.context import AgentRunContext - from agentpool.agents.events import RichAgentStreamEvent - from agentpool.agents.modes import ModeCategory - from agentpool.common_types import ( + from wolfharness.agents.context import AgentRunContext + from wolfharness.agents.events import RichAgentStreamEvent + from wolfharness.agents.modes import ModeCategory + from wolfharness.common_types import ( AnyEventHandlerType, EndStrategy, ModelType, @@ -65,22 +65,22 @@ StrPath, ToolType, ) - from agentpool.delegation import AgentPool - from agentpool.hooks import AgentHooks - from agentpool.mcp_server.config_snapshot import McpConfigEntry - from agentpool.messaging import MessageNode - from agentpool.models.agents import NativeAgentConfig, ToolMode - from agentpool.models.model_configs import BaseModelConfig - from agentpool.orchestrator.turn import Turn - from agentpool.prompts.prompts import PromptType - from agentpool.sessions import SessionData - from agentpool.tools.base import FunctionTool - from agentpool.ui.base import InputProvider - from agentpool_config.knowledge import Knowledge - from agentpool_config.mcp_server import MCPServerConfig - from agentpool_config.model_capabilities import ModelCapabilities - from agentpool_config.nodes import ToolConfirmationMode - from agentpool_config.session import MemoryConfig, SessionQuery + from wolfharness.delegation import AgentPool + from wolfharness.hooks import AgentHooks + from wolfharness.mcp_server.config_snapshot import McpConfigEntry + from wolfharness.messaging import MessageNode + from wolfharness.models.agents import NativeAgentConfig, ToolMode + from wolfharness.models.model_configs import BaseModelConfig + from wolfharness.orchestrator.turn import Turn + from wolfharness.prompts.prompts import PromptType + from wolfharness.sessions import SessionData + from wolfharness.tools.base import FunctionTool + from wolfharness.ui.base import InputProvider + from wolfharness_config.knowledge import Knowledge + from wolfharness_config.mcp_server import MCPServerConfig + from wolfharness_config.model_capabilities import ModelCapabilities + from wolfharness_config.nodes import ToolConfirmationMode + from wolfharness_config.session import MemoryConfig, SessionQuery logger = get_logger(__name__) @@ -90,10 +90,10 @@ def _build_capability_from_config(config: Any) -> Any: """Build a capability instance from a config model. - Delegates to ``agentpool_config.capabilities.build_capability()``, + Delegates to ``wolfharness_config.capabilities.build_capability()``, using late import to avoid a static config→core dependency. """ - from agentpool_config.capabilities import build_capability + from wolfharness_config.capabilities import build_capability return build_capability(config) @@ -105,7 +105,7 @@ def _model_config_names(config: Any) -> list[str]: For configs with an ``identifier`` field, returns ``[identifier]``. For ``TestModelConfig``, returns ``[]`` (no tokonomics lookup). """ - from agentpool.models.model_configs import ( + from wolfharness.models.model_configs import ( AnthropicModelConfig, FallbackModelConfig, GeminiModelConfig, @@ -152,7 +152,7 @@ def _intersect_capabilities( For each field, ``False`` wins over ``True`` — if any model says ``False``, the result is ``False``. """ - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities fields = ( "image_input", @@ -212,7 +212,7 @@ class Agent[TDeps = None, OutputDataT = str](BaseAgent[TDeps, OutputDataT]): def __init__( # noqa: PLR0915 # we dont use AgentKwargs here so that we can work with explicit ones in the ctor self, - name: str = "agentpool", + name: str = "wolfharness", *, deps_type: type[TDeps] | None = None, model: ModelType, @@ -303,13 +303,13 @@ def __init__( # noqa: PLR0915 Used for capability resolution when the agent references a model variant by name. """ - from agentpool.agents.interactions import Interactions - from agentpool.agents.native_agent.hook_manager import NativeAgentHookManager - from agentpool.agents.sys_prompts import SystemPrompts - from agentpool.models.manifest import AgentsManifest - from agentpool.prompts.conversion_manager import ConversionManager - from agentpool_commands.pool import CompactCommand - from agentpool_config.session import MemoryConfig + from wolfharness.agents.interactions import Interactions + from wolfharness.agents.native_agent.hook_manager import NativeAgentHookManager + from wolfharness.agents.sys_prompts import SystemPrompts + from wolfharness.models.manifest import AgentsManifest + from wolfharness.prompts.conversion_manager import ConversionManager + from wolfharness_commands.pool import CompactCommand + from wolfharness_config.session import MemoryConfig self.model_settings = model_settings self.config = agent_config @@ -417,7 +417,7 @@ def __init__( # noqa: PLR0915 # can reuse them instead of rebuilding (preventing double-append bug). self._config_capabilities_built: list[Any] = [] if self.config and self.config.capabilities: - from agentpool_config.capabilities import build_config_capabilities + from wolfharness_config.capabilities import build_config_capabilities built_caps = build_config_capabilities(self.config.capabilities) self._external_capabilities.extend(built_caps) @@ -432,7 +432,7 @@ def _build_pool_configs(self) -> tuple[McpConfigEntry, ...]: Returns: Tuple of pool-scoped MCP config entries. """ - from agentpool.mcp_server.config_snapshot import McpConfigEntry + from wolfharness.mcp_server.config_snapshot import McpConfigEntry if self.host_context is None: return () @@ -453,7 +453,7 @@ def _build_agent_configs(self) -> tuple[McpConfigEntry, ...]: Returns: Tuple of agent-scoped MCP config entries. """ - from agentpool.mcp_server.config_snapshot import McpConfigEntry + from wolfharness.mcp_server.config_snapshot import McpConfigEntry if self._mcp_shared: return () @@ -526,7 +526,7 @@ def _resolve_history_processors(self, *, _warn: bool = True) -> list[Callable[.. if memory_cfg := self.conversation._config: processor_paths = getattr(memory_cfg, "history_processors", None) or [] if processor_paths: - from agentpool.utils.importing import import_callable + from wolfharness.utils.importing import import_callable for path in processor_paths: try: @@ -572,16 +572,16 @@ def from_config( # noqa: PLR0915 Returns: Configured Agent instance """ - from agentpool.models.manifest import AgentsManifest - from agentpool.utils.result_utils import to_type - from agentpool_config.system_prompts import ( + from wolfharness.models.manifest import AgentsManifest + from wolfharness.utils.result_utils import to_type + from wolfharness_config.system_prompts import ( FilePromptConfig, FunctionPromptConfig, LibraryPromptConfig, PackagePromptConfig, StaticPromptConfig, ) - from agentpool_toolsets.builtin.workers import WorkersTools + from wolfharness_toolsets.builtin.workers import WorkersTools name = config.name or "native_agent" # Get manifest from pool or create empty one @@ -652,7 +652,7 @@ def from_config( # noqa: PLR0915 merged_handlers: list[AnyEventHandlerType] = [*config_handlers, *(event_handlers or [])] # Handle model configuration - resolve model_variants reference if needed - from agentpool.models.model_configs import BaseModelConfig, StringModelConfig + from wolfharness.models.model_configs import BaseModelConfig, StringModelConfig model_config = config.model if ( @@ -763,9 +763,9 @@ def from_callback( name: Optional name for the agent kwargs: Additional arguments for agent """ - from agentpool.utils.inspection import get_fn_name - from agentpool.utils.model_helpers import function_to_model - from agentpool.utils.signatures import get_return_type + from wolfharness.utils.inspection import get_fn_name + from wolfharness.utils.model_helpers import function_to_model + from wolfharness.utils.signatures import get_return_type name = name or get_fn_name(callback) or "processor" model = function_to_model(callback) @@ -775,7 +775,7 @@ def from_callback( @property def name(self) -> str: """Get agent name.""" - return self._name or "agentpool" + return self._name or "wolfharness" @name.setter def name(self, value: str) -> None: @@ -792,7 +792,7 @@ def _resolve_model_string(self, model: str) -> tuple[Model, ModelSettings | None Tuple of (Model instance, ModelSettings or None) Settings are only returned for variants. """ - from agentpool.utils.model_helpers import infer_model + from wolfharness.utils.model_helpers import infer_model # Check if it's a variant ctx = self.host_context @@ -885,7 +885,7 @@ def _get_model_names_for_capability_resolution(self) -> list[str]: For fallback models, returns all sub-model names so the caller can compute the intersection (pessimistic) of capabilities. """ - from agentpool.models.model_configs import ( + from wolfharness.models.model_configs import ( BaseModelConfig, FallbackModelConfig, ) @@ -921,7 +921,7 @@ def _get_declared_capabilities(self) -> ModelCapabilities | None: Returns ``None`` when no model config or no capabilities field is present. """ - from agentpool.models.model_configs import BaseModelConfig + from wolfharness.models.model_configs import BaseModelConfig model_cfg: BaseModelConfig | str | None = self._resolved_model_config if model_cfg is None and self.config is not None: @@ -949,7 +949,7 @@ async def _resolve_model_capabilities( For ``FallbackModelConfig``, returns declared capabilities directly without per-model cache lookups or intersection. """ - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities declared = self._get_declared_capabilities() model_names = self._get_model_names_for_capability_resolution() @@ -965,7 +965,7 @@ async def _resolve_model_capabilities( declared = ModelCapabilities() if len(model_names) == 1: - from agentpool.host.stubs import resolve_capabilities + from wolfharness.host.stubs import resolve_capabilities return await resolve_capabilities( model_names[0], @@ -1043,7 +1043,7 @@ async def get_agentlet[AgentOutputType]( # noqa: PLR0915 try: provider_tools = await provider.get_tools() for tool in provider_tools: - from agentpool.agents.native_agent.tool_wrapping import wrap_tool + from wolfharness.agents.native_agent.tool_wrapping import wrap_tool context_for_tools = self.get_context( input_provider=input_provider, run_ctx=run_ctx @@ -1056,7 +1056,7 @@ async def get_agentlet[AgentOutputType]( # noqa: PLR0915 provider=type(provider).__name__, ) # 2. Hooks capability — always registered (unified tool interception) - from agentpool.agents.native_agent.tool_intercept import ToolInterceptCapability + from wolfharness.agents.native_agent.tool_intercept import ToolInterceptCapability hooks_capability = ToolInterceptCapability(hook_manager=self._hook_manager) tool_capabilities.append(hooks_capability) @@ -1064,7 +1064,7 @@ async def get_agentlet[AgentOutputType]( # noqa: PLR0915 # approval_bridge can resolve them. Block-strategy calls are # excluded from returned results so they remain unresolved for # CheckpointManager (Task 13). - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -1086,8 +1086,8 @@ async def get_agentlet[AgentOutputType]( # noqa: PLR0915 # MCP servers) before approval_bridge. Checkpoints the session, # emits ElicitationDeferredEvent, and registers a future for # later resolution when the user responds. - from agentpool.agents.native_agent.checkpoint import CheckpointManager - from agentpool.agents.native_agent.elicitation_bridge import ( + from wolfharness.agents.native_agent.checkpoint import CheckpointManager + from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, create_elicitation_bridge_capability, ) @@ -1113,7 +1113,7 @@ async def get_agentlet[AgentOutputType]( # noqa: PLR0915 ) ) # 4. Approval bridge: routes pydantic-ai deferred approvals to InputProvider - from agentpool.agents.native_agent.approval_bridge import ( + from wolfharness.agents.native_agent.approval_bridge import ( create_approval_bridge_capability, ) @@ -1129,7 +1129,7 @@ async def get_agentlet[AgentOutputType]( # noqa: PLR0915 if pool is not None: pool_capabilities = pool.skill_capabilities if pool_capabilities: - from agentpool.capabilities.skill_manager_cap import SkillManagerCap + from wolfharness.capabilities.skill_manager_cap import SkillManagerCap tool_capabilities.extend( cap for cap in pool_capabilities if isinstance(cap, SkillManagerCap) @@ -1153,7 +1153,7 @@ async def get_agentlet[AgentOutputType]( # noqa: PLR0915 if registry is not None: session_id = run_ctx.session_id if session_id not in self._registered_session_ids: - from agentpool.capabilities.extension_registry import ( + from wolfharness.capabilities.extension_registry import ( Scope, ScopeLevel, ) @@ -1164,7 +1164,7 @@ async def get_agentlet[AgentOutputType]( # noqa: PLR0915 if pool is not None: pool_caps = pool.skill_capabilities if pool_caps: - from agentpool.capabilities.skill_manager_cap import ( + from wolfharness.capabilities.skill_manager_cap import ( SkillManagerCap, ) @@ -1221,7 +1221,7 @@ async def get_agentlet[AgentOutputType]( # noqa: PLR0915 if self.config and self.config.capabilities and not self._config_capabilities_built: from pydantic import BaseModel as _BaseModel - from agentpool_config.capabilities import ( + from wolfharness_config.capabilities import ( EntryPointCapabilityConfig, GenericCapabilityConfig, build_capability, @@ -1256,7 +1256,7 @@ async def get_agentlet[AgentOutputType]( # noqa: PLR0915 # resolved model capabilities. This is NOT auto-injection — # the user must explicitly configure ``type: modality_filter`` # in YAML capabilities for this to activate. - from agentpool.capabilities.modality_filter import ( + from wolfharness.capabilities.modality_filter import ( ModalityFilterCapability, ) @@ -1283,7 +1283,7 @@ async def get_agentlet[AgentOutputType]( # noqa: PLR0915 if self.host_context is not None and run_ctx is not None: registry = self.host_context.extension_registry if registry is not None: - from agentpool.capabilities.extension_registry import ( + from wolfharness.capabilities.extension_registry import ( Scope, ScopeLevel, ) @@ -1337,15 +1337,15 @@ async def _execute_node(self, *prompts: Any, **kwargs: Any) -> ChatMessage[Any]: """Execute agent as a pydantic-graph step node. Detects graph context via *_state* in kwargs (injected by - :class:`~agentpool.messaging.graph_adapter.MessageNodeStep`) and - delegates execution to :class:`~agentpool.agents.native_agent.turn.NativeTurn`, + :class:`~wolfharness.messaging.graph_adapter.MessageNodeStep`) and + delegates execution to :class:`~wolfharness.agents.native_agent.turn.NativeTurn`, forwarding all events to the EventBus for the parent graph to drain. Args: *prompts: Input prompts passed from the graph. **kwargs: Must contain ``_state`` (an - :class:`~agentpool.messaging.graph_adapter.AgentPoolState`). + :class:`~wolfharness.messaging.graph_adapter.AgentPoolState`). Returns: The final response ChatMessage. @@ -1353,7 +1353,7 @@ async def _execute_node(self, *prompts: Any, **kwargs: Any) -> ChatMessage[Any]: Raises: RuntimeError: If ``_state`` or required sub-keys are missing. """ - from agentpool.messaging.graph_adapter import AgentPoolState + from wolfharness.messaging.graph_adapter import AgentPoolState state = kwargs.get("_state") if not isinstance(state, AgentPoolState): @@ -1369,7 +1369,7 @@ async def _execute_node(self, *prompts: Any, **kwargs: Any) -> ChatMessage[Any]: # Get or create EventBus for graph path — events flow through EventBus # instead of state.event_queue. - from agentpool.orchestrator.core import EventBus + from wolfharness.orchestrator.core import EventBus event_bus = run_ctx.event_bus if event_bus is None: @@ -1418,7 +1418,7 @@ async def _stream_events( ) -> AsyncIterator[RichAgentStreamEvent[OutputDataT]]: """Stream agent events in real-time using NativeTurn. - Delegates to :class:`~agentpool.agents.native_agent.turn.NativeTurn` + Delegates to :class:`~wolfharness.agents.native_agent.turn.NativeTurn` which drives the PydanticAI agent run loop with ``agent_run.next(node)``, yielding fine-grained streaming events including ``RunStartedEvent``, ``PartStartEvent``, ``ToolCallStartEvent``, and ``StreamCompleteEvent``. @@ -1432,7 +1432,7 @@ async def _stream_events( # Get or create EventBus — events go directly to EventBus. event_bus = run_ctx.event_bus if event_bus is None: - from agentpool.orchestrator.core import EventBus + from wolfharness.orchestrator.core import EventBus event_bus = EventBus() run_ctx.event_bus = event_bus @@ -1443,7 +1443,7 @@ async def _stream_events( model_messages.extend(chat_msg.messages) # Inject RetryPromptPart for any trailing unprocessed tool calls # (e.g. from a cancelled turn). - from agentpool.orchestrator.run import inject_cancelled_tool_results + from wolfharness.orchestrator.run import inject_cancelled_tool_results model_messages = inject_cancelled_tool_results(model_messages) @@ -1522,7 +1522,7 @@ def create_turn( # deferred_tool_results (same tool_call_id appears in both, # causing "already executed" or mismatch errors). if "deferred_tool_results" not in pydantic_ai_kwargs: - from agentpool.orchestrator.run import inject_cancelled_tool_results + from wolfharness.orchestrator.run import inject_cancelled_tool_results message_history = inject_cancelled_tool_results(message_history) return NativeTurn( @@ -1765,7 +1765,7 @@ def _parse_npmmirror_providers( # Zero additional network requests — data is already available. if all_models: try: - from agentpool.host.stubs import _get_default_cache + from wolfharness.host.stubs import _get_default_cache cache = _get_default_cache() for model_info in all_models: @@ -1872,8 +1872,8 @@ def _parse_npmmirror_model( async def get_modes(self) -> list[ModeCategory]: """Get available mode categories for this agent.""" - from agentpool.agents.modes import ModeCategory as ModeCategoryRuntime, ModeInfo - from agentpool.agents.native_agent.helpers import ( + from wolfharness.agents.modes import ModeCategory as ModeCategoryRuntime, ModeInfo + from wolfharness.agents.native_agent.helpers import ( get_model_category, get_permission_category, ) diff --git a/src/agentpool/agents/native_agent/approval_bridge.py b/src/wolfharness/agents/native_agent/approval_bridge.py similarity index 96% rename from src/agentpool/agents/native_agent/approval_bridge.py rename to src/wolfharness/agents/native_agent/approval_bridge.py index 72f34ecc3..240e7d69c 100644 --- a/src/agentpool/agents/native_agent/approval_bridge.py +++ b/src/wolfharness/agents/native_agent/approval_bridge.py @@ -19,12 +19,12 @@ ToolDenied, ) -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: - from agentpool import Agent - from agentpool.agents.context import AgentContext, ConfirmationResult + from wolfharness import Agent + from wolfharness.agents.context import AgentContext, ConfirmationResult logger = get_logger(__name__) diff --git a/src/agentpool/agents/native_agent/checkpoint.py b/src/wolfharness/agents/native_agent/checkpoint.py similarity index 96% rename from src/agentpool/agents/native_agent/checkpoint.py rename to src/wolfharness/agents/native_agent/checkpoint.py index 7a81a4c88..fdcc87bb6 100644 --- a/src/agentpool/agents/native_agent/checkpoint.py +++ b/src/wolfharness/agents/native_agent/checkpoint.py @@ -10,9 +10,9 @@ from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any -from agentpool.agents.events.events import ToolCallDeferredEvent -from agentpool.log import get_logger -from agentpool.storage.serialization import ( +from wolfharness.agents.events.events import ToolCallDeferredEvent +from wolfharness.log import get_logger +from wolfharness.storage.serialization import ( deferred_calls_adapter, messages_adapter, ) @@ -21,8 +21,8 @@ if TYPE_CHECKING: from pydantic_ai.messages import ModelMessage - from agentpool.sessions.models import PendingDeferredCall - from agentpool.storage.manager import StorageManager + from wolfharness.sessions.models import PendingDeferredCall + from wolfharness.storage.manager import StorageManager logger = get_logger(__name__) @@ -185,7 +185,7 @@ async def checkpoint( message_count > self._compaction_threshold_messages or byte_size > self._compaction_threshold_bytes ): - from agentpool.messaging.compaction import ( + from wolfharness.messaging.compaction import ( CompactionPipeline, KeepLastMessages, TruncateToolOutputs, diff --git a/src/agentpool/agents/native_agent/deferred_bridge.py b/src/wolfharness/agents/native_agent/deferred_bridge.py similarity index 97% rename from src/agentpool/agents/native_agent/deferred_bridge.py rename to src/wolfharness/agents/native_agent/deferred_bridge.py index 7dd3fe4de..2091fc35b 100644 --- a/src/agentpool/agents/native_agent/deferred_bridge.py +++ b/src/wolfharness/agents/native_agent/deferred_bridge.py @@ -24,14 +24,14 @@ from pydantic_ai.capabilities import HandleDeferredToolCalls from pydantic_ai.messages import ToolReturn -from agentpool.agents.events.events import ToolCallDeferredEvent -from agentpool.log import get_logger +from wolfharness.agents.events.events import ToolCallDeferredEvent +from wolfharness.log import get_logger if TYPE_CHECKING: from pydantic_ai.tools import DeferredToolRequests, DeferredToolResults, RunContext - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext logger = get_logger(__name__) diff --git a/src/agentpool/agents/native_agent/elicitation_bridge.py b/src/wolfharness/agents/native_agent/elicitation_bridge.py similarity index 97% rename from src/agentpool/agents/native_agent/elicitation_bridge.py rename to src/wolfharness/agents/native_agent/elicitation_bridge.py index 2b4c2ea0c..ea62a429e 100644 --- a/src/agentpool/agents/native_agent/elicitation_bridge.py +++ b/src/wolfharness/agents/native_agent/elicitation_bridge.py @@ -24,18 +24,18 @@ from mcp import types from pydantic_ai.capabilities import HandleDeferredToolCalls -from agentpool.agents.events.events import ElicitationDeferredEvent -from agentpool.log import get_logger -from agentpool.sessions.models import PendingDeferredCall +from wolfharness.agents.events.events import ElicitationDeferredEvent +from wolfharness.log import get_logger +from wolfharness.sessions.models import PendingDeferredCall if TYPE_CHECKING: from pydantic_ai.messages import ModelMessage from pydantic_ai.tools import DeferredToolRequests, DeferredToolResults, RunContext - from agentpool.agents.context import AgentContext - from agentpool.agents.native_agent.checkpoint import CheckpointManager - from agentpool.sessions.models import ElicitationResumePayload + from wolfharness.agents.context import AgentContext + from wolfharness.agents.native_agent.checkpoint import CheckpointManager + from wolfharness.sessions.models import ElicitationResumePayload logger = get_logger(__name__) diff --git a/src/agentpool/agents/native_agent/elicitation_strategy.py b/src/wolfharness/agents/native_agent/elicitation_strategy.py similarity index 96% rename from src/agentpool/agents/native_agent/elicitation_strategy.py rename to src/wolfharness/agents/native_agent/elicitation_strategy.py index 4f1734ccb..86d5b8368 100644 --- a/src/agentpool/agents/native_agent/elicitation_strategy.py +++ b/src/wolfharness/agents/native_agent/elicitation_strategy.py @@ -18,8 +18,8 @@ if TYPE_CHECKING: from pydantic_ai.messages import ModelMessage - from agentpool.agents.native_agent.checkpoint import CheckpointManager - from agentpool.sessions.models import ElicitationResumePayload, PendingDeferredCall + from wolfharness.agents.native_agent.checkpoint import CheckpointManager + from wolfharness.sessions.models import ElicitationResumePayload, PendingDeferredCall @runtime_checkable diff --git a/src/agentpool/agents/native_agent/helpers.py b/src/wolfharness/agents/native_agent/helpers.py similarity index 92% rename from src/agentpool/agents/native_agent/helpers.py rename to src/wolfharness/agents/native_agent/helpers.py index 253994e13..23d340eda 100644 --- a/src/agentpool/agents/native_agent/helpers.py +++ b/src/wolfharness/agents/native_agent/helpers.py @@ -25,17 +25,17 @@ VideoUrl, ) -from agentpool.agents.events import ToolCallCompleteEvent, UserMessageInsertedEvent -from agentpool.agents.modes import ModeCategory, ModeInfo -from agentpool.utils.pydantic_ai_helpers import safe_args_as_dict +from wolfharness.agents.events import ToolCallCompleteEvent, UserMessageInsertedEvent +from wolfharness.agents.modes import ModeCategory, ModeInfo +from wolfharness.utils.pydantic_ai_helpers import safe_args_as_dict if TYPE_CHECKING: from tokonomics.model_discovery import ModelInfo - from agentpool.agents.context import AgentRunContext - from agentpool.agents.events import RichAgentStreamEvent - from agentpool_config.nodes import ToolConfirmationMode + from wolfharness.agents.context import AgentRunContext + from wolfharness.agents.events import RichAgentStreamEvent + from wolfharness_config.nodes import ToolConfirmationMode async def process_tool_event( @@ -186,7 +186,7 @@ def _summarize_content_block(block: Any) -> str: block, BinaryImage | BinaryContent | ImageUrl | AudioUrl | VideoUrl | DocumentUrl | UploadedFile, ): - from agentpool.capabilities.modality_utils import describe_multimodal_content + from wolfharness.capabilities.modality_utils import describe_multimodal_content return describe_multimodal_content(block) return f"[{type(block).__name__}]" diff --git a/src/agentpool/agents/native_agent/hook_manager.py b/src/wolfharness/agents/native_agent/hook_manager.py similarity index 96% rename from src/agentpool/agents/native_agent/hook_manager.py rename to src/wolfharness/agents/native_agent/hook_manager.py index 0991f639c..ff552d5df 100644 --- a/src/agentpool/agents/native_agent/hook_manager.py +++ b/src/wolfharness/agents/native_agent/hook_manager.py @@ -15,15 +15,15 @@ from typing import TYPE_CHECKING, Any -from agentpool.hooks.base import HookResult -from agentpool.log import get_logger +from wolfharness.hooks.base import HookResult +from wolfharness.log import get_logger if TYPE_CHECKING: from exxec import ExecutionEnvironment - from agentpool.agents.base_agent import BaseAgent - from agentpool.hooks import AgentHooks + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.hooks import AgentHooks logger = get_logger(__name__) diff --git a/src/agentpool/agents/native_agent/process_history_capability.py b/src/wolfharness/agents/native_agent/process_history_capability.py similarity index 98% rename from src/agentpool/agents/native_agent/process_history_capability.py rename to src/wolfharness/agents/native_agent/process_history_capability.py index 2e336b354..ec04e5407 100644 --- a/src/agentpool/agents/native_agent/process_history_capability.py +++ b/src/wolfharness/agents/native_agent/process_history_capability.py @@ -1,6 +1,7 @@ """Adapter for converting AgentPool history processors to pydantic-ai ProcessHistory capabilities. -Replaces manual history processor resolution in :class:`~agentpool.agents.native_agent.agent.Agent` +Replaces manual history processor resolution in +:class:`~wolfharness.agents.native_agent.agent.Agent` with a unified capability-based approach. AgentPool history processors may have untyped ``RunContext`` parameters; pydantic-ai's ``takes_run_context()`` requires the first parameter to be explicitly typed as ``RunContext``. This adapter wraps diff --git a/src/agentpool/agents/native_agent/tool_intercept.py b/src/wolfharness/agents/native_agent/tool_intercept.py similarity index 95% rename from src/agentpool/agents/native_agent/tool_intercept.py rename to src/wolfharness/agents/native_agent/tool_intercept.py index 138bd95cc..6013231da 100644 --- a/src/agentpool/agents/native_agent/tool_intercept.py +++ b/src/wolfharness/agents/native_agent/tool_intercept.py @@ -25,7 +25,7 @@ from pydantic_ai.capabilities.abstract import AbstractCapability from pydantic_ai.exceptions import ApprovalRequired, CallDeferred, ToolRetryError -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -36,7 +36,7 @@ from pydantic_ai.tools import RunContext, ToolDefinition from pydantic_ai.toolsets import AbstractToolset - from agentpool.agents.native_agent.hook_manager import NativeAgentHookManager + from wolfharness.agents.native_agent.hook_manager import NativeAgentHookManager logger = get_logger(__name__) @@ -120,7 +120,7 @@ async def wrap_tool_execute( from pydantic_ai.messages import ToolReturn - from agentpool.tools.base import ToolResult + from wolfharness.tools.base import ToolResult agent_ctx = ctx.deps tool_start_times: dict[str, float] | None = getattr(agent_ctx, "_tool_start_times", None) @@ -129,7 +129,7 @@ async def wrap_tool_execute( agent_ctx._tool_start_times = tool_start_times tool_start_times[call.tool_call_id] = perf_counter() - from agentpool.tasks.exceptions import RunAbortedError, ToolSkippedError + from wolfharness.tasks.exceptions import RunAbortedError, ToolSkippedError try: result = await handler(args) @@ -185,7 +185,7 @@ async def before_tool_execute( """ from pydantic_ai import ModelRetry - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext agent_ctx = ctx.deps env = agent_ctx.agent.env if isinstance(agent_ctx, AgentContext) else None @@ -232,8 +232,8 @@ async def after_tool_execute( Also consumes pending prompt injections from ``PromptInjectionManager``. """ - from agentpool.agents.context import AgentContext - from agentpool.agents.native_agent.tool_wrapping import ( + from wolfharness.agents.context import AgentContext + from wolfharness.agents.native_agent.tool_wrapping import ( _inject_additional_context, ) diff --git a/src/agentpool/agents/native_agent/tool_wrapping.py b/src/wolfharness/agents/native_agent/tool_wrapping.py similarity index 96% rename from src/agentpool/agents/native_agent/tool_wrapping.py rename to src/wolfharness/agents/native_agent/tool_wrapping.py index 4bec67686..bc4a53db7 100644 --- a/src/agentpool/agents/native_agent/tool_wrapping.py +++ b/src/wolfharness/agents/native_agent/tool_wrapping.py @@ -15,11 +15,11 @@ from pydantic_ai.exceptions import ApprovalRequired, CallDeferred from pydantic_ai.messages import ToolReturn -from agentpool.agents.context import AgentContext -from agentpool.log import get_logger -from agentpool.tools.base import ToolResult -from agentpool.utils.inspection import execute, get_argument_key -from agentpool.utils.signatures import create_modified_signature, update_signature +from wolfharness.agents.context import AgentContext +from wolfharness.log import get_logger +from wolfharness.tools.base import ToolResult +from wolfharness.utils.inspection import execute, get_argument_key +from wolfharness.utils.signatures import create_modified_signature, update_signature logger = get_logger(__name__) @@ -27,7 +27,7 @@ if TYPE_CHECKING: from collections.abc import Awaitable, Callable - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool def _inject_additional_context( diff --git a/src/agentpool/agents/native_agent/turn.py b/src/wolfharness/agents/native_agent/turn.py similarity index 97% rename from src/agentpool/agents/native_agent/turn.py rename to src/wolfharness/agents/native_agent/turn.py index ca23ea276..48bcc97fd 100644 --- a/src/agentpool/agents/native_agent/turn.py +++ b/src/wolfharness/agents/native_agent/turn.py @@ -21,28 +21,28 @@ from pydantic_ai.usage import RequestUsage from pydantic_graph import End -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( RunErrorEvent, StepErrorMetadata, StepUsageEvent, StreamCompleteEvent, ToolCallCompleteEvent, ) -from agentpool.agents.native_agent.helpers import extract_text_from_messages -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage -from agentpool.messaging.messages import TokenCost -from agentpool.observability.spans import safe_span -from agentpool.orchestrator.event_mapper import ( +from wolfharness.agents.native_agent.helpers import extract_text_from_messages +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage +from wolfharness.messaging.messages import TokenCost +from wolfharness.observability.spans import safe_span +from wolfharness.orchestrator.event_mapper import ( EventMapper, normalize_thinking_parts_in_messages, sanitize_tool_call_args_in_messages, ) -from agentpool.orchestrator.turn import HookAwareTurn, Turn -from agentpool.tasks.exceptions import RunAbortedError -from agentpool.tools.base import is_terminal_tool -from agentpool.utils.pydantic_ai_helpers import flatten_prompts -from agentpool.utils.usage import diff_usage +from wolfharness.orchestrator.turn import HookAwareTurn, Turn +from wolfharness.tasks.exceptions import RunAbortedError +from wolfharness.tools.base import is_terminal_tool +from wolfharness.utils.pydantic_ai_helpers import flatten_prompts +from wolfharness.utils.usage import diff_usage if TYPE_CHECKING: @@ -51,10 +51,10 @@ from pydantic_ai import Agent as PydanticAgent from pydantic_ai.messages import ModelMessage - from agentpool.agents.context import AgentRunContext - from agentpool.agents.events.events import RichAgentStreamEvent - from agentpool.agents.native_agent.agent import Agent - from agentpool.hooks import AgentHooks + from wolfharness.agents.context import AgentRunContext + from wolfharness.agents.events.events import RichAgentStreamEvent + from wolfharness.agents.native_agent.agent import Agent + from wolfharness.hooks import AgentHooks logger = get_logger(__name__) @@ -157,7 +157,7 @@ async def execute(self) -> AsyncGenerator[RichAgentStreamEvent[Any]]: # noqa: P turn_id=self._run_ctx.turn_id, session_id=self._run_ctx.session_id, ): - from agentpool.observability.trace import get_trace_id + from wolfharness.observability.trace import get_trace_id logfire.info( "Turn started", diff --git a/src/agentpool/agents/prompt_injection.py b/src/wolfharness/agents/prompt_injection.py similarity index 98% rename from src/agentpool/agents/prompt_injection.py rename to src/wolfharness/agents/prompt_injection.py index 5491dbfa6..6e52f5973 100644 --- a/src/agentpool/agents/prompt_injection.py +++ b/src/wolfharness/agents/prompt_injection.py @@ -6,7 +6,7 @@ from __future__ import annotations -from agentpool.log import get_logger +from wolfharness.log import get_logger logger = get_logger(__name__) diff --git a/src/agentpool/agents/staged_content.py b/src/wolfharness/agents/staged_content.py similarity index 97% rename from src/agentpool/agents/staged_content.py rename to src/wolfharness/agents/staged_content.py index 0d02789af..adcd114cd 100644 --- a/src/agentpool/agents/staged_content.py +++ b/src/wolfharness/agents/staged_content.py @@ -7,7 +7,7 @@ from pydantic_ai import UserPromptPart -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: diff --git a/src/agentpool/agents/sys_prompts.py b/src/wolfharness/agents/sys_prompts.py similarity index 96% rename from src/agentpool/agents/sys_prompts.py rename to src/wolfharness/agents/sys_prompts.py index 51ea378b6..ba5c43a99 100644 --- a/src/agentpool/agents/sys_prompts.py +++ b/src/wolfharness/agents/sys_prompts.py @@ -5,8 +5,8 @@ from functools import cache from typing import TYPE_CHECKING, Any, Literal -from agentpool import text_templates -from agentpool.agents.exceptions import PromptResolutionError +from wolfharness import text_templates +from wolfharness.agents.exceptions import PromptResolutionError if TYPE_CHECKING: @@ -16,8 +16,8 @@ from pydantic_ai import RunContext from toprompt import AnyPromptType - from agentpool.agents.base_agent import BaseAgent - from agentpool.prompts.manager import PromptManager + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.prompts.manager import PromptManager ToolInjectionMode = Literal["off", "all"] @@ -185,7 +185,7 @@ async def to_pydantic_ai_instructions( """ import inspect - from agentpool.utils.context_wrapping import wrap_instruction + from wolfharness.utils.context_wrapping import wrap_instruction instructions: list[str | Callable[[RunContext[Any]], Awaitable[str]]] = [] diff --git a/src/agentpool/agents/tool_call_accumulator.py b/src/wolfharness/agents/tool_call_accumulator.py similarity index 100% rename from src/agentpool/agents/tool_call_accumulator.py rename to src/wolfharness/agents/tool_call_accumulator.py diff --git a/src/agentpool/auth/__init__.py b/src/wolfharness/auth/__init__.py similarity index 100% rename from src/agentpool/auth/__init__.py rename to src/wolfharness/auth/__init__.py diff --git a/src/agentpool/auth/anthropic_auth.py b/src/wolfharness/auth/anthropic_auth.py similarity index 100% rename from src/agentpool/auth/anthropic_auth.py rename to src/wolfharness/auth/anthropic_auth.py diff --git a/src/agentpool/capabilities/AGENTS.md b/src/wolfharness/capabilities/AGENTS.md similarity index 98% rename from src/agentpool/capabilities/AGENTS.md rename to src/wolfharness/capabilities/AGENTS.md index d4ed62d4a..b7a0fb03b 100644 --- a/src/agentpool/capabilities/AGENTS.md +++ b/src/wolfharness/capabilities/AGENTS.md @@ -26,7 +26,7 @@ - **AgentContext is frozen**: Constructed by RunLoop per-turn. Carries `agent_registry`, `delegation`, `session`, `scope`, `resources`, `host`. - **DelegationService limits exposure**: `spawn_subagent(name, prompt)` and `get_available_agents()` only. Does not expose full `AgentPool`. - **SkillCapability injection order**: In `get_agentlet()`, skill capabilities are injected at position 5 (after MCP, deferred bridge, approval bridge, and hook capabilities). -- **Entry-point registry**: Custom capabilities discovered via `agentpool.capabilities` entry-point group. +- **Entry-point registry**: Custom capabilities discovered via `wolfharness.capabilities` entry-point group. - **ExtensionRegistry scope hierarchy**: `POOL → AGENT → SESSION → TURN`. Agents outlive sessions (AGENT scope keyed by `agent_name` only, no `session_id`). `clear_session()` removes SESSION and TURN entries during teardown. Factory registers config-derived caps at AGENT scope; `get_agentlet()` registers session-specific caps (MCP, SkillManagerCap, ResourceCapability) at SESSION scope. - **ScopeLevel reorder is breaking**: `Scope` field order changed — `agent_name` is now 2nd (after `level`), `session_id` is 3rd. AGENT scope queries no longer include SESSION caps. diff --git a/src/agentpool/capabilities/__init__.py b/src/wolfharness/capabilities/__init__.py similarity index 100% rename from src/agentpool/capabilities/__init__.py rename to src/wolfharness/capabilities/__init__.py diff --git a/src/agentpool/capabilities/agent_context.py b/src/wolfharness/capabilities/agent_context.py similarity index 86% rename from src/agentpool/capabilities/agent_context.py rename to src/wolfharness/capabilities/agent_context.py index 470e825bc..a2eaa8bd9 100644 --- a/src/agentpool/capabilities/agent_context.py +++ b/src/wolfharness/capabilities/agent_context.py @@ -5,7 +5,7 @@ per-turn services that agent tools and capabilities need. This class is the ``deps`` type for pydantic-ai's ``RunContext``. -It is distinct from ``agentpool.agents.context.AgentContext`` which IS +It is distinct from ``wolfharness.agents.context.AgentContext`` which IS the ``RunContext`` itself. The name ``AgentContextDeps`` makes this relationship explicit: ``RunContext[AgentContextDeps]``. """ @@ -18,12 +18,12 @@ if TYPE_CHECKING: - from agentpool.capabilities.delegation import DelegationService - from agentpool.capabilities.extension_registry import ExtensionRegistry - from agentpool.host.context import HostContext, RunScope - from agentpool.host.registry import AgentRegistry - from agentpool.orchestrator.session_controller import SessionState - from agentpool_config.team_mode import TeamModeConfig + from wolfharness.capabilities.delegation import DelegationService + from wolfharness.capabilities.extension_registry import ExtensionRegistry + from wolfharness.host.context import HostContext, RunScope + from wolfharness.host.registry import AgentRegistry + from wolfharness.orchestrator.session_controller import SessionState + from wolfharness_config.team_mode import TeamModeConfig @dataclass(frozen=True, slots=True) @@ -77,7 +77,7 @@ def resolve_agent_context_from_deps( RuntimeError: If deps is None, ``.data`` is None, or deps is neither ``RuntimeAgentContext`` nor ``AgentContextDeps``. """ - from agentpool.agents.context import AgentContext as RuntimeAgentContext + from wolfharness.agents.context import AgentContext as RuntimeAgentContext if deps is None: msg = f"{capability_name} requires AgentContextDeps as deps. Got: None" @@ -103,7 +103,7 @@ def resolve_agent_context_from_deps( def __getattr__(name: str) -> Any: if name == "AgentContext": warnings.warn( - "agentpool.capabilities.agent_context.AgentContext is deprecated; " + "wolfharness.capabilities.agent_context.AgentContext is deprecated; " "use AgentContextDeps instead.", DeprecationWarning, stacklevel=2, diff --git a/src/agentpool/capabilities/background_task/__init__.py b/src/wolfharness/capabilities/background_task/__init__.py similarity index 73% rename from src/agentpool/capabilities/background_task/__init__.py rename to src/wolfharness/capabilities/background_task/__init__.py index 4009822d8..60b7ca5da 100644 --- a/src/agentpool/capabilities/background_task/__init__.py +++ b/src/wolfharness/capabilities/background_task/__init__.py @@ -7,17 +7,17 @@ from __future__ import annotations -from agentpool.capabilities.background_task.capability import ( +from wolfharness.capabilities.background_task.capability import ( BackgroundTaskCapability, ) -from agentpool.capabilities.background_task.manager import ( +from wolfharness.capabilities.background_task.manager import ( BackgroundTaskManager, TERMINAL_STATES, ) -from agentpool.capabilities.background_task.notification import ( +from wolfharness.capabilities.background_task.notification import ( NotificationBatcher, ) -from agentpool.capabilities.background_task.types import ( +from wolfharness.capabilities.background_task.types import ( BackgroundTask, SessionTaskState, TaskHandle, diff --git a/src/agentpool/capabilities/background_task/capability.py b/src/wolfharness/capabilities/background_task/capability.py similarity index 98% rename from src/agentpool/capabilities/background_task/capability.py rename to src/wolfharness/capabilities/background_task/capability.py index 2c1138060..29efcf0e3 100644 --- a/src/agentpool/capabilities/background_task/capability.py +++ b/src/wolfharness/capabilities/background_task/capability.py @@ -26,9 +26,9 @@ from pydantic_ai.toolsets import AgentToolset, FunctionToolset from pydantic_graph import End -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentContext -from agentpool.agents.events import ( +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentContext +from wolfharness.agents.events import ( PartDeltaEvent, RunErrorEvent, RunFailedEvent, @@ -36,18 +36,18 @@ ToolCallCompleteEvent, ToolCallStartEvent, ) -from agentpool.capabilities.background_task.manager import TERMINAL_STATES, BackgroundTaskManager -from agentpool.capabilities.background_task.notification import ( +from wolfharness.capabilities.background_task.manager import TERMINAL_STATES, BackgroundTaskManager +from wolfharness.capabilities.background_task.notification import ( NotificationBatcher, _format_duration, ) -from agentpool.capabilities.background_task.types import BackgroundTask, SessionTaskState -from agentpool.orchestrator.core import EventEnvelope -from agentpool.skills.uri_resolver import ResolvedSkillURI -from agentpool.tools.exceptions import ToolError -from agentpool.utils.tool_schema import apply_params_schema, load_tool_schema -from agentpool_config.context import get_config_dir -from agentpool_toolsets.builtin.skills import load_skill_for_node +from wolfharness.capabilities.background_task.types import BackgroundTask, SessionTaskState +from wolfharness.orchestrator.core import EventEnvelope +from wolfharness.skills.uri_resolver import ResolvedSkillURI +from wolfharness.tools.exceptions import ToolError +from wolfharness.utils.tool_schema import apply_params_schema, load_tool_schema +from wolfharness_config.context import get_config_dir +from wolfharness_toolsets.builtin.skills import load_skill_for_node if TYPE_CHECKING: @@ -58,8 +58,8 @@ from pydantic_ai.run import AgentRunResult from schemez.functionschema import OpenAIFunctionDefinition - from agentpool.agents.context import AgentRunContext - from agentpool.orchestrator.session_pool import SessionPool + from wolfharness.agents.context import AgentRunContext + from wolfharness.orchestrator.session_pool import SessionPool MAX_DELEGATION_DEPTH = 5 diff --git a/src/agentpool/capabilities/background_task/manager.py b/src/wolfharness/capabilities/background_task/manager.py similarity index 99% rename from src/agentpool/capabilities/background_task/manager.py rename to src/wolfharness/capabilities/background_task/manager.py index e5d8c207c..ed8c72fe2 100644 --- a/src/agentpool/capabilities/background_task/manager.py +++ b/src/wolfharness/capabilities/background_task/manager.py @@ -12,7 +12,7 @@ import logfire -from agentpool.capabilities.background_task.types import ( +from wolfharness.capabilities.background_task.types import ( BackgroundTask, TaskHandle, TaskStatus, diff --git a/src/agentpool/capabilities/background_task/notification.py b/src/wolfharness/capabilities/background_task/notification.py similarity index 99% rename from src/agentpool/capabilities/background_task/notification.py rename to src/wolfharness/capabilities/background_task/notification.py index 6a3f9ea0e..7010cbc9f 100644 --- a/src/agentpool/capabilities/background_task/notification.py +++ b/src/wolfharness/capabilities/background_task/notification.py @@ -20,7 +20,7 @@ from collections.abc import Awaitable, Callable from datetime import datetime - from agentpool.capabilities.background_task.types import ( + from wolfharness.capabilities.background_task.types import ( BackgroundTask, TaskStatus, ) diff --git a/config/tools/background_cancel.yaml b/src/wolfharness/capabilities/background_task/schemas/background_cancel.yaml similarity index 100% rename from config/tools/background_cancel.yaml rename to src/wolfharness/capabilities/background_task/schemas/background_cancel.yaml diff --git a/config/tools/background_output.yaml b/src/wolfharness/capabilities/background_task/schemas/background_output.yaml similarity index 100% rename from config/tools/background_output.yaml rename to src/wolfharness/capabilities/background_task/schemas/background_output.yaml diff --git a/config/tools/steer_task.yaml b/src/wolfharness/capabilities/background_task/schemas/steer_task.yaml similarity index 100% rename from config/tools/steer_task.yaml rename to src/wolfharness/capabilities/background_task/schemas/steer_task.yaml diff --git a/config/tools/task.yaml b/src/wolfharness/capabilities/background_task/schemas/task.yaml similarity index 100% rename from config/tools/task.yaml rename to src/wolfharness/capabilities/background_task/schemas/task.yaml diff --git a/src/agentpool/capabilities/background_task/types.py b/src/wolfharness/capabilities/background_task/types.py similarity index 93% rename from src/agentpool/capabilities/background_task/types.py rename to src/wolfharness/capabilities/background_task/types.py index b703815c2..6110f8cb9 100644 --- a/src/agentpool/capabilities/background_task/types.py +++ b/src/wolfharness/capabilities/background_task/types.py @@ -11,8 +11,8 @@ if TYPE_CHECKING: from collections.abc import Callable - from agentpool.capabilities.background_task.manager import BackgroundTaskManager - from agentpool.capabilities.background_task.notification import NotificationBatcher + from wolfharness.capabilities.background_task.manager import BackgroundTaskManager + from wolfharness.capabilities.background_task.notification import NotificationBatcher TaskStatus = Literal[ "pending", diff --git a/src/agentpool/capabilities/change_event.py b/src/wolfharness/capabilities/change_event.py similarity index 100% rename from src/agentpool/capabilities/change_event.py rename to src/wolfharness/capabilities/change_event.py diff --git a/src/agentpool/capabilities/code_mode_capability.py b/src/wolfharness/capabilities/code_mode_capability.py similarity index 97% rename from src/agentpool/capabilities/code_mode_capability.py rename to src/wolfharness/capabilities/code_mode_capability.py index 871eb4bdc..51008719b 100644 --- a/src/agentpool/capabilities/code_mode_capability.py +++ b/src/wolfharness/capabilities/code_mode_capability.py @@ -18,8 +18,8 @@ from pydantic_ai.toolsets import AgentToolset, FunctionToolset from schemez.code_generation.namespace_callable import NamespaceCallable -from agentpool.capabilities.codemode.default_prompt import USAGE -from agentpool.capabilities.codemode.helpers import ( +from wolfharness.capabilities.codemode.default_prompt import USAGE +from wolfharness.capabilities.codemode.helpers import ( tools_to_codegen, validate_code, ) @@ -28,7 +28,7 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator, Sequence - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool _CODE_MODE_INSTRUCTIONS = ( diff --git a/src/agentpool/capabilities/codemode/__init__.py b/src/wolfharness/capabilities/codemode/__init__.py similarity index 100% rename from src/agentpool/capabilities/codemode/__init__.py rename to src/wolfharness/capabilities/codemode/__init__.py diff --git a/src/agentpool/capabilities/codemode/default_prompt.py b/src/wolfharness/capabilities/codemode/default_prompt.py similarity index 100% rename from src/agentpool/capabilities/codemode/default_prompt.py rename to src/wolfharness/capabilities/codemode/default_prompt.py diff --git a/src/agentpool/capabilities/codemode/helpers.py b/src/wolfharness/capabilities/codemode/helpers.py similarity index 94% rename from src/agentpool/capabilities/codemode/helpers.py rename to src/wolfharness/capabilities/codemode/helpers.py index 25dbcd3cd..f92fdffd0 100644 --- a/src/agentpool/capabilities/codemode/helpers.py +++ b/src/wolfharness/capabilities/codemode/helpers.py @@ -5,7 +5,7 @@ import ast from typing import TYPE_CHECKING -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -13,7 +13,7 @@ from schemez import ToolsetCodeGenerator - from agentpool.tools import Tool + from wolfharness.tools import Tool logger = get_logger(__name__) @@ -64,7 +64,7 @@ def tools_to_codegen( from pydantic_ai import RunContext from schemez import ToolCodeGenerator, ToolsetCodeGenerator, create_schema - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext generators = [ ToolCodeGenerator( diff --git a/src/agentpool/capabilities/combined_toolset.py b/src/wolfharness/capabilities/combined_toolset.py similarity index 98% rename from src/agentpool/capabilities/combined_toolset.py rename to src/wolfharness/capabilities/combined_toolset.py index 54c8029ec..83687f051 100644 --- a/src/agentpool/capabilities/combined_toolset.py +++ b/src/wolfharness/capabilities/combined_toolset.py @@ -16,7 +16,7 @@ children, joins them with ``"\n\n"``, returns the result (or ``None``). - **``on_change()``**: merges the ``on_change()`` async generators from all children that provide one, using an ``asyncio.Queue`` bridge. - Yields :class:`~agentpool.capabilities.change_event.ChangeEvent` + Yields :class:`~wolfharness.capabilities.change_event.ChangeEvent` from any child. Returns ``None`` if no child provides ``on_change()``. - **``__aenter__``/``__aexit__``**: enters/exits all children, using ``AsyncExitStack`` for safe cleanup even if some children fail. @@ -40,8 +40,8 @@ from pydantic_ai.capabilities.abstract import AgentInstructions # type: ignore[attr-defined] - from agentpool.capabilities.change_event import ChangeEvent - from agentpool.tools.base import Tool + from wolfharness.capabilities.change_event import ChangeEvent + from wolfharness.tools.base import Tool # ---- Protocols for optional capability methods ---- diff --git a/src/agentpool/capabilities/dcp/__init__.py b/src/wolfharness/capabilities/dcp/__init__.py similarity index 71% rename from src/agentpool/capabilities/dcp/__init__.py rename to src/wolfharness/capabilities/dcp/__init__.py index 17b9a1efe..01c4344c8 100644 --- a/src/agentpool/capabilities/dcp/__init__.py +++ b/src/wolfharness/capabilities/dcp/__init__.py @@ -7,9 +7,9 @@ from __future__ import annotations -from agentpool.capabilities.dcp.capability import DynamicContextPruningCapability -from agentpool.capabilities.dcp.config import DCPConfig -from agentpool.capabilities.dcp.state import ( +from wolfharness.capabilities.dcp.capability import DynamicContextPruningCapability +from wolfharness.capabilities.dcp.config import DCPConfig +from wolfharness.capabilities.dcp.state import ( CompressionBlock, DCPState, WatermarkLevel, diff --git a/src/agentpool/capabilities/dcp/block_store.py b/src/wolfharness/capabilities/dcp/block_store.py similarity index 98% rename from src/agentpool/capabilities/dcp/block_store.py rename to src/wolfharness/capabilities/dcp/block_store.py index 8fa25d9e1..931681856 100644 --- a/src/agentpool/capabilities/dcp/block_store.py +++ b/src/wolfharness/capabilities/dcp/block_store.py @@ -15,7 +15,7 @@ if TYPE_CHECKING: - from agentpool.capabilities.dcp.state import CompressionBlock + from wolfharness.capabilities.dcp.state import CompressionBlock @dataclass diff --git a/src/agentpool/capabilities/dcp/capability.py b/src/wolfharness/capabilities/dcp/capability.py similarity index 99% rename from src/agentpool/capabilities/dcp/capability.py rename to src/wolfharness/capabilities/dcp/capability.py index 928d11037..2eb69f8c8 100644 --- a/src/agentpool/capabilities/dcp/capability.py +++ b/src/wolfharness/capabilities/dcp/capability.py @@ -49,28 +49,28 @@ ) from pydantic_ai.toolsets import AgentToolset, FunctionToolset -from agentpool.agents.context import ( +from wolfharness.agents.context import ( AgentContext, # noqa: TC001 — needed at runtime for get_type_hints() ) -from agentpool.capabilities.dcp.block_store import ( +from wolfharness.capabilities.dcp.block_store import ( CompressionBlockStore, ) -from agentpool.capabilities.dcp.config import DCPConfig -from agentpool.capabilities.dcp.nudge import ( +from wolfharness.capabilities.dcp.config import DCPConfig +from wolfharness.capabilities.dcp.nudge import ( build_nudge_text, ) -from agentpool.capabilities.dcp.prunable_list import ( +from wolfharness.capabilities.dcp.prunable_list import ( META_TOOL_NAMES, build_prunable_list, inject_prunable_list, ) -from agentpool.capabilities.dcp.state import ( +from wolfharness.capabilities.dcp.state import ( CompressionBlock, DCPState, PruneAction, WatermarkLevel, ) -from agentpool.capabilities.dcp.strategies import ( +from wolfharness.capabilities.dcp.strategies import ( _apply_pruned_tools, _dedup_exact, _is_pruned, @@ -80,14 +80,14 @@ _strip_thinking_content, purge_failed_tool_inputs, ) -from agentpool.capabilities.dcp.token_utils import estimate_tokens -from agentpool.capabilities.dcp.tools import ( +from wolfharness.capabilities.dcp.token_utils import estimate_tokens +from wolfharness.capabilities.dcp.tools import ( DistillTargetInput, decompress_tool, distill_tool, prune_tool, ) -from agentpool.capabilities.dcp.watermark import ( +from wolfharness.capabilities.dcp.watermark import ( WatermarkStateMachine, ) diff --git a/src/agentpool/capabilities/dcp/config.py b/src/wolfharness/capabilities/dcp/config.py similarity index 98% rename from src/agentpool/capabilities/dcp/config.py rename to src/wolfharness/capabilities/dcp/config.py index 9c2b60101..85a6b9ef3 100644 --- a/src/agentpool/capabilities/dcp/config.py +++ b/src/wolfharness/capabilities/dcp/config.py @@ -10,7 +10,7 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator -from agentpool.capabilities.dcp.state import WatermarkLevel +from wolfharness.capabilities.dcp.state import WatermarkLevel class DCPConfig(BaseModel): diff --git a/src/agentpool/capabilities/dcp/nudge.py b/src/wolfharness/capabilities/dcp/nudge.py similarity index 96% rename from src/agentpool/capabilities/dcp/nudge.py rename to src/wolfharness/capabilities/dcp/nudge.py index df82220d6..a515e14d2 100644 --- a/src/agentpool/capabilities/dcp/nudge.py +++ b/src/wolfharness/capabilities/dcp/nudge.py @@ -23,14 +23,14 @@ ToolReturnPart, ) -from agentpool.capabilities.dcp.state import WatermarkLevel -from agentpool.capabilities.dcp.strategies import _is_pruned -from agentpool.capabilities.dcp.token_utils import estimate_tokens +from wolfharness.capabilities.dcp.state import WatermarkLevel +from wolfharness.capabilities.dcp.strategies import _is_pruned +from wolfharness.capabilities.dcp.token_utils import estimate_tokens if TYPE_CHECKING: - from agentpool.capabilities.dcp.config import DCPConfig - from agentpool.capabilities.dcp.state import DCPState + from wolfharness.capabilities.dcp.config import DCPConfig + from wolfharness.capabilities.dcp.state import DCPState __all__ = ["build_nudge_text"] diff --git a/src/agentpool/capabilities/dcp/prunable_list.py b/src/wolfharness/capabilities/dcp/prunable_list.py similarity index 96% rename from src/agentpool/capabilities/dcp/prunable_list.py rename to src/wolfharness/capabilities/dcp/prunable_list.py index 7ac019620..404d27f8a 100644 --- a/src/agentpool/capabilities/dcp/prunable_list.py +++ b/src/wolfharness/capabilities/dcp/prunable_list.py @@ -19,13 +19,13 @@ UserPromptPart, ) -from agentpool.capabilities.dcp.strategies import _is_pruned -from agentpool.capabilities.dcp.token_utils import estimate_tokens +from wolfharness.capabilities.dcp.strategies import _is_pruned +from wolfharness.capabilities.dcp.token_utils import estimate_tokens if TYPE_CHECKING: - from agentpool.capabilities.dcp.config import DCPConfig - from agentpool.capabilities.dcp.state import DCPState + from wolfharness.capabilities.dcp.config import DCPConfig + from wolfharness.capabilities.dcp.state import DCPState __all__ = ["META_TOOL_NAMES", "build_prunable_list", "inject_prunable_list"] diff --git a/src/agentpool/capabilities/dcp/state.py b/src/wolfharness/capabilities/dcp/state.py similarity index 99% rename from src/agentpool/capabilities/dcp/state.py rename to src/wolfharness/capabilities/dcp/state.py index e4452a447..49fcbc49c 100644 --- a/src/agentpool/capabilities/dcp/state.py +++ b/src/wolfharness/capabilities/dcp/state.py @@ -16,7 +16,7 @@ if TYPE_CHECKING: from pydantic_ai.messages import ModelMessage - from agentpool.capabilities.dcp.block_store import CompressionBlockStore + from wolfharness.capabilities.dcp.block_store import CompressionBlockStore class WatermarkLevel(IntEnum): diff --git a/src/agentpool/capabilities/dcp/strategies.py b/src/wolfharness/capabilities/dcp/strategies.py similarity index 98% rename from src/agentpool/capabilities/dcp/strategies.py rename to src/wolfharness/capabilities/dcp/strategies.py index 612799b3f..ac9e51a5b 100644 --- a/src/agentpool/capabilities/dcp/strategies.py +++ b/src/wolfharness/capabilities/dcp/strategies.py @@ -23,12 +23,12 @@ UserPromptPart, ) -from agentpool.capabilities.dcp.state import CompressionBlock, DCPState +from wolfharness.capabilities.dcp.state import CompressionBlock, DCPState if TYPE_CHECKING: - from agentpool.capabilities.dcp.block_store import CompressionBlockStore - from agentpool.capabilities.dcp.config import DCPConfig + from wolfharness.capabilities.dcp.block_store import CompressionBlockStore + from wolfharness.capabilities.dcp.config import DCPConfig __all__ = [ diff --git a/src/agentpool/capabilities/dcp/token_utils.py b/src/wolfharness/capabilities/dcp/token_utils.py similarity index 100% rename from src/agentpool/capabilities/dcp/token_utils.py rename to src/wolfharness/capabilities/dcp/token_utils.py diff --git a/src/agentpool/capabilities/dcp/tools.py b/src/wolfharness/capabilities/dcp/tools.py similarity index 99% rename from src/agentpool/capabilities/dcp/tools.py rename to src/wolfharness/capabilities/dcp/tools.py index e7702d895..a08dc1a35 100644 --- a/src/agentpool/capabilities/dcp/tools.py +++ b/src/wolfharness/capabilities/dcp/tools.py @@ -26,18 +26,18 @@ from pydantic_ai import ModelRetry from pydantic_ai.messages import ModelResponse, ThinkingPart, ToolCallPart, ToolReturnPart -from agentpool.capabilities.dcp.state import ( +from wolfharness.capabilities.dcp.state import ( DCPState, DistillTarget, PruneAction, ) -from agentpool.capabilities.dcp.strategies import _is_pruned, _prune_part +from wolfharness.capabilities.dcp.strategies import _is_pruned, _prune_part if TYPE_CHECKING: from pydantic_ai import RunContext - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext class DistillTargetInput(TypedDict): diff --git a/src/agentpool/capabilities/dcp/watermark.py b/src/wolfharness/capabilities/dcp/watermark.py similarity index 96% rename from src/agentpool/capabilities/dcp/watermark.py rename to src/wolfharness/capabilities/dcp/watermark.py index 2419a52d0..a87b857e3 100644 --- a/src/agentpool/capabilities/dcp/watermark.py +++ b/src/wolfharness/capabilities/dcp/watermark.py @@ -8,8 +8,8 @@ from typing import TYPE_CHECKING -from agentpool.capabilities.dcp.state import WatermarkLevel -from agentpool.capabilities.dcp.token_utils import estimate_tokens +from wolfharness.capabilities.dcp.state import WatermarkLevel +from wolfharness.capabilities.dcp.token_utils import estimate_tokens if TYPE_CHECKING: diff --git a/src/agentpool/capabilities/delegation.py b/src/wolfharness/capabilities/delegation.py similarity index 100% rename from src/agentpool/capabilities/delegation.py rename to src/wolfharness/capabilities/delegation.py diff --git a/src/agentpool/capabilities/extension_registry.py b/src/wolfharness/capabilities/extension_registry.py similarity index 96% rename from src/agentpool/capabilities/extension_registry.py rename to src/wolfharness/capabilities/extension_registry.py index baf335898..20152a0ab 100644 --- a/src/agentpool/capabilities/extension_registry.py +++ b/src/wolfharness/capabilities/extension_registry.py @@ -24,7 +24,7 @@ from typing import TYPE_CHECKING, Any import warnings -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -32,8 +32,8 @@ from pydantic_ai.capabilities import AbstractCapability - from agentpool.capabilities.change_event import ChangeEvent - from agentpool.capabilities.resource_protocols import ( + from wolfharness.capabilities.change_event import ChangeEvent + from wolfharness.capabilities.resource_protocols import ( ChangeObservable, CommandResource, ResourceAccess, @@ -41,7 +41,7 @@ SkillResource, ToolAccess, ) - from agentpool.skills.skill import Skill + from wolfharness.skills.skill import Skill logger = get_logger(__name__) @@ -366,7 +366,7 @@ def get_skill_resources( Returns: List of capabilities implementing ``SkillResource``. """ - from agentpool.capabilities.resource_protocols import SkillResource + from wolfharness.capabilities.resource_protocols import SkillResource return [ cap for cap in self.get_visible_capabilities(scope) if isinstance(cap, SkillResource) @@ -384,7 +384,7 @@ def get_resource_access( Returns: List of capabilities implementing ``ResourceAccess``. """ - from agentpool.capabilities.resource_protocols import ResourceAccess + from wolfharness.capabilities.resource_protocols import ResourceAccess return [ cap for cap in self.get_visible_capabilities(scope) if isinstance(cap, ResourceAccess) @@ -402,7 +402,7 @@ def get_tool_access( Returns: List of capabilities implementing ``ToolAccess``. """ - from agentpool.capabilities.resource_protocols import ToolAccess + from wolfharness.capabilities.resource_protocols import ToolAccess return [cap for cap in self.get_visible_capabilities(scope) if isinstance(cap, ToolAccess)] @@ -418,7 +418,7 @@ def get_resource_template_access( Returns: List of capabilities implementing ``ResourceTemplateAccess``. """ - from agentpool.capabilities.resource_protocols import ResourceTemplateAccess + from wolfharness.capabilities.resource_protocols import ResourceTemplateAccess return [ cap @@ -463,7 +463,7 @@ def get_command_resources( Returns: List of capabilities implementing ``CommandResource``. """ - from agentpool.capabilities.resource_protocols import CommandResource + from wolfharness.capabilities.resource_protocols import CommandResource return [ cap for cap in self.get_visible_capabilities(scope) if isinstance(cap, CommandResource) @@ -481,7 +481,7 @@ def get_observable_capabilities( Returns: List of capabilities implementing ``ChangeObservable``. """ - from agentpool.capabilities.resource_protocols import ChangeObservable + from wolfharness.capabilities.resource_protocols import ChangeObservable return [ cap for cap in self.get_visible_capabilities(scope) if isinstance(cap, ChangeObservable) @@ -514,8 +514,8 @@ async def resolve_uri( """ if uri.startswith("skill://"): # Flat URI (D9): parse via ResolvedSkillURI for consistency. - from agentpool.skills.skill import Skill - from agentpool.skills.uri_resolver import ResolvedSkillURI, _name_alternatives + from wolfharness.skills.skill import Skill + from wolfharness.skills.uri_resolver import ResolvedSkillURI, _name_alternatives resolved = ResolvedSkillURI.parse(uri) skill_name = resolved.skill_name @@ -552,7 +552,7 @@ async def resolve_uri( return None if uri.startswith("mcp://"): - from agentpool.capabilities.resource_protocols import TextResourceContent + from wolfharness.capabilities.resource_protocols import TextResourceContent for resource_cap in self.get_resource_access(scope): try: diff --git a/src/agentpool/capabilities/file_team_state.py b/src/wolfharness/capabilities/file_team_state.py similarity index 100% rename from src/agentpool/capabilities/file_team_state.py rename to src/wolfharness/capabilities/file_team_state.py diff --git a/src/agentpool/capabilities/filtered_toolset.py b/src/wolfharness/capabilities/filtered_toolset.py similarity index 97% rename from src/agentpool/capabilities/filtered_toolset.py rename to src/wolfharness/capabilities/filtered_toolset.py index a48d6e2b2..b765cc719 100644 --- a/src/agentpool/capabilities/filtered_toolset.py +++ b/src/wolfharness/capabilities/filtered_toolset.py @@ -23,7 +23,7 @@ if TYPE_CHECKING: from types import TracebackType - from agentpool.capabilities.change_event import ChangeEvent + from wolfharness.capabilities.change_event import ChangeEvent ToolFilterFunc = Callable[[RunContext[AgentDepsT], ToolDefinition], bool | Awaitable[bool]] @@ -72,7 +72,7 @@ class FilteredToolsetCapability(AbstractCapability[AgentDepsT]): in a :class:`FilteredToolset` that applies the provided filter function. If the wrapped capability does not implement ``on_change()`` (i.e. - it is not an agentpool capability), ``on_change()`` returns ``None``. + it is not an wolfharness capability), ``on_change()`` returns ``None``. Attributes: wrapped: The inner ``AbstractCapability`` being filtered. @@ -165,7 +165,7 @@ def on_change(self) -> AsyncIterator[ChangeEvent] | None: """Delegate ``on_change()`` to the wrapped capability. If the wrapped capability implements ``on_change()`` (i.e. it - is an agentpool capability), its return value is forwarded. + is an wolfharness capability), its return value is forwarded. Otherwise, returns ``None`` — static capabilities never change. """ if isinstance(self._wrapped, _OnChangeCapable): diff --git a/src/agentpool/capabilities/function_toolset.py b/src/wolfharness/capabilities/function_toolset.py similarity index 90% rename from src/agentpool/capabilities/function_toolset.py rename to src/wolfharness/capabilities/function_toolset.py index 97370d744..7d538d912 100644 --- a/src/agentpool/capabilities/function_toolset.py +++ b/src/wolfharness/capabilities/function_toolset.py @@ -21,19 +21,19 @@ from collections.abc import AsyncIterator, Sequence from types import TracebackType - from agentpool import Agent, MessageNode - from agentpool.capabilities.change_event import ChangeEvent - from agentpool.common_types import ToolSource, ToolType - from agentpool.prompts.prompts import BasePrompt - from agentpool.tools.base import Tool + from wolfharness import Agent, MessageNode + from wolfharness.capabilities.change_event import ChangeEvent + from wolfharness.common_types import ToolSource, ToolType + from wolfharness.prompts.prompts import BasePrompt + from wolfharness.tools.base import Tool class FunctionToolsetCapability(AbstractCapability[AgentDepsT]): - """Wraps a static list of :class:`~agentpool.tools.base.Tool` instances. + """Wraps a static list of :class:`~wolfharness.tools.base.Tool` instances. Provides: - ``get_toolset()``: eagerly builds a ``FunctionToolset`` from the - wrapped tools via :func:`~agentpool.tools.tool_wrapping.wrap_tool_for_pydantic_ai`. + wrapped tools via :func:`~wolfharness.tools.tool_wrapping.wrap_tool_for_pydantic_ai`. Returns ``None`` if the tool list is empty. - ``get_instructions()``: returns the optional instructions string, or ``None`` if none were provided. @@ -85,7 +85,7 @@ async def get_prompts(self) -> list[BasePrompt]: def add_tool(self, tool: ToolType) -> None: """Add a tool to this capability.""" - from agentpool.tools.base import Tool as ToolClass + from wolfharness.tools.base import Tool as ToolClass match tool: case ToolClass(): @@ -109,8 +109,8 @@ def create_tool( prepare: Any | None = None, ) -> Tool[Any]: """Create a tool from a function and add it to this capability.""" - from agentpool.tools.base import Tool as ToolClass - from agentpool_config.tools import ToolHints + from wolfharness.tools.base import Tool as ToolClass + from wolfharness_config.tools import ToolHints tool = ToolClass.from_callable( fn=fn, @@ -152,7 +152,7 @@ def register_tool( metadata: dict[str, str] | None = None, ) -> Tool[Any]: """Register a new tool with custom settings.""" - from agentpool.tools.base import Tool as ToolClass + from wolfharness.tools.base import Tool as ToolClass match tool: case ToolClass(): @@ -184,8 +184,8 @@ def register_worker( parent: Agent[Any, Any] | None = None, ) -> Tool[Any]: """Register an agent as a worker tool.""" - from agentpool import Agent, BaseTeam - from agentpool.agents.base_agent import BaseAgent + from wolfharness import Agent, BaseTeam + from wolfharness.agents.base_agent import BaseAgent match worker: case Agent(): @@ -229,7 +229,7 @@ def tool( **kwargs: Any, ) -> Callable[..., Any] | Callable[[Callable[..., Any]], Callable[..., Any]]: """Decorator to register a function as a tool.""" - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool def decorator(f: Callable[..., Any]) -> Callable[..., Any]: tool_obj = Tool.from_callable( @@ -264,7 +264,7 @@ def get_toolset(self) -> AgentToolset[AgentDepsT] | None: """Return a ``FunctionToolset`` built from the wrapped tools. Each tool is converted to a pydantic-ai compatible callable via - :func:`~agentpool.tools.tool_wrapping.wrap_tool_for_pydantic_ai`, + :func:`~wolfharness.tools.tool_wrapping.wrap_tool_for_pydantic_ai`, then assembled into a ``FunctionToolset``. Returns ``None`` if the tool list is empty. @@ -272,7 +272,7 @@ def get_toolset(self) -> AgentToolset[AgentDepsT] | None: if not self._tools: return None - from agentpool.tools.tool_wrapping import wrap_tool_for_pydantic_ai + from wolfharness.tools.tool_wrapping import wrap_tool_for_pydantic_ai pa_tools = [wrap_tool_for_pydantic_ai(tool) for tool in self._tools] return FunctionToolset(pa_tools, id=self._name) diff --git a/src/agentpool/capabilities/loop_detection.py b/src/wolfharness/capabilities/loop_detection.py similarity index 98% rename from src/agentpool/capabilities/loop_detection.py rename to src/wolfharness/capabilities/loop_detection.py index bd635a8a3..4bb10481e 100644 --- a/src/agentpool/capabilities/loop_detection.py +++ b/src/wolfharness/capabilities/loop_detection.py @@ -26,7 +26,7 @@ # agent runs, so delegation depth survives the fresh copies that # ``for_run()`` creates for child agents. _delegation_depth: contextvars.ContextVar[int] = contextvars.ContextVar( - "agentpool_delegation_depth", + "wolfharness_delegation_depth", default=0, ) diff --git a/src/agentpool/capabilities/mcp_server_cap.py b/src/wolfharness/capabilities/mcp_server_cap.py similarity index 97% rename from src/agentpool/capabilities/mcp_server_cap.py rename to src/wolfharness/capabilities/mcp_server_cap.py index 6c33edfc1..b0e01cd2a 100644 --- a/src/agentpool/capabilities/mcp_server_cap.py +++ b/src/wolfharness/capabilities/mcp_server_cap.py @@ -1,6 +1,6 @@ """McpServerCap — wraps an MCP server as a pydantic-ai capability with Resource Protocols. -Replaces :class:`~agentpool.capabilities.mcp_capability.MCPCapability` with +Replaces :class:`~wolfharness.capabilities.mcp_capability.MCPCapability` with a clean implementation that delegates to ``MCPClient`` via ``SessionConnectionPool.get_client()`` using lazy initialization. @@ -21,8 +21,8 @@ from pydantic_ai.capabilities import AbstractCapability from pydantic_ai.tools import AgentDepsT, RunContext -from agentpool.capabilities.change_event import ChangeEvent -from agentpool.capabilities.resource_protocols import ( +from wolfharness.capabilities.change_event import ChangeEvent +from wolfharness.capabilities.resource_protocols import ( BlobResourceContent, ChangeObservable, CommandEntry, @@ -48,9 +48,9 @@ from pydantic_ai.toolsets import AbstractToolset - from agentpool.mcp_server.client import MCPClient - from agentpool.mcp_server.session_pool import SessionConnectionPool - from agentpool_config.mcp_server import MCPServerConfig + from wolfharness.mcp_server.client import MCPClient + from wolfharness.mcp_server.session_pool import SessionConnectionPool + from wolfharness_config.mcp_server import MCPServerConfig logger = logging.getLogger(__name__) @@ -244,7 +244,7 @@ async def _build_toolset( return None from pydantic_ai.toolsets import CombinedToolset, FunctionToolset - from agentpool.tools.tool_wrapping import wrap_tool_for_pydantic_ai + from wolfharness.tools.tool_wrapping import wrap_tool_for_pydantic_ai converted = [client.convert_tool(t) for t in tools] pydantic_tools = [wrap_tool_for_pydantic_ai(tool) for tool in converted] diff --git a/src/agentpool/capabilities/memory.py b/src/wolfharness/capabilities/memory.py similarity index 100% rename from src/agentpool/capabilities/memory.py rename to src/wolfharness/capabilities/memory.py diff --git a/src/agentpool/capabilities/modality_filter.py b/src/wolfharness/capabilities/modality_filter.py similarity index 98% rename from src/agentpool/capabilities/modality_filter.py rename to src/wolfharness/capabilities/modality_filter.py index b455a8816..ac1bbabc6 100644 --- a/src/agentpool/capabilities/modality_filter.py +++ b/src/wolfharness/capabilities/modality_filter.py @@ -44,7 +44,7 @@ VideoUrl, ) -from agentpool.capabilities.modality_utils import ( +from wolfharness.capabilities.modality_utils import ( BinaryCategory, classify_binary_content, describe_multimodal_content, @@ -58,7 +58,7 @@ from pydantic_ai.models import ModelRequestContext from pydantic_ai.tools import ToolDefinition - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities logger = logging.getLogger(__name__) @@ -120,10 +120,10 @@ def get_ordering(self) -> CapabilityOrdering | None: modality-filtered BEFORE budget truncation and BEFORE DCP pruning. """ - from agentpool.capabilities.dcp.capability import ( + from wolfharness.capabilities.dcp.capability import ( DynamicContextPruningCapability, ) - from agentpool.capabilities.tool_output_budget import ( + from wolfharness.capabilities.tool_output_budget import ( ToolOutputBudgetCapability, ) diff --git a/src/agentpool/capabilities/modality_utils.py b/src/wolfharness/capabilities/modality_utils.py similarity index 100% rename from src/agentpool/capabilities/modality_utils.py rename to src/wolfharness/capabilities/modality_utils.py diff --git a/src/agentpool/capabilities/question.py b/src/wolfharness/capabilities/question.py similarity index 81% rename from src/agentpool/capabilities/question.py rename to src/wolfharness/capabilities/question.py index 167139c60..6945d362f 100644 --- a/src/agentpool/capabilities/question.py +++ b/src/wolfharness/capabilities/question.py @@ -1,7 +1,7 @@ """QuestionCapability — user interaction question tool with YAML schema overrides. Provides the ``question`` tool backed by -``agentpool_toolsets.builtin.question_tools.QuestionTools``. +``wolfharness_toolsets.builtin.question_tools.QuestionTools``. Accepts optional YAML schema files to override the LLM-facing parameter description, mirroring the ``BackgroundTaskCapability`` pattern. @@ -14,6 +14,7 @@ from dataclasses import replace from pathlib import Path from typing import TYPE_CHECKING +import warnings import logfire from pydantic_ai import RunContext, Tool @@ -25,11 +26,11 @@ ) from pydantic_ai.toolsets import AgentToolset, FunctionToolset -from agentpool.agents.context import AgentContext -from agentpool.tools.base import ToolResult # noqa: TC001 -from agentpool.utils.tool_schema import apply_params_schema, load_tool_schema -from agentpool_config.context import get_config_dir -from agentpool_toolsets.builtin.question_tools import QuestionTools +from wolfharness.agents.context import AgentContext +from wolfharness.tools.base import ToolResult # noqa: TC001 +from wolfharness.utils.tool_schema import apply_params_schema, load_tool_schema +from wolfharness_config.context import get_config_dir +from wolfharness_toolsets.builtin.question_tools import QuestionTools if TYPE_CHECKING: @@ -39,7 +40,7 @@ class QuestionCapability(AbstractCapability[AgentContext]): """Capability providing the user interaction ``question`` tool. - Wraps :class:`~agentpool_toolsets.builtin.question_tools.QuestionTools` + Wraps :class:`~wolfharness_toolsets.builtin.question_tools.QuestionTools` and applies optional YAML schema overrides for richer LLM-facing parameter descriptions. @@ -117,7 +118,7 @@ def _resolve_and_load_schema(schema_path_str: str) -> OpenAIFunctionDefinition: def get_toolset(self) -> AgentToolset[AgentContext] | None: """Return ``FunctionToolset`` with the enabled question tool. - The tool callable is sourced from the agentpool ``QuestionTools`` + The tool callable is sourced from the wolfharness ``QuestionTools`` instance, ensuring a single canonical implementation. YAML schema overrides are applied on top for richer LLM-facing descriptions. """ @@ -130,12 +131,20 @@ def get_toolset(self) -> AgentToolset[AgentContext] | None: description = ( self._question_schema.get("description") if self._question_schema else None ) or "Ask the user one or more structured questions." - tool = Tool( - self._question, - name=name, - description=description, - metadata={"category": "other"}, - ) + # pydantic_ai can't schema ToolResult (plain dataclass); runtime + # conversion in _ToolInterceptCapability.wrap_tool_execute handles it. + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", + category=UserWarning, + message=r"Could not generate return schema for .+", + ) + tool = Tool( + self._question, + name=name, + description=description, + metadata={"category": "other"}, + ) tools.append(apply_params_schema(tool, self._question_schema)) if not tools: @@ -147,7 +156,7 @@ def get_ordering(self) -> CapabilityOrdering | None: return CapabilityOrdering(wrapped_by=[ProcessHistory, NativeTool]) # ---- Tool wrapper ---- - # This wraps the canonical tool function from agentpool's QuestionTools, + # This wraps the canonical tool function from wolfharness's QuestionTools, # adapting RunContext[AgentContext] → AgentContext for direct invocation. @logfire.instrument("question.capability.question") diff --git a/src/agentpool/capabilities/registry.py b/src/wolfharness/capabilities/registry.py similarity index 93% rename from src/agentpool/capabilities/registry.py rename to src/wolfharness/capabilities/registry.py index 57da0a6cb..7ea73fde3 100644 --- a/src/agentpool/capabilities/registry.py +++ b/src/wolfharness/capabilities/registry.py @@ -1,12 +1,12 @@ """Entry-point based capability discovery. Provides ``discover_entry_point_capabilities()`` which loads all -capability classes registered via the ``agentpool.capabilities`` entry-point +capability classes registered via the ``wolfharness.capabilities`` entry-point group. External packages can register new capability types by adding an entry to their ``pyproject.toml``: ```toml -[project.entry-points."agentpool.capabilities"] +[project.entry-points."wolfharness.capabilities"] my_cap = "my_package.my_module:MyCapability" ``` @@ -29,7 +29,7 @@ from pydantic_ai.capabilities import AbstractCapability -_ENTRY_POINT_GROUP = "agentpool.capabilities" +_ENTRY_POINT_GROUP = "wolfharness.capabilities" class CapabilityNotFoundError(Exception): @@ -64,7 +64,7 @@ def __init__( def discover_entry_point_capabilities() -> dict[str, type[AbstractCapability[object]]]: """Discover capability classes registered via entry points. - Loads all entry points in the ``agentpool.capabilities`` group and + Loads all entry points in the ``wolfharness.capabilities`` group and returns a mapping from entry-point name to the loaded capability class. Each loaded value must be a subclass of :class:`~pydantic_ai.capabilities.AbstractCapability`. diff --git a/src/agentpool/capabilities/resource_capability.py b/src/wolfharness/capabilities/resource_capability.py similarity index 97% rename from src/agentpool/capabilities/resource_capability.py rename to src/wolfharness/capabilities/resource_capability.py index 74ee4d242..8a3ea0f56 100644 --- a/src/agentpool/capabilities/resource_capability.py +++ b/src/wolfharness/capabilities/resource_capability.py @@ -25,15 +25,15 @@ from pydantic_ai.tools import AgentDepsT, RunContext from pydantic_ai.toolsets import AgentToolset, FunctionToolset -from agentpool.capabilities.extension_registry import Scope, ScopeLevel -from agentpool.capabilities.resource_protocols import ( +from wolfharness.capabilities.extension_registry import Scope, ScopeLevel +from wolfharness.capabilities.resource_protocols import ( CompletionArgument, CompletionResult, ) if TYPE_CHECKING: - from agentpool.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.agent_context import AgentContextDeps # Number of header lines (header + separator) before data rows. @@ -138,7 +138,7 @@ def _resolve_agent_context(ctx: RunContext[AgentDepsT]) -> AgentContextDeps: Raises: RuntimeError: If deps is None or AgentContextDeps is not found. """ - from agentpool.capabilities.agent_context import resolve_agent_context_from_deps + from wolfharness.capabilities.agent_context import resolve_agent_context_from_deps return resolve_agent_context_from_deps(ctx.deps, capability_name="ResourceCapability") @@ -274,7 +274,7 @@ async def read_resource( ctx: The run context providing agent dependencies. uri: Resource URI to read. """ - from agentpool.capabilities.resource_resolver import resolve_resource_content + from wolfharness.capabilities.resource_resolver import resolve_resource_content agent_ctx = self._resolve_agent_context(ctx) registry = agent_ctx.extension_registry @@ -320,7 +320,7 @@ async def resource_exists( scope = self._make_scope(agent_ctx) if uri.startswith("skill://"): - from agentpool.skills.uri_resolver import ResolvedSkillURI + from wolfharness.skills.uri_resolver import ResolvedSkillURI resolved = ResolvedSkillURI.parse(uri) skill_name = resolved.skill_name @@ -332,7 +332,7 @@ async def resource_exists( resolved.reference_path is not None and resolved.reference_path.upper() != "SKILL.MD" ): - from agentpool.capabilities.resource_resolver import _resolve_skill_reference + from wolfharness.capabilities.resource_resolver import _resolve_skill_reference try: ref_content = await _resolve_skill_reference( diff --git a/src/agentpool/capabilities/resource_protocols.py b/src/wolfharness/capabilities/resource_protocols.py similarity index 98% rename from src/agentpool/capabilities/resource_protocols.py rename to src/wolfharness/capabilities/resource_protocols.py index 72ac0c5db..869ad8c82 100644 --- a/src/agentpool/capabilities/resource_protocols.py +++ b/src/wolfharness/capabilities/resource_protocols.py @@ -9,7 +9,7 @@ ``McpResource`` remains as a ``DeprecatedAlias`` that emits ``DeprecationWarning`` on ``isinstance()`` checks. -ChangeEvent is imported from ``agentpool.capabilities.change_event`` — +ChangeEvent is imported from ``wolfharness.capabilities.change_event`` — this module does NOT define a duplicate. """ @@ -26,7 +26,7 @@ from upath import UPath - from agentpool.capabilities.change_event import ChangeEvent + from wolfharness.capabilities.change_event import ChangeEvent # ---- Dataclasses ---- @@ -409,7 +409,7 @@ class McpResource(metaclass=_McpResourceMeta): ``ResourceAccess`` checks. Note: - ``agentpool_server.opencode_server.models.mcp.McpResource`` (Pydantic + ``wolfharness_server.opencode_server.models.mcp.McpResource`` (Pydantic model) is unrelated to this deprecated Protocol and is NOT affected. """ diff --git a/src/agentpool/capabilities/resource_resolver.py b/src/wolfharness/capabilities/resource_resolver.py similarity index 96% rename from src/agentpool/capabilities/resource_resolver.py rename to src/wolfharness/capabilities/resource_resolver.py index 59c588dcb..84acc4a53 100644 --- a/src/agentpool/capabilities/resource_resolver.py +++ b/src/wolfharness/capabilities/resource_resolver.py @@ -12,17 +12,17 @@ import logfire from pydantic_ai import BinaryContent -from agentpool.capabilities.resource_protocols import ( +from wolfharness.capabilities.resource_protocols import ( BlobResourceContent, TextResourceContent, ) -from agentpool.skills.uri_resolver import ResolvedSkillURI, _name_alternatives +from wolfharness.skills.uri_resolver import ResolvedSkillURI, _name_alternatives if TYPE_CHECKING: from pydantic_ai.messages import UserContent - from agentpool.capabilities.resource_protocols import ResourceAccess, SkillResource + from wolfharness.capabilities.resource_protocols import ResourceAccess, SkillResource def _truncate_text(text: str, max_chars: int) -> str: @@ -78,7 +78,7 @@ async def _resolve_skill_reference( """ from upathtools import UPath - from agentpool.skills.exceptions import SecurityError + from wolfharness.skills.exceptions import SecurityError # Defense-in-depth: ResolvedSkillURI.parse() already rejects ".." segments, # but we double-check here in case this helper is called directly. diff --git a/src/agentpool/capabilities/runloop_delegation.py b/src/wolfharness/capabilities/runloop_delegation.py similarity index 93% rename from src/agentpool/capabilities/runloop_delegation.py rename to src/wolfharness/capabilities/runloop_delegation.py index 277b71713..0fbfda90e 100644 --- a/src/agentpool/capabilities/runloop_delegation.py +++ b/src/wolfharness/capabilities/runloop_delegation.py @@ -18,14 +18,14 @@ from typing import TYPE_CHECKING, Any import warnings -from agentpool.observability.spans import safe_span +from wolfharness.observability.spans import safe_span if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool.host.context import HostContext - from agentpool.host.registry import AgentRegistry + from wolfharness.host.context import HostContext + from wolfharness.host.registry import AgentRegistry class RunLoopDelegationService: @@ -90,7 +90,7 @@ async def spawn_subagent( DeprecationWarning, stacklevel=2, ) - from agentpool.capabilities.delegation import AgentNotFoundError + from wolfharness.capabilities.delegation import AgentNotFoundError if not self._registry.exists(name): raise AgentNotFoundError(name) @@ -102,7 +102,7 @@ async def spawn_subagent( child_session_id = f"{self._session_id}::child::{name}" - from agentpool.agents.events import RunErrorEvent, StreamCompleteEvent + from wolfharness.agents.events import RunErrorEvent, StreamCompleteEvent with safe_span( "delegation.subagent", @@ -134,7 +134,7 @@ async def spawn_subagent( if isinstance(event, StreamCompleteEvent | RunErrorEvent): break except TimeoutError: - from agentpool.agents.events import RunErrorEvent + from wolfharness.agents.events import RunErrorEvent yield RunErrorEvent( message=f"Subagent '{name}' timed out after 300s", diff --git a/src/agentpool/capabilities/skill_manager_cap.py b/src/wolfharness/capabilities/skill_manager_cap.py similarity index 96% rename from src/agentpool/capabilities/skill_manager_cap.py rename to src/wolfharness/capabilities/skill_manager_cap.py index 577417ac4..269e48660 100644 --- a/src/agentpool/capabilities/skill_manager_cap.py +++ b/src/wolfharness/capabilities/skill_manager_cap.py @@ -1,23 +1,24 @@ """SkillManagerCap — unified skill management as a pydantic-ai capability. Replaces the deleted per-skill ``SkillCapability`` class and -:class:`~agentpool.capabilities.skill_activation.SkillActivationCapability` +:class:`~wolfharness.capabilities.skill_activation.SkillActivationCapability` with a single capability that: - Holds local skills as ``dict[str, Skill]`` (no per-skill capability wrappers). -- Queries child :class:`~agentpool.capabilities.mcp_server_cap.McpServerCap` +- Queries child :class:`~wolfharness.capabilities.mcp_server_cap.McpServerCap` instances for remote skills and commands. - Provides metadata-only instructions by default (```` XML). - Supports optional ``matcher_fn`` for dynamic per-turn skill injection. - Supports ``always_active`` flag for skills that bypass the matcher. - Aggregates ``SkillResource`` and ``CommandResource`` from local + remote. -- Imports per-skill Python tools via :class:`~agentpool.skills.skill_tool_manager.SkillToolManager`. -- Creates per-skill :class:`~agentpool.capabilities.mcp_server_cap.McpServerCap` instances. +- Imports per-skill Python tools via + :class:`~wolfharness.skills.skill_tool_manager.SkillToolManager`. +- Creates per-skill :class:`~wolfharness.capabilities.mcp_server_cap.McpServerCap` instances. - **Owns** the ``load_skill`` and ``list_skills`` agent-facing tools (D1). - Applies ``allowed_tools`` filtering via ``get_wrapper_toolset()``. - Guards against built-in tool name collisions (D10). - Inherits change stream merging and lifecycle from - :class:`~agentpool.capabilities.combined_toolset.CombinedToolsetCapability`. + :class:`~wolfharness.capabilities.combined_toolset.CombinedToolsetCapability`. """ from __future__ import annotations @@ -38,18 +39,18 @@ PrefixedToolset, ) -from agentpool.capabilities.combined_toolset import CombinedToolsetCapability -from agentpool.capabilities.resource_protocols import ( +from wolfharness.capabilities.combined_toolset import CombinedToolsetCapability +from wolfharness.capabilities.resource_protocols import ( ChangeObservable, CommandEntry, CommandResource, SkillEntry, SkillResource, ) -from agentpool.log import get_logger -from agentpool.skills.skill import Skill -from agentpool.skills.skill_tool_manager import SkillToolManager -from agentpool.skills.uri_resolver import ResolvedSkillURI, _name_alternatives +from wolfharness.log import get_logger +from wolfharness.skills.skill import Skill +from wolfharness.skills.skill_tool_manager import SkillToolManager +from wolfharness.skills.uri_resolver import ResolvedSkillURI, _name_alternatives if TYPE_CHECKING: @@ -59,18 +60,18 @@ from pydantic_ai.capabilities import AbstractCapability from pydantic_ai.capabilities.abstract import AgentInstructions # type: ignore[attr-defined] - from agentpool.capabilities.agent_context import AgentContextDeps - from agentpool.capabilities.mcp_server_cap import McpServerCap - from agentpool.delegation.pool import AgentPool - from agentpool.skills.uri_resolver import SkillURIResolver - from agentpool.tools.base import Tool + from wolfharness.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.mcp_server_cap import McpServerCap + from wolfharness.delegation.pool import AgentPool + from wolfharness.skills.uri_resolver import SkillURIResolver + from wolfharness.tools.base import Tool logger = get_logger(__name__) # --------------------------------------------------------------------------- -# Helper functions (moved from agentpool_toolsets/builtin/skills.py) +# Helper functions (moved from wolfharness_toolsets/builtin/skills.py) # --------------------------------------------------------------------------- @@ -120,7 +121,7 @@ async def _load_reference_content( ReferenceNotFoundError: If the reference file cannot be loaded. SecurityError: If the reference path is a path traversal attempt. """ - from agentpool.skills.exceptions import ReferenceNotFoundError + from wolfharness.skills.exceptions import ReferenceNotFoundError # For virtual paths (PurePosixPath like skill:// URIs), route through # the cap's children (SkillResource providers) for remote reference reads. @@ -146,7 +147,7 @@ async def _load_reference_content( skill_path = cast(UPath, skill.skill_path) # Validate reference_path to prevent path traversal attacks - from agentpool.skills.exceptions import SecurityError + from wolfharness.skills.exceptions import SecurityError decoded_path = reference_path # Check for path traversal attempts and absolute paths @@ -347,7 +348,7 @@ def _resolve_agent_context(ctx: RunContext[AgentDepsT]) -> AgentContextDeps: Raises: RuntimeError: If deps is None or AgentContextDeps is not found. """ - from agentpool.capabilities.agent_context import resolve_agent_context_from_deps + from wolfharness.capabilities.agent_context import resolve_agent_context_from_deps return resolve_agent_context_from_deps(ctx.deps, capability_name="SkillManagerCap") @@ -371,7 +372,7 @@ def _resolve_pool(ctx: RunContext[AgentDepsT]) -> tuple[AgentPool[Any] | None, s A tuple of (``AgentPool`` if available else ``None``, node name if available else ``None``). """ - from agentpool.agents.context import AgentContext as RuntimeAgentContext + from wolfharness.agents.context import AgentContext as RuntimeAgentContext deps = ctx.deps if isinstance(deps, RuntimeAgentContext): @@ -412,7 +413,7 @@ def _create_skill_mcp_children(self) -> None: ``to_mcp_server_config()``, creates a ``McpServerCap``, and stores it in ``_skill_mcp_children[skill_name]``. """ - from agentpool.capabilities.mcp_server_cap import McpServerCap + from wolfharness.capabilities.mcp_server_cap import McpServerCap for name, skill in self._local_skills.items(): if not skill.mcp_servers: diff --git a/src/agentpool/capabilities/skill_watcher.py b/src/wolfharness/capabilities/skill_watcher.py similarity index 97% rename from src/agentpool/capabilities/skill_watcher.py rename to src/wolfharness/capabilities/skill_watcher.py index 3e729ed0d..660472972 100644 --- a/src/agentpool/capabilities/skill_watcher.py +++ b/src/wolfharness/capabilities/skill_watcher.py @@ -18,10 +18,10 @@ from collections.abc import AsyncIterator from pathlib import Path - from agentpool.capabilities.change_event import ChangeEvent + from wolfharness.capabilities.change_event import ChangeEvent -from agentpool.log import get_logger +from wolfharness.log import get_logger logger = get_logger(__name__) @@ -171,7 +171,7 @@ async def _fire_after_debounce(self) -> None: break await asyncio.sleep(remaining) - from agentpool.capabilities.change_event import ChangeEvent + from wolfharness.capabilities.change_event import ChangeEvent await self._change_queue.put( ChangeEvent( diff --git a/src/agentpool/capabilities/subagent_capability.py b/src/wolfharness/capabilities/subagent_capability.py similarity index 94% rename from src/agentpool/capabilities/subagent_capability.py rename to src/wolfharness/capabilities/subagent_capability.py index 55aeebdc0..e8a9a988b 100644 --- a/src/agentpool/capabilities/subagent_capability.py +++ b/src/wolfharness/capabilities/subagent_capability.py @@ -21,12 +21,12 @@ from pydantic_ai.tools import AgentDepsT, RunContext from pydantic_ai.toolsets import AgentToolset, FunctionToolset -from agentpool.capabilities.delegation import AgentNotFoundError, DelegationService -from agentpool.observability.spans import safe_span +from wolfharness.capabilities.delegation import AgentNotFoundError, DelegationService +from wolfharness.observability.spans import safe_span if TYPE_CHECKING: - from agentpool.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.agent_context import AgentContextDeps class SubagentCapability(AbstractCapability[AgentDepsT]): @@ -110,7 +110,7 @@ async def spawn_subagent( parent_session_id=agent_ctx.session.session_id, child_agent_name=name, ): - from agentpool.observability.trace import get_trace_id + from wolfharness.observability.trace import get_trace_id logfire.info( "Delegating to subagent", @@ -166,7 +166,7 @@ def _resolve_agent_context(ctx: RunContext[AgentDepsT]) -> AgentContextDeps: Raises: RuntimeError: If deps is None or AgentContextDeps is not found. """ - from agentpool.capabilities.agent_context import resolve_agent_context_from_deps + from wolfharness.capabilities.agent_context import resolve_agent_context_from_deps return resolve_agent_context_from_deps(ctx.deps, capability_name="SubagentCapability") diff --git a/src/agentpool/capabilities/team_comm_capability.py b/src/wolfharness/capabilities/team_comm_capability.py similarity index 98% rename from src/agentpool/capabilities/team_comm_capability.py rename to src/wolfharness/capabilities/team_comm_capability.py index de1546152..c504d216c 100644 --- a/src/agentpool/capabilities/team_comm_capability.py +++ b/src/wolfharness/capabilities/team_comm_capability.py @@ -63,8 +63,8 @@ from pydantic_ai.messages import ToolReturn from pydantic_ai.tools import RunContext # noqa: TC002 - needed at runtime for get_type_hints() -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -73,11 +73,11 @@ from pydantic_ai.run import AgentRunResult from pydantic_ai.tools import ToolDefinition - from agentpool.capabilities.agent_context import AgentContextDeps - from agentpool.capabilities.file_team_state import FileTeamState - from agentpool.lifecycle.types import DeliveryMode - from agentpool.tools.base import Tool - from agentpool_config.team_mode import TeamModeConfig + from wolfharness.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.file_team_state import FileTeamState + from wolfharness.lifecycle.types import DeliveryMode + from wolfharness.tools.base import Tool + from wolfharness_config.team_mode import TeamModeConfig logger = get_logger(__name__) @@ -155,7 +155,7 @@ def __init__( @property def _notice_mode(self) -> DeliveryMode: """Resolve delivery mode from config.""" - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode return ( DeliveryMode.STEER @@ -239,7 +239,7 @@ def _resolve_agent_context(self, ctx: RunContext[Any]) -> AgentContextDeps: Raises: RuntimeError: If ``ctx.deps`` is None or AgentContextDeps is not found. """ - from agentpool.capabilities.agent_context import resolve_agent_context_from_deps + from wolfharness.capabilities.agent_context import resolve_agent_context_from_deps return resolve_agent_context_from_deps(ctx.deps, capability_name="TeamCommCapability") @@ -274,8 +274,8 @@ async def _format_member_skills_instructions( Newline-joined ``...`` blocks, or ``""`` when no skills are requested. """ - from agentpool.skills.uri_resolver import ResolvedSkillURI - from agentpool_toolsets.builtin.skills import load_skill_for_node + from wolfharness.skills.uri_resolver import ResolvedSkillURI + from wolfharness_toolsets.builtin.skills import load_skill_for_node if not skill_names: return "" @@ -333,7 +333,7 @@ def _get_team_state(self, agent_ctx: AgentContextDeps) -> FileTeamState | None: A FileTeamState rooted at the configured base_dir, or None if no ``team_id`` is present in session metadata. """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_id: str | None = agent_ctx.session.metadata.get("team_id") if team_id is None: @@ -385,7 +385,7 @@ async def _create_member_session( Raises: RuntimeError: If SessionPool is not available. """ - from agentpool.agents.events.events import SpawnSessionStart + from wolfharness.agents.events.events import SpawnSessionStart session_pool = agent_ctx.host.session_pool if session_pool is None: @@ -582,7 +582,7 @@ async def send_message( # noqa: PLR0911, PLR0915 if session_pool is None: return ToolReturn(return_value="SessionPool not available") - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState state_path = team_state._state_path(team_id) if not state_path.exists(): @@ -590,7 +590,7 @@ async def send_message( # noqa: PLR0911, PLR0915 state: dict[str, Any] = FileTeamState._read_json(state_path) members: dict[str, dict[str, str]] = state.get("members", {}) - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode mode = self._notice_mode delivered = 0 @@ -644,7 +644,7 @@ async def send_message( # noqa: PLR0911, PLR0915 return ToolReturn(return_value=f"Member '{to}' not found or no session registered") # Bounds: max_member_turns and inbox_max_bytes checks. - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState state_path = team_state._state_path(team_id) if state_path.exists(): @@ -676,7 +676,7 @@ async def send_message( # noqa: PLR0911, PLR0915 current_state["members"] = members_state FileTeamState._atomic_write(state_path, current_state) - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode mode = self._notice_mode msg_body = ( @@ -912,7 +912,7 @@ async def task_list( # noqa: PLR0911 Returns: XML task list with owner summary, or error string. """ - from agentpool.capabilities.file_team_state import ( + from wolfharness.capabilities.file_team_state import ( TaskRecord, format_owner_summary, ) @@ -1242,7 +1242,7 @@ async def task_update( # noqa: PLR0911, PLR0915 # --- Handoff notification (tasks 20-26) --- if handoff_to is not None and status == "completed": # Look up the member in team state. - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState handoff_state_path = team_state._state_path(team_id) if handoff_state_path.exists(): @@ -1648,7 +1648,7 @@ async def team_status( # noqa: PLR0915 if team_state is None: return ToolReturn(return_value="Not in a team session") - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState state_path = team_state._state_path(team_id) if not state_path.exists(): @@ -1825,7 +1825,7 @@ async def team_create( # noqa: PLR0911, PLR0915 team_id = f"team_{uuid.uuid4().hex[:8]}" lead_session_id: str = agent_ctx.session.session_id - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState base_dir = ( agent_ctx.team_mode_config.effective_base_dir @@ -1857,7 +1857,7 @@ async def team_create( # noqa: PLR0911, PLR0915 if session_pool is None: return ToolReturn(return_value="SessionPool not available") - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode created_sessions: list[str] = [] try: @@ -2117,7 +2117,7 @@ async def team_delete(self, ctx: RunContext[Any]) -> ToolReturn: if team_state is None: return ToolReturn(return_value="Not in a team session") - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState state_path = team_state._state_path(team_id) if not state_path.exists(): @@ -2249,7 +2249,7 @@ async def team_add_member( # noqa: PLR0911, PLR0915 if team_state is None: return ToolReturn(return_value="Not in a team session") - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState # Check name not already in team state members. state_path = team_state._state_path(team_id) @@ -2324,7 +2324,7 @@ async def team_add_member( # noqa: PLR0911, PLR0915 ) # Send initial prompt to member (with existing member roster). - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode team_name: str = state.get("team_name", "unknown") base_prompt = prompt or self._config.protocol_template.format( @@ -2475,7 +2475,7 @@ async def shutdown_request( # noqa: PLR0911 if team_state is None: return ToolReturn(return_value="Not in a team session") - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState member_sid = team_state.get_member_session_id(team_id, member_name) if member_sid is None: @@ -2560,7 +2560,7 @@ def _schedule_ephemeral_cleanup( member_name: Member name for state cleanup. base_dir: Base directory for FileTeamState. """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState async def _wait_and_cleanup() -> None: try: @@ -2753,7 +2753,7 @@ async def after_run( # noqa: PLR0911 session_pool = agent_ctx.host.session_pool if session_pool is not None: - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode # Use QUEUE mode: the run is ending, so STEER would be lost. await session_pool.send_message( diff --git a/src/agentpool/capabilities/token_budget.py b/src/wolfharness/capabilities/token_budget.py similarity index 100% rename from src/agentpool/capabilities/token_budget.py rename to src/wolfharness/capabilities/token_budget.py diff --git a/src/agentpool/capabilities/tool_display_capability.py b/src/wolfharness/capabilities/tool_display_capability.py similarity index 97% rename from src/agentpool/capabilities/tool_display_capability.py rename to src/wolfharness/capabilities/tool_display_capability.py index 86bd80ebb..a4983fff2 100644 --- a/src/agentpool/capabilities/tool_display_capability.py +++ b/src/wolfharness/capabilities/tool_display_capability.py @@ -8,7 +8,7 @@ protocol clients (e.g. the OpenCode TUI) that dispatch on a whitelist of standard tool names render the tools properly. - **Rich-info layer** (``emit_diff``): injects a - :class:`~agentpool.agents.events.DiffContentItem` progress event after + :class:`~wolfharness.agents.events.DiffContentItem` progress event after a matching tool executes, so ACP clients (e.g. Zed) render a file diff. @@ -19,7 +19,7 @@ ``DiffContentItem`` uses ``rename_mode=True + emit_diff=False`` (rename only, no duplicate diff). -Modeled on :class:`~agentpool.agents.native_agent.tool_intercept.ToolInterceptCapability` +Modeled on :class:`~wolfharness.agents.native_agent.tool_intercept.ToolInterceptCapability` — a standalone ``AbstractCapability`` overriding ``get_wrapper_toolset`` and ``wrap_tool_execute`` as a global middleware over all assembled tools. @@ -34,7 +34,7 @@ from pydantic_ai.capabilities import AbstractCapability from pydantic_ai.toolsets import AbstractToolset, RenamedToolset -from agentpool.agents.events import DiffContentItem +from wolfharness.agents.events import DiffContentItem if TYPE_CHECKING: @@ -44,8 +44,8 @@ from pydantic_ai.messages import ToolCallPart from pydantic_ai.tools import ToolDefinition - from agentpool.agents.events import ToolCallContentItem - from agentpool.tools.base import ToolKind + from wolfharness.agents.events import ToolCallContentItem + from wolfharness.tools.base import ToolKind @dataclass(kw_only=True) @@ -211,7 +211,7 @@ def _derive_kind(original_name: str, args: Mapping[str, Any]) -> tuple[str, Tool Returns: A ``(title, kind)`` pair with a protocol-safe kind. """ - from agentpool.agents.events.infer_info import derive_rich_tool_info + from wolfharness.agents.events.infer_info import derive_rich_tool_info kind_map: dict[str, ToolKind] = { "read": "read", @@ -259,7 +259,7 @@ def _register_viking_extractors() -> None: These are display-only enhancements applied by ``emit_rich``; they do not modify the viking tools themselves. """ - from agentpool.agents.events import TextContentItem + from wolfharness.agents.events import TextContentItem def text_content_items(text: str) -> list[ToolCallContentItem]: return [TextContentItem(text=text)] @@ -460,7 +460,7 @@ async def wrap_tool_execute( resolve display → original names for both filters above. Args: - ctx: The pydantic-ai run context (carries ``deps`` → agentpool + ctx: The pydantic-ai run context (carries ``deps`` → wolfharness ``AgentContext`` with the ``events`` emitter). call: The tool call part. tool_def: The tool definition. diff --git a/src/agentpool/capabilities/tool_output_budget.py b/src/wolfharness/capabilities/tool_output_budget.py similarity index 100% rename from src/agentpool/capabilities/tool_output_budget.py rename to src/wolfharness/capabilities/tool_output_budget.py diff --git a/src/agentpool/capabilities/viking/__init__.py b/src/wolfharness/capabilities/viking/__init__.py similarity index 98% rename from src/agentpool/capabilities/viking/__init__.py rename to src/wolfharness/capabilities/viking/__init__.py index 0fc104db9..fb45dd0b6 100644 --- a/src/agentpool/capabilities/viking/__init__.py +++ b/src/wolfharness/capabilities/viking/__init__.py @@ -11,7 +11,7 @@ remote skill discovery and reading from the Viking server. Configuration is via ``VikingCapabilityConfig`` in -``agentpool_config.capabilities``. +``wolfharness_config.capabilities``. """ from __future__ import annotations @@ -27,8 +27,8 @@ from pydantic_ai.capabilities import AbstractCapability from pydantic_ai.toolsets import AgentToolset, FunctionToolset -from agentpool.capabilities.viking.identity import VikingIdentity, _try_decode_api_key -from agentpool.capabilities.viking.ingest import ( +from wolfharness.capabilities.viking.identity import VikingIdentity, _try_decode_api_key +from wolfharness.capabilities.viking.ingest import ( _MEMORY_INTENT_TEMPLATE, _extract_conversation_pairs, _ingest_conversation, @@ -36,7 +36,7 @@ format_memory_diff_summary, read_memory_diff, ) -from agentpool.log import get_logger +from wolfharness.log import get_logger logger = get_logger(__name__) @@ -57,14 +57,14 @@ from pydantic_ai.messages import BinaryContent from pydantic_ai.models import ModelRequestContext - from agentpool.capabilities.change_event import ChangeEvent - from agentpool.capabilities.resource_protocols import ( + from wolfharness.capabilities.change_event import ChangeEvent + from wolfharness.capabilities.resource_protocols import ( BlobResourceContent, ResourceEntry, SkillEntry, TextResourceContent, ) - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities @dataclass @@ -205,7 +205,7 @@ class VikingCapability(AbstractCapability[Any]): """Ingestion mode — ``"async"`` (fire-and-forget) or ``"sync"``.""" auto_ingest_sanitize: bool = True """Strip injected Viking XML blocks from messages before ingestion.""" - auto_ingest_source_type: str = "agentpool" + auto_ingest_source_type: str = "wolfharness" """Source type metadata for ingested sessions.""" auto_ingest_keep_recent_turns: int = 0 """Number of recent turns to retain after commit. 0 = no retention.""" @@ -475,7 +475,7 @@ def get_instructions(self) -> str | None: Returns: The instruction string from ``instructions.py``. """ - from agentpool.capabilities.viking.instructions import _VIKING_INSTRUCTIONS + from wolfharness.capabilities.viking.instructions import _VIKING_INSTRUCTIONS return _VIKING_INSTRUCTIONS @@ -488,7 +488,7 @@ def get_toolset(self) -> AgentToolset[Any] | None: A ``FunctionToolset`` with the mode-appropriate tools, or ``None`` if the tool list is empty. """ - from agentpool.capabilities.viking.tools import build_tools + from wolfharness.capabilities.viking.tools import build_tools tool_fns = build_tools(self) if not tool_fns: @@ -506,8 +506,8 @@ async def get_tools(self) -> Sequence[Any]: Returns: A list of ``FunctionTool`` objects wrapping the tool closures. """ - from agentpool.capabilities.viking.tools import build_tools - from agentpool.tools.base import FunctionTool + from wolfharness.capabilities.viking.tools import build_tools + from wolfharness.tools.base import FunctionTool tool_fns = build_tools(self) return [FunctionTool.from_callable(fn) for fn in tool_fns] @@ -534,7 +534,7 @@ async def list_skills(self) -> list[SkillEntry]: if not isinstance(entries, list): return [] - from agentpool.capabilities.resource_protocols import SkillEntry + from wolfharness.capabilities.resource_protocols import SkillEntry skills: list[SkillEntry] = [] for entry in entries: @@ -679,7 +679,7 @@ async def _handle_compaction( from pydantic_ai.messages import ModelRequest, ModelResponse, TextPart, UserPromptPart - from agentpool.capabilities.viking.compaction import ( + from wolfharness.capabilities.viking.compaction import ( _estimate_tokens, _replace_old_messages, _serialize_messages, @@ -770,7 +770,7 @@ async def _list_resource_entries_from_uri(self, client: Any, uri: str) -> list[R Returns: A list of ``ResourceEntry`` descriptors for text files. """ - from agentpool.capabilities.resource_protocols import ResourceEntry + from wolfharness.capabilities.resource_protocols import ResourceEntry top_entries = await client.ls(uri) if not isinstance(top_entries, list): @@ -904,7 +904,7 @@ async def read_resource( if not content: return None - from agentpool.capabilities.resource_protocols import ( + from wolfharness.capabilities.resource_protocols import ( TextResourceContent, ) @@ -994,7 +994,7 @@ async def _handle_profile_inject( try: client = await self._ensure_client() - from agentpool.capabilities.viking.profile import ( + from wolfharness.capabilities.viking.profile import ( _derive_context_hint, _format_profile_block, ) @@ -1236,7 +1236,7 @@ def _capture_steer_channel(ctx: RunContext[Any]) -> tuple[Any, str | None]: Returns: A ``(session_pool_or_None, run_session_id_or_None)`` tuple. """ - from agentpool.capabilities.viking.tools import _get_session_id + from wolfharness.capabilities.viking.tools import _get_session_id run_session_id = _get_session_id(ctx) try: @@ -1509,7 +1509,7 @@ async def _handle_auto_recall( or the original context if recall is disabled, no user prompt is found, or an error occurs. """ - from agentpool.capabilities.viking.recall import ( + from wolfharness.capabilities.viking.recall import ( _extract_latest_user_prompt, _format_recall_block, _inject_system_message, @@ -1533,7 +1533,7 @@ async def _handle_auto_recall( memories_uri = self._resolve_memories_uri() # Extract session_id from ctx.deps if available - from agentpool.capabilities.viking.tools import _get_session_id + from wolfharness.capabilities.viking.tools import _get_session_id session_id = _get_session_id(ctx) diff --git a/src/agentpool/capabilities/viking/compaction.py b/src/wolfharness/capabilities/viking/compaction.py similarity index 100% rename from src/agentpool/capabilities/viking/compaction.py rename to src/wolfharness/capabilities/viking/compaction.py diff --git a/src/agentpool/capabilities/viking/identity.py b/src/wolfharness/capabilities/viking/identity.py similarity index 100% rename from src/agentpool/capabilities/viking/identity.py rename to src/wolfharness/capabilities/viking/identity.py diff --git a/src/agentpool/capabilities/viking/ingest.py b/src/wolfharness/capabilities/viking/ingest.py similarity index 99% rename from src/agentpool/capabilities/viking/ingest.py rename to src/wolfharness/capabilities/viking/ingest.py index edc72369d..d68e8f91b 100644 --- a/src/agentpool/capabilities/viking/ingest.py +++ b/src/wolfharness/capabilities/viking/ingest.py @@ -99,7 +99,7 @@ async def _ingest_conversation( messages: list[dict[str, str]], *, session_id: str, - source_type: str = "agentpool", + source_type: str = "wolfharness", keep_recent_turns: int = 0, ) -> Any: """Write conversation messages to a Viking session. diff --git a/src/agentpool/capabilities/viking/instructions.py b/src/wolfharness/capabilities/viking/instructions.py similarity index 100% rename from src/agentpool/capabilities/viking/instructions.py rename to src/wolfharness/capabilities/viking/instructions.py diff --git a/src/agentpool/capabilities/viking/profile.py b/src/wolfharness/capabilities/viking/profile.py similarity index 99% rename from src/agentpool/capabilities/viking/profile.py rename to src/wolfharness/capabilities/viking/profile.py index df0b47d80..1cea15441 100644 --- a/src/agentpool/capabilities/viking/profile.py +++ b/src/wolfharness/capabilities/viking/profile.py @@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any -from agentpool.capabilities.viking.utils import truncate_text +from wolfharness.capabilities.viking.utils import truncate_text _SNIPPET_LIMIT = 500 diff --git a/src/agentpool/capabilities/viking/recall.py b/src/wolfharness/capabilities/viking/recall.py similarity index 99% rename from src/agentpool/capabilities/viking/recall.py rename to src/wolfharness/capabilities/viking/recall.py index 1fb798f51..8e865e3a6 100644 --- a/src/agentpool/capabilities/viking/recall.py +++ b/src/wolfharness/capabilities/viking/recall.py @@ -11,7 +11,7 @@ import hashlib from typing import TYPE_CHECKING, Any -from agentpool.capabilities.viking.utils import truncate_text +from wolfharness.capabilities.viking.utils import truncate_text if TYPE_CHECKING: diff --git a/src/agentpool/capabilities/viking/tools.py b/src/wolfharness/capabilities/viking/tools.py similarity index 99% rename from src/agentpool/capabilities/viking/tools.py rename to src/wolfharness/capabilities/viking/tools.py index 6c2562e4a..2cc8ecde6 100644 --- a/src/agentpool/capabilities/viking/tools.py +++ b/src/wolfharness/capabilities/viking/tools.py @@ -14,7 +14,7 @@ from pydantic_ai.messages import ToolReturn from pydantic_ai.tools import RunContext # noqa: TC002 - needed at runtime for get_type_hints() -from agentpool.capabilities.viking.utils import ( +from wolfharness.capabilities.viking.utils import ( add_line_numbers, format_glob_results, format_grep_results, @@ -27,7 +27,7 @@ if TYPE_CHECKING: from collections.abc import Awaitable, Callable - from agentpool.capabilities.viking import VikingCapability + from wolfharness.capabilities.viking import VikingCapability def _get_session_id(ctx: RunContext[Any]) -> str | None: diff --git a/src/agentpool/capabilities/viking/utils.py b/src/wolfharness/capabilities/viking/utils.py similarity index 100% rename from src/agentpool/capabilities/viking/utils.py rename to src/wolfharness/capabilities/viking/utils.py diff --git a/src/agentpool/commands/__init__.py b/src/wolfharness/commands/__init__.py similarity index 69% rename from src/agentpool/commands/__init__.py rename to src/wolfharness/commands/__init__.py index 2ab198254..a86327277 100644 --- a/src/agentpool/commands/__init__.py +++ b/src/wolfharness/commands/__init__.py @@ -1,12 +1,12 @@ """Core command base classes. This module provides the ``NodeCommand`` and ``AgentCommand`` base classes -that were previously in ``agentpool_commands.base``. +that were previously in ``wolfharness_commands.base``. They live in the core layer so that protocol servers can import them without creating a server→cli dependency. """ -from agentpool.commands.base import AgentCommand, NodeCommand +from wolfharness.commands.base import AgentCommand, NodeCommand __all__ = ["AgentCommand", "NodeCommand"] diff --git a/src/agentpool/commands/base.py b/src/wolfharness/commands/base.py similarity index 91% rename from src/agentpool/commands/base.py rename to src/wolfharness/commands/base.py index 4a729ebae..39a69a922 100644 --- a/src/agentpool/commands/base.py +++ b/src/wolfharness/commands/base.py @@ -9,7 +9,7 @@ if TYPE_CHECKING: - from agentpool.messaging import MessageNode + from wolfharness.messaging import MessageNode class NodeCommand(SlashedCommand, ABC): @@ -33,6 +33,6 @@ class AgentCommand(NodeCommand): @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: """Check if node is an Agent.""" - from agentpool import Agent + from wolfharness import Agent return isinstance(node, Agent) diff --git a/src/agentpool/common_types.py b/src/wolfharness/common_types.py similarity index 97% rename from src/agentpool/common_types.py rename to src/wolfharness/common_types.py index ef5a0fa31..d4c5d417f 100644 --- a/src/agentpool/common_types.py +++ b/src/wolfharness/common_types.py @@ -27,9 +27,9 @@ from fsspec.asyn import AsyncFileSystem - from agentpool.agents.context import AgentContext - from agentpool.agents.events import RichAgentStreamEvent - from agentpool.tools.base import Tool + from wolfharness.agents.context import AgentContext + from wolfharness.agents.events import RichAgentStreamEvent + from wolfharness.tools.base import Tool type AnyTransformFn[T] = Callable[[T], T | Awaitable[T]] type OptionalAwaitable[T] = T | Awaitable[T] @@ -287,7 +287,7 @@ def _validate_type_args(data: Any, args: tuple[Any, ...]) -> None: # if __name__ == "__main__": -# from agentpool.models.manifest import AgentsManifest +# from wolfharness.models.manifest import AgentsManifest # AgentsManifestCode = ConfigCode.for_config( # AgentsManifest, diff --git a/src/agentpool/config_resources/__init__.py b/src/wolfharness/config_resources/__init__.py similarity index 94% rename from src/agentpool/config_resources/__init__.py rename to src/wolfharness/config_resources/__init__.py index befa99e31..50894b85c 100644 --- a/src/agentpool/config_resources/__init__.py +++ b/src/wolfharness/config_resources/__init__.py @@ -5,7 +5,7 @@ import importlib.resources from typing import Final -_RESOURCES = importlib.resources.files("agentpool.config_resources") +_RESOURCES = importlib.resources.files("wolfharness.config_resources") # Template configuration AGENTS_TEMPLATE: Final[str] = str(_RESOURCES / "agents_template.yml") diff --git a/src/agentpool/config_resources/acp_assistant.yml b/src/wolfharness/config_resources/acp_assistant.yml similarity index 92% rename from src/agentpool/config_resources/acp_assistant.yml rename to src/wolfharness/config_resources/acp_assistant.yml index c4c9c62c1..637c0dd9b 100644 --- a/src/agentpool/config_resources/acp_assistant.yml +++ b/src/wolfharness/config_resources/acp_assistant.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json # Default ACP assistant configuration # Used when starting ACP server without explicit config file diff --git a/src/agentpool/config_resources/agents.yml b/src/wolfharness/config_resources/agents.yml similarity index 98% rename from src/agentpool/config_resources/agents.yml rename to src/wolfharness/config_resources/agents.yml index 52a29dcd0..6f9904ec0 100644 --- a/src/agentpool/config_resources/agents.yml +++ b/src/wolfharness/config_resources/agents.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json responses: BasicResult: response_schema: diff --git a/src/agentpool/config_resources/agents_template.yml b/src/wolfharness/config_resources/agents_template.yml similarity index 90% rename from src/agentpool/config_resources/agents_template.yml rename to src/wolfharness/config_resources/agents_template.yml index 2f47b6f97..1beecd322 100644 --- a/src/agentpool/config_resources/agents_template.yml +++ b/src/wolfharness/config_resources/agents_template.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json agents: simple_agent: type: native diff --git a/src/agentpool/config_resources/claude_style_subagent.md b/src/wolfharness/config_resources/claude_style_subagent.md similarity index 100% rename from src/agentpool/config_resources/claude_style_subagent.md rename to src/wolfharness/config_resources/claude_style_subagent.md diff --git a/src/agentpool/config_resources/external_acp_agents.yml b/src/wolfharness/config_resources/external_acp_agents.yml similarity index 96% rename from src/agentpool/config_resources/external_acp_agents.yml rename to src/wolfharness/config_resources/external_acp_agents.yml index 787254eb1..360568d90 100644 --- a/src/agentpool/config_resources/external_acp_agents.yml +++ b/src/wolfharness/config_resources/external_acp_agents.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json agents: codex: type: acp diff --git a/src/agentpool/config_resources/opencode_style_subagent.md b/src/wolfharness/config_resources/opencode_style_subagent.md similarity index 100% rename from src/agentpool/config_resources/opencode_style_subagent.md rename to src/wolfharness/config_resources/opencode_style_subagent.md diff --git a/src/agentpool/config_resources/tts_test_agents.yml b/src/wolfharness/config_resources/tts_test_agents.yml similarity index 92% rename from src/agentpool/config_resources/tts_test_agents.yml rename to src/wolfharness/config_resources/tts_test_agents.yml index 4445efb69..c27ffa549 100644 --- a/src/agentpool/config_resources/tts_test_agents.yml +++ b/src/wolfharness/config_resources/tts_test_agents.yml @@ -1,10 +1,10 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/agentpool/refs/heads/main/schema/config-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/phil65/wolfharness/refs/heads/main/schema/config-schema.json # # Test configuration for TTS synchronization modes. # Each agent demonstrates a different TTS mode. # # Usage: -# uv run agentpool chat --config src/agentpool/config_resources/tts_test_agents.yml --agent tts_sync_sentence +# uv run wolfharness chat --config src/wolfharness/config_resources/tts_test_agents.yml --agent tts_sync_sentence # # Modes: # - sync_sentence: Block per sentence (audio syncs with text output) diff --git a/src/wolfharness/delegation/__init__.py b/src/wolfharness/delegation/__init__.py new file mode 100644 index 000000000..1573a73b8 --- /dev/null +++ b/src/wolfharness/delegation/__init__.py @@ -0,0 +1,6 @@ +"""Agent delegation and collaboration functionality.""" + +from wolfharness.delegation.pool import AgentPool +from wolfharness.delegation.base_team import BaseTeam + +__all__ = ["AgentPool", "BaseTeam"] diff --git a/src/agentpool/delegation/base_team.py b/src/wolfharness/delegation/base_team.py similarity index 95% rename from src/agentpool/delegation/base_team.py rename to src/wolfharness/delegation/base_team.py index 5638a4d02..e9e272612 100644 --- a/src/agentpool/delegation/base_team.py +++ b/src/wolfharness/delegation/base_team.py @@ -21,17 +21,17 @@ from jinja2 import BaseLoader, Environment import logfire -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.events import SpawnSessionStart, SubAgentEvent -from agentpool.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError -from agentpool.log import get_logger -from agentpool.messaging import AgentResponse, ChatMessage, MessageNode, TeamResponse -from agentpool.messaging.context import NodeContext -from agentpool.messaging.messagenode import get_source_type -from agentpool.messaging.processing import finalize_message, prepare_prompts -from agentpool.talk.stats import AggregatedMessageStats -from agentpool.talk.talk import Talk -from agentpool.utils.time_utils import get_now +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.events import SpawnSessionStart, SubAgentEvent +from wolfharness.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError +from wolfharness.log import get_logger +from wolfharness.messaging import AgentResponse, ChatMessage, MessageNode, TeamResponse +from wolfharness.messaging.context import NodeContext +from wolfharness.messaging.messagenode import get_source_type +from wolfharness.messaging.processing import finalize_message, prepare_prompts +from wolfharness.talk.stats import AggregatedMessageStats +from wolfharness.talk.talk import Talk +from wolfharness.utils.time_utils import get_now logger = get_logger(__name__) @@ -43,17 +43,17 @@ from evented_config import EventConfig from toprompt import AnyPromptType - from agentpool import Agent, AgentPool - from agentpool.agents.events import RichAgentStreamEvent - from agentpool.common_types import ( + from wolfharness import Agent, AgentPool + from wolfharness.agents.events import RichAgentStreamEvent + from wolfharness.common_types import ( ProcessorCallback, PromptCompatible, ) - from agentpool.delegation.graph_team import ExtendedTeamTalk - from agentpool.talk.stats import AggregatedTalkStats - from agentpool.ui.base import InputProvider - from agentpool_config.mcp_server import MCPServerConfig - from agentpool_config.teams import ExecutionMode, TeamMemberConfig + from wolfharness.delegation.graph_team import ExtendedTeamTalk + from wolfharness.talk.stats import AggregatedTalkStats + from wolfharness.ui.base import InputProvider + from wolfharness_config.mcp_server import MCPServerConfig + from wolfharness_config.teams import ExecutionMode, TeamMemberConfig @dataclass(kw_only=True) @@ -150,7 +150,7 @@ def __init__( member_timeout: Per-member execution timeout in seconds. validator: An optional validator node (sequential mode only). """ - from agentpool.delegation.graph_team import ExtendedTeamTalk + from wolfharness.delegation.graph_team import ExtendedTeamTalk self._name = name or " & ".join([i.name for i in agents]) self._nodes: list[MessageNode[Any, Any]] = [] @@ -180,7 +180,7 @@ def nodes(self) -> list[MessageNode[Any, Any]]: def add_node(self, node: MessageNode[Any, Any]) -> None: """Handler for adding new nodes to the team.""" - from agentpool.agents import Agent + from wolfharness.agents import Agent self._nodes.append(node) if isinstance(node, Agent): @@ -189,7 +189,7 @@ def add_node(self, node: MessageNode[Any, Any]) -> None: def remove_node(self, node: MessageNode[Any, Any]) -> None: """Handler for removing nodes from the team.""" - from agentpool.agents import Agent + from wolfharness.agents import Agent self._nodes.remove(node) if isinstance(node, Agent): @@ -227,7 +227,7 @@ def __or__( other: Agent[Any, Any] | ProcessorCallback[Any] | BaseTeam[Any, Any], ) -> BaseTeam[Any, Any]: """Create a sequential pipeline.""" - from agentpool.agents import Agent + from wolfharness.agents import Agent if callable(other): other = Agent.from_callback(other, agent_pool=self._agent_pool) @@ -255,7 +255,7 @@ def __and__( other: BaseTeam[Any, Any] | Agent[Any, Any] | ProcessorCallback[Any], ) -> BaseTeam[Any, Any]: """Combine teams, preserving type safety for same types.""" - from agentpool.agents import Agent + from wolfharness.agents import Agent if callable(other): other = Agent.from_callback(other, agent_pool=self._agent_pool) @@ -495,7 +495,7 @@ async def execute_iter( from pydantic_graph import GraphBuilder, Step from pydantic_graph.id_types import NodeID - from agentpool.delegation.graph_team import _make_sequential_step, _TeamRunGraphState + from wolfharness.delegation.graph_team import _make_sequential_step, _TeamRunGraphState all_nodes = list(self.nodes) if self.validator: @@ -680,7 +680,7 @@ async def run_stream( @staticmethod def _active_parent_session_id() -> str | None: """Return the active SessionPool session id when running inside a turn.""" - from agentpool.agents.base_agent import _current_run_ctx_var + from wolfharness.agents.base_agent import _current_run_ctx_var run_ctx = _current_run_ctx_var.get() session_id = getattr(run_ctx, "session_id", None) @@ -697,8 +697,8 @@ async def _resolve_scoped_team_nodes( if not parent_session_id or ctx is None or ctx.session_pool is None: return nodes, {} - from agentpool.agents.base_agent import BaseAgent - from agentpool.utils.identifiers import generate_session_id + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.utils.identifiers import generate_session_id session_pool = ctx.session_pool pool_agents = ctx.manifest.agents @@ -806,7 +806,7 @@ async def _load_member_skill_instructions( async def _load_skill_instructions(self, skill_name: str, member_name: str) -> str: pool = self._agent_pool if pool is None or pool.skill_resolver is None: - from agentpool.skills.exceptions import SkillNotFoundError + from wolfharness.skills.exceptions import SkillNotFoundError raise SkillNotFoundError(skill_name) @@ -860,7 +860,7 @@ async def _execute_parallel( **kwargs: Any, ) -> TeamResponse: """Run all agents in parallel via pydantic-graph Fork + Join.""" - from agentpool.delegation.graph_team import _TeamGraphState, run_team_graph + from wolfharness.delegation.graph_team import _TeamGraphState, run_team_graph self._team_talk.clear() default_prompt = list(prompts) @@ -892,7 +892,7 @@ async def _execute_parallel( parent_session_id, team_run_id, ) - from agentpool.talk.talk import Talk + from wolfharness.talk.talk import Talk execution_talks: list[Talk[Any]] = [] member_prompts: dict[str, list[PromptCompatible | None]] = {} @@ -939,7 +939,7 @@ async def _execute_sequential( **kwargs: Any, ) -> TeamResponse: """Run all agents sequentially via pydantic-graph chained steps.""" - from agentpool.delegation.graph_team import run_teamrun_graph + from wolfharness.delegation.graph_team import run_teamrun_graph self._team_talk.clear() start_time = get_now() @@ -1036,7 +1036,7 @@ async def _run_iter_sequential( **kwargs: Any, ) -> AsyncIterator[ChatMessage[Any]]: """Yield messages from the sequential execution chain.""" - from agentpool.talk.talk import Talk + from wolfharness.talk.talk import Talk all_nodes = list(self.nodes) if self.validator: @@ -1053,7 +1053,7 @@ async def _run_iter_sequential( connections.append(talk) self._team_talk.append(talk) - from agentpool.delegation.graph_team import run_teamrun_graph + from wolfharness.delegation.graph_team import run_teamrun_graph responses = await run_teamrun_graph( nodes=all_nodes, @@ -1073,8 +1073,8 @@ async def _run_stream_parallel( **kwargs: Any, ) -> AsyncIterator[RichAgentStreamEvent[Any]]: """Stream responses from all team members in parallel.""" - from agentpool.common_types import SupportsRunStream - from agentpool.utils.identifiers import generate_session_id + from wolfharness.common_types import SupportsRunStream + from wolfharness.utils.identifiers import generate_session_id session_id_kwarg: str | None = kwargs.pop("session_id", None) kwargs.pop("depth", None) @@ -1166,9 +1166,9 @@ async def _run_stream_sequential( **kwargs: Any, ) -> AsyncIterator[RichAgentStreamEvent[Any]]: """Stream responses through the chain of team members.""" - from agentpool.agents.events import StreamCompleteEvent - from agentpool.common_types import SupportsRunStream - from agentpool.utils.identifiers import generate_session_id + from wolfharness.agents.events import StreamCompleteEvent + from wolfharness.common_types import SupportsRunStream + from wolfharness.utils.identifiers import generate_session_id session_id_kwarg: str | None = kwargs.pop("session_id", None) kwargs.pop("depth", None) @@ -1261,7 +1261,7 @@ async def _run_stream_sequential( if __name__ == "__main__": async def main() -> None: - from agentpool import Agent, BaseTeam + from wolfharness import Agent, BaseTeam agent = Agent("My Agent", model="openai:gpt-5-nano") agent_2 = Agent("My Agent", model="openai:gpt-5-nano") diff --git a/src/agentpool/delegation/graph_team.py b/src/wolfharness/delegation/graph_team.py similarity index 97% rename from src/agentpool/delegation/graph_team.py rename to src/wolfharness/delegation/graph_team.py index 8b0c327d6..c5bf744e6 100644 --- a/src/agentpool/delegation/graph_team.py +++ b/src/wolfharness/delegation/graph_team.py @@ -14,16 +14,16 @@ from pydantic_graph import GraphBuilder, Step, StepContext, reduce_list_append -from agentpool.log import get_logger -from agentpool.messaging import AgentResponse, ChatMessage, TeamResponse -from agentpool.talk.talk import Talk, TeamTalk -from agentpool.utils.time_utils import get_now +from wolfharness.log import get_logger +from wolfharness.messaging import AgentResponse, ChatMessage, TeamResponse +from wolfharness.talk.talk import Talk, TeamTalk +from wolfharness.utils.time_utils import get_now if TYPE_CHECKING: from datetime import datetime - from agentpool.messaging.messagenode import MessageNode + from wolfharness.messaging.messagenode import MessageNode logger = get_logger(__name__) diff --git a/src/agentpool/delegation/message_flow_tracker.py b/src/wolfharness/delegation/message_flow_tracker.py similarity index 92% rename from src/agentpool/delegation/message_flow_tracker.py rename to src/wolfharness/delegation/message_flow_tracker.py index 238840016..34a67628f 100644 --- a/src/agentpool/delegation/message_flow_tracker.py +++ b/src/wolfharness/delegation/message_flow_tracker.py @@ -6,8 +6,8 @@ if TYPE_CHECKING: - from agentpool.messaging import ChatMessage - from agentpool.talk import Talk + from wolfharness.messaging import ChatMessage + from wolfharness.talk import Talk class MessageFlowTracker: diff --git a/src/agentpool/delegation/pool.py b/src/wolfharness/delegation/pool.py similarity index 93% rename from src/agentpool/delegation/pool.py rename to src/wolfharness/delegation/pool.py index 8175ef468..07bb4ccbf 100644 --- a/src/agentpool/delegation/pool.py +++ b/src/wolfharness/delegation/pool.py @@ -14,15 +14,15 @@ import logfire from upathtools import to_upath -from agentpool.capabilities.combined_toolset import _NamedCapability -from agentpool.capabilities.extension_registry import ExtensionRegistry -from agentpool.capabilities.resource_protocols import SkillResource -from agentpool.capabilities.skill_manager_cap import SkillManagerCap -from agentpool.delegation.message_flow_tracker import MessageFlowTracker -from agentpool.log import get_logger -from agentpool.skills.uri_resolver import SkillURIResolver -from agentpool.talk.registry import ConnectionRegistry -from agentpool.tasks import TaskRegistry +from wolfharness.capabilities.combined_toolset import _NamedCapability +from wolfharness.capabilities.extension_registry import ExtensionRegistry +from wolfharness.capabilities.resource_protocols import SkillResource +from wolfharness.capabilities.skill_manager_cap import SkillManagerCap +from wolfharness.delegation.message_flow_tracker import MessageFlowTracker +from wolfharness.log import get_logger +from wolfharness.skills.uri_resolver import SkillURIResolver +from wolfharness.talk.registry import ConnectionRegistry +from wolfharness.tasks import TaskRegistry if TYPE_CHECKING: @@ -32,16 +32,16 @@ from pydantic_ai.capabilities import AbstractCapability from upathtools import JoinablePathLike, UPath - from agentpool.common_types import AnyEventHandlerType - from agentpool.host.context import HostContext - from agentpool.host.factory import AgentFactory - from agentpool.messaging.compaction import CompactionPipeline - from agentpool.models.manifest import AgentsManifest, AnyAgentConfig - from agentpool.orchestrator import SessionPool - from agentpool.orchestrator.run import RunHandle - from agentpool.ui.base import InputProvider - from agentpool_config.session_pool import SessionPoolConfig - from agentpool_config.task import Job + from wolfharness.common_types import AnyEventHandlerType + from wolfharness.host.context import HostContext + from wolfharness.host.factory import AgentFactory + from wolfharness.messaging.compaction import CompactionPipeline + from wolfharness.models.manifest import AgentsManifest, AnyAgentConfig + from wolfharness.orchestrator import SessionPool + from wolfharness.orchestrator.run import RunHandle + from wolfharness.ui.base import InputProvider + from wolfharness_config.session_pool import SessionPoolConfig + from wolfharness_config.task import Job logger = get_logger(__name__) @@ -92,17 +92,17 @@ def __init__( # noqa: PLR0915 Raises: ValueError: If manifest contains invalid configurations """ - from agentpool.mcp_server.manager import MCPManager - from agentpool.models.manifest import AgentsManifest - from agentpool.observability import registry - from agentpool.prompts.manager import PromptManager - from agentpool.skills.manager import SkillsManager - from agentpool.storage import StorageManager - from agentpool.utils.streams import FileOpsTracker - from agentpool.utils.todos import TodoTracker - from agentpool.vfs_registry import VFSRegistry - from agentpool_config.context import ConfigContextManager - from agentpool_toolsets.builtin.debug import install_memory_handler + from wolfharness.mcp_server.manager import MCPManager + from wolfharness.models.manifest import AgentsManifest + from wolfharness.observability import registry + from wolfharness.prompts.manager import PromptManager + from wolfharness.skills.manager import SkillsManager + from wolfharness.storage import StorageManager + from wolfharness.utils.streams import FileOpsTracker + from wolfharness.utils.todos import TodoTracker + from wolfharness.vfs_registry import VFSRegistry + from wolfharness_config.context import ConfigContextManager + from wolfharness_toolsets.builtin.debug import install_memory_handler # Determine config path first, then load everything with context config_path: UPath | None = None @@ -148,7 +148,7 @@ def __init__( # noqa: PLR0915 # Previously handled by _connect_nodes which was removed along # with pool-level agent creation; this lightweight check preserves # the "Forward target .* not found" ValueError contract. - from agentpool_config.forward_targets import NodeConnectionConfig + from wolfharness_config.forward_targets import NodeConnectionConfig agent_names = set(manifest_obj.agents.keys()) for agent_cfg in manifest_obj.agents.values(): @@ -235,7 +235,7 @@ def get_context(self) -> HostContext: ``session_pool`` is up-to-date. """ if self._host_context is None or self._host_context.session_pool is not self._session_pool: - from agentpool.host.context import HostContext + from wolfharness.host.context import HostContext self._host_context = HostContext( manifest=self.manifest, @@ -266,7 +266,7 @@ def _safe_main_agent_name(self) -> str | None: def _factory(self) -> AgentFactory: """Lazy-initialized AgentFactory, cached on first access.""" if self._factory_instance is None: - from agentpool.host.factory import AgentFactory + from wolfharness.host.factory import AgentFactory self._factory_instance = AgentFactory(pool=self) return self._factory_instance @@ -292,7 +292,7 @@ async def __aenter__(self) -> Self: # Register config-defined capabilities (e.g. Viking, MCP, code # mode) at AGENT scope so they are available in the # ExtensionRegistry before any message handling occurs. - from agentpool.host.factory import AgentFactory + from wolfharness.host.factory import AgentFactory factory = AgentFactory(self) factory.register_config_capabilities(self.manifest, self.get_context()) @@ -305,7 +305,7 @@ async def __aenter__(self) -> Self: if self.storage.providers: self._session_store = self.storage.get_project_provider() # Initialize SessionPool - from agentpool.orchestrator import SessionPool + from wolfharness.orchestrator import SessionPool cfg = self._session_pool_config self._session_pool = SessionPool( @@ -324,7 +324,7 @@ async def __aenter__(self) -> Self: # Start team cleanup background task if team mode is enabled team_mode = self.manifest.team_mode if team_mode is not None and team_mode.enabled: - from agentpool.capabilities.file_team_state import ( + from wolfharness.capabilities.file_team_state import ( start_team_cleanup_task, ) @@ -417,7 +417,7 @@ def sessions(self) -> SessionPool | Any: @sessions.setter def sessions(self, value: Any) -> None: """Setter for test compatibility.""" - from agentpool.orchestrator import SessionPool + from wolfharness.orchestrator import SessionPool if isinstance(value, SessionPool): self._session_pool = value @@ -572,7 +572,7 @@ def is_skill_visible_to_node(self, skill: Any, node_name: str | None) -> bool: async def get_skill_instructions_for_node(self, skill_name: str, node_name: str) -> str: """Load skill instructions using a target node's package scope.""" - from agentpool.skills.exceptions import SkillNotFoundError + from wolfharness.skills.exceptions import SkillNotFoundError if self._skill_resolver is not None: skill = await self._skill_resolver.resolve(skill_name) @@ -641,8 +641,8 @@ async def _rebuild_skill_capabilities(self) -> None: This method is called: - During ``__aenter__`` after skill discovery completes. """ - from agentpool.capabilities.extension_registry import Scope, ScopeLevel - from agentpool.skills.skill_tool_manager import SkillToolManager + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.skills.skill_tool_manager import SkillToolManager # Build local skills dict from SkillsManager. local_skills: dict[str, Any] = {} @@ -730,7 +730,7 @@ async def _setup_resource_capability(self) -> None: via ``@runtime_checkable`` false-positive, leading to ``TypeError`` in ``resolve_resource_content()``. """ - from agentpool.capabilities.resource_capability import ResourceCapability + from wolfharness.capabilities.resource_capability import ResourceCapability cap = ResourceCapability() self._resource_capability = cap @@ -906,7 +906,7 @@ def register_task(self, name: str, task: Job[Any, Any]) -> None: if __name__ == "__main__": async def main() -> None: - path = "src/agentpool/config_resources/agents.yml" + path = "src/wolfharness/config_resources/agents.yml" async with AgentPool(path) as pool: print(f"AgentPool loaded with agents: {list(pool.agent_configs.keys())}") diff --git a/src/agentpool/diagnostics/__init__.py b/src/wolfharness/diagnostics/__init__.py similarity index 86% rename from src/agentpool/diagnostics/__init__.py rename to src/wolfharness/diagnostics/__init__.py index 4c4656335..114f78eec 100644 --- a/src/agentpool/diagnostics/__init__.py +++ b/src/wolfharness/diagnostics/__init__.py @@ -6,9 +6,9 @@ - Integration with execution environments (local, remote, sandboxed) """ -from agentpool.diagnostics.lsp_manager import LSPManager -from agentpool.diagnostics.lsp_proxy import LSPProxy -from agentpool.diagnostics.models import ( +from wolfharness.diagnostics.lsp_manager import LSPManager +from wolfharness.diagnostics.lsp_proxy import LSPProxy +from wolfharness.diagnostics.models import ( COMPLETION_KIND_MAP, CODE_ACTION_KIND_MAP, SYMBOL_KIND_MAP, diff --git a/src/agentpool/diagnostics/lsp_manager.py b/src/wolfharness/diagnostics/lsp_manager.py similarity index 99% rename from src/agentpool/diagnostics/lsp_manager.py rename to src/wolfharness/diagnostics/lsp_manager.py index 3dc57c8b6..95906e0a2 100644 --- a/src/agentpool/diagnostics/lsp_manager.py +++ b/src/wolfharness/diagnostics/lsp_manager.py @@ -17,7 +17,7 @@ import anyenv -from agentpool.diagnostics.models import ( +from wolfharness.diagnostics.models import ( COMPLETION_KIND_MAP, SYMBOL_KIND_MAP, CallHierarchyCall, @@ -42,7 +42,7 @@ from anyenv.lsp_servers import LSPServerInfo from exxec import ExecutionEnvironment - from agentpool.diagnostics.models import ( + from wolfharness.diagnostics.models import ( HoverContents, ) @@ -183,7 +183,7 @@ async def start_server( ValueError: If server_id not registered RuntimeError: If server fails to start """ - from agentpool.diagnostics.lsp_proxy import LSPProxy + from wolfharness.diagnostics.lsp_proxy import LSPProxy if server_id in self._servers: return self._servers[server_id] @@ -1202,7 +1202,7 @@ def _uri_to_language_id(uri: str) -> str: def _convert_diagnostic(diag: Any, server_id: str) -> Diagnostic: - """Convert anyenv Diagnostic to agentpool Diagnostic.""" + """Convert anyenv Diagnostic to wolfharness Diagnostic.""" return Diagnostic( file=diag.file, line=diag.line, diff --git a/src/agentpool/diagnostics/lsp_proxy.py b/src/wolfharness/diagnostics/lsp_proxy.py similarity index 100% rename from src/agentpool/diagnostics/lsp_proxy.py rename to src/wolfharness/diagnostics/lsp_proxy.py diff --git a/src/agentpool/diagnostics/lsp_proxy_script.py b/src/wolfharness/diagnostics/lsp_proxy_script.py similarity index 100% rename from src/agentpool/diagnostics/lsp_proxy_script.py rename to src/wolfharness/diagnostics/lsp_proxy_script.py diff --git a/src/agentpool/diagnostics/models.py b/src/wolfharness/diagnostics/models.py similarity index 100% rename from src/agentpool/diagnostics/models.py rename to src/wolfharness/diagnostics/models.py diff --git a/src/agentpool/docs/__init__.py b/src/wolfharness/docs/__init__.py similarity index 54% rename from src/agentpool/docs/__init__.py rename to src/wolfharness/docs/__init__.py index 969d0fc92..9f9578547 100644 --- a/src/agentpool/docs/__init__.py +++ b/src/wolfharness/docs/__init__.py @@ -1,5 +1,5 @@ """Example / Docs helpers.""" -from agentpool.docs.utils import generate_tool_docs, tool_to_markdown +from wolfharness.docs.utils import generate_tool_docs, tool_to_markdown __all__ = ["generate_tool_docs", "tool_to_markdown"] diff --git a/src/agentpool/docs/gen_examples.py b/src/wolfharness/docs/gen_examples.py similarity index 96% rename from src/agentpool/docs/gen_examples.py rename to src/wolfharness/docs/gen_examples.py index 61515f262..f26635f45 100644 --- a/src/agentpool/docs/gen_examples.py +++ b/src/wolfharness/docs/gen_examples.py @@ -10,7 +10,7 @@ DocStyle = Literal["simple", "full"] -EXAMPLES_DIR = Path("src/agentpool_docs/examples") +EXAMPLES_DIR = Path("src/wolfharness_docs/examples") def create_example_doc(name: str, *, style: DocStyle = "full") -> mk.MkContainer: diff --git a/src/agentpool/docs/utils.py b/src/wolfharness/docs/utils.py similarity index 95% rename from src/agentpool/docs/utils.py rename to src/wolfharness/docs/utils.py index 2bf202b68..dc80ae637 100644 --- a/src/agentpool/docs/utils.py +++ b/src/wolfharness/docs/utils.py @@ -12,11 +12,11 @@ if TYPE_CHECKING: from collections.abc import Awaitable, Iterator - from agentpool.capabilities.function_toolset import FunctionToolsetCapability - from agentpool.tools.base import Tool + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.tools.base import Tool -EXAMPLES_DIR = Path("src/agentpool_docs/examples") +EXAMPLES_DIR = Path("src/wolfharness_docs/examples") def is_pyodide() -> bool: @@ -116,7 +116,7 @@ def iter_examples(root: Path | str | None = None) -> Iterator[Example]: """Iterate over all available examples. Args: - root: Optional root directory (defaults to agentpool_docs/examples) + root: Optional root directory (defaults to wolfharness_docs/examples) """ root = Path(root) if root else EXAMPLES_DIR @@ -195,7 +195,7 @@ def check_docs_for_union( Example: ```python - from agentpool_config.toolsets import ToolsetConfig + from wolfharness_config.toolsets import ToolsetConfig missing, extra = check_docs_for_union( ToolsetConfig, Path("docs/configuration/toolsets"), @@ -317,8 +317,8 @@ def generate_tool_docs(toolset: FunctionToolsetCapability[Any]) -> str: Example: ```python exec="true" - from agentpool_toolsets.builtin.code import CodeTools - from agentpool.docs.utils import generate_tool_docs + from wolfharness_toolsets.builtin.code import CodeTools + from wolfharness.docs.utils import generate_tool_docs toolset = CodeTools() print(generate_tool_docs(toolset)) diff --git a/src/agentpool/functional/__init__.py b/src/wolfharness/functional/__init__.py similarity index 77% rename from src/agentpool/functional/__init__.py rename to src/wolfharness/functional/__init__.py index 990a9e220..19447b70b 100644 --- a/src/agentpool/functional/__init__.py +++ b/src/wolfharness/functional/__init__.py @@ -1,10 +1,10 @@ """High-level functional interfaces for AgentPool.""" -from agentpool.functional.run import ( +from wolfharness.functional.run import ( run_agent, run_agent_sync, ) -from agentpool.functional.structure import ( +from wolfharness.functional.structure import ( get_structured, get_structured_multiple, pick_one, diff --git a/src/agentpool/py.typed b/src/wolfharness/functional/py.typed similarity index 100% rename from src/agentpool/py.typed rename to src/wolfharness/functional/py.typed diff --git a/src/agentpool/functional/run.py b/src/wolfharness/functional/run.py similarity index 92% rename from src/agentpool/functional/run.py rename to src/wolfharness/functional/run.py index cb5d716ed..b8605ec58 100644 --- a/src/agentpool/functional/run.py +++ b/src/wolfharness/functional/run.py @@ -7,12 +7,12 @@ from anyenv import run_sync from pydantic_ai import ImageUrl -from agentpool import Agent +from wolfharness import Agent if TYPE_CHECKING: - from agentpool.agents.native_agent import AgentKwargs - from agentpool.common_types import PromptCompatible + from wolfharness.agents.native_agent import AgentKwargs + from wolfharness.common_types import PromptCompatible @overload diff --git a/src/agentpool/functional/structure.py b/src/wolfharness/functional/structure.py similarity index 96% rename from src/agentpool/functional/structure.py rename to src/wolfharness/functional/structure.py index 0b8ba4738..f2923ae92 100644 --- a/src/agentpool/functional/structure.py +++ b/src/wolfharness/functional/structure.py @@ -5,14 +5,14 @@ from enum import Enum from typing import TYPE_CHECKING, Literal, get_args -from agentpool.agents.native_agent import Agent -from agentpool.log import get_logger +from wolfharness.agents.native_agent import Agent +from wolfharness.log import get_logger if TYPE_CHECKING: from collections.abc import Callable - from agentpool.common_types import ModelType + from wolfharness.common_types import ModelType logger = get_logger(__name__) diff --git a/src/agentpool/hooks/AGENTS.md b/src/wolfharness/hooks/AGENTS.md similarity index 100% rename from src/agentpool/hooks/AGENTS.md rename to src/wolfharness/hooks/AGENTS.md diff --git a/src/wolfharness/hooks/__init__.py b/src/wolfharness/hooks/__init__.py new file mode 100644 index 000000000..a3eb59777 --- /dev/null +++ b/src/wolfharness/hooks/__init__.py @@ -0,0 +1,20 @@ +"""Runtime hook classes for agent lifecycle events.""" + +from __future__ import annotations + +from wolfharness.hooks.agent_hooks import AgentHooks +from wolfharness.hooks.base import Hook, HookEvent, HookInput, HookResult +from wolfharness.hooks.callable import CallableHook +from wolfharness.hooks.command import CommandHook +from wolfharness.hooks.prompt import PromptHook + +__all__ = [ + "AgentHooks", + "CallableHook", + "CommandHook", + "Hook", + "HookEvent", + "HookInput", + "HookResult", + "PromptHook", +] diff --git a/src/agentpool/hooks/agent_hooks.py b/src/wolfharness/hooks/agent_hooks.py similarity index 98% rename from src/agentpool/hooks/agent_hooks.py rename to src/wolfharness/hooks/agent_hooks.py index 6bd837193..76414c418 100644 --- a/src/agentpool/hooks/agent_hooks.py +++ b/src/wolfharness/hooks/agent_hooks.py @@ -6,8 +6,8 @@ from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any -from agentpool.hooks.base import HookInput, HookResult -from agentpool.log import get_logger +from wolfharness.hooks.base import HookInput, HookResult +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -15,7 +15,7 @@ from exxec import ExecutionEnvironment - from agentpool.hooks.base import Hook + from wolfharness.hooks.base import Hook logger = get_logger(__name__) diff --git a/src/agentpool/hooks/base.py b/src/wolfharness/hooks/base.py similarity index 99% rename from src/agentpool/hooks/base.py rename to src/wolfharness/hooks/base.py index 4b005483d..4651dcc5b 100644 --- a/src/agentpool/hooks/base.py +++ b/src/wolfharness/hooks/base.py @@ -6,7 +6,7 @@ import re from typing import TYPE_CHECKING, Any, Literal, TypedDict -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: diff --git a/src/agentpool/hooks/callable.py b/src/wolfharness/hooks/callable.py similarity index 95% rename from src/agentpool/hooks/callable.py rename to src/wolfharness/hooks/callable.py index 6b57fc8ea..705b9e4e7 100644 --- a/src/agentpool/hooks/callable.py +++ b/src/wolfharness/hooks/callable.py @@ -5,9 +5,9 @@ import asyncio from typing import TYPE_CHECKING, Any -from agentpool.hooks.base import Hook, HookResult -from agentpool.log import get_logger -from agentpool.utils.importing import import_callable +from wolfharness.hooks.base import Hook, HookResult +from wolfharness.log import get_logger +from wolfharness.utils.importing import import_callable if TYPE_CHECKING: @@ -15,7 +15,7 @@ from exxec import ExecutionEnvironment - from agentpool.hooks.base import HookEvent, HookInput + from wolfharness.hooks.base import HookEvent, HookInput logger = get_logger(__name__) diff --git a/src/agentpool/hooks/command.py b/src/wolfharness/hooks/command.py similarity index 97% rename from src/agentpool/hooks/command.py rename to src/wolfharness/hooks/command.py index 8e709fbe7..9db9f43e0 100644 --- a/src/agentpool/hooks/command.py +++ b/src/wolfharness/hooks/command.py @@ -9,14 +9,14 @@ import anyenv -from agentpool.hooks.base import Hook, HookResult -from agentpool.log import get_logger +from wolfharness.hooks.base import Hook, HookResult +from wolfharness.log import get_logger if TYPE_CHECKING: from exxec import ExecutionEnvironment - from agentpool.hooks.base import HookEvent, HookInput + from wolfharness.hooks.base import HookEvent, HookInput logger = get_logger(__name__) diff --git a/src/agentpool/hooks/prompt.py b/src/wolfharness/hooks/prompt.py similarity index 95% rename from src/agentpool/hooks/prompt.py rename to src/wolfharness/hooks/prompt.py index cc48a1f97..ba2fbe963 100644 --- a/src/agentpool/hooks/prompt.py +++ b/src/wolfharness/hooks/prompt.py @@ -9,14 +9,14 @@ from pydantic import Field from schemez import Schema -from agentpool.hooks.base import Hook, HookResult -from agentpool.log import get_logger +from wolfharness.hooks.base import Hook, HookResult +from wolfharness.log import get_logger if TYPE_CHECKING: from exxec import ExecutionEnvironment - from agentpool.hooks.base import HookEvent, HookInput + from wolfharness.hooks.base import HookEvent, HookInput logger = get_logger(__name__) @@ -125,7 +125,7 @@ async def _query_llm(self, prompt: str) -> HookDecision: Returns: Structured hook decision. """ - from agentpool import Agent + from wolfharness import Agent agent = Agent( model=self.model, diff --git a/src/agentpool/host/__init__.py b/src/wolfharness/host/__init__.py similarity index 100% rename from src/agentpool/host/__init__.py rename to src/wolfharness/host/__init__.py diff --git a/src/agentpool/host/context.py b/src/wolfharness/host/context.py similarity index 75% rename from src/agentpool/host/context.py rename to src/wolfharness/host/context.py index 4bdfa35df..8bc3caa4e 100644 --- a/src/agentpool/host/context.py +++ b/src/wolfharness/host/context.py @@ -10,7 +10,7 @@ from dataclasses import dataclass, field from typing import TYPE_CHECKING -from agentpool.host.stubs import CapabilityCache, ModelCache, ModelRegistry +from wolfharness.host.stubs import CapabilityCache, ModelCache, ModelRegistry if TYPE_CHECKING: @@ -19,17 +19,17 @@ from anyenv import ProcessManager from upathtools import UPath - from agentpool.capabilities.extension_registry import ExtensionRegistry - from agentpool.mcp_server.manager import MCPManager - from agentpool.models.manifest import AgentsManifest - from agentpool.orchestrator import SessionPool - from agentpool.prompts.manager import PromptManager - from agentpool.skills.manager import SkillsManager - from agentpool.storage import StorageManager - from agentpool.talk.registry import ConnectionRegistry - from agentpool.utils.streams import FileOpsTracker - from agentpool.utils.todos import TodoTracker - from agentpool.vfs_registry import VFSRegistry + from wolfharness.capabilities.extension_registry import ExtensionRegistry + from wolfharness.mcp_server.manager import MCPManager + from wolfharness.models.manifest import AgentsManifest + from wolfharness.orchestrator import SessionPool + from wolfharness.prompts.manager import PromptManager + from wolfharness.skills.manager import SkillsManager + from wolfharness.storage import StorageManager + from wolfharness.talk.registry import ConnectionRegistry + from wolfharness.utils.streams import FileOpsTracker + from wolfharness.utils.todos import TodoTracker + from wolfharness.vfs_registry import VFSRegistry @dataclass(frozen=True) diff --git a/src/agentpool/host/factory.py b/src/wolfharness/host/factory.py similarity index 91% rename from src/agentpool/host/factory.py rename to src/wolfharness/host/factory.py index 072aa7d50..624d90325 100644 --- a/src/agentpool/host/factory.py +++ b/src/wolfharness/host/factory.py @@ -26,7 +26,7 @@ Entry-Point Discovery (M3 Todo 12): ``compile()`` calls ``discover_entry_point_capabilities()`` to load all capability classes registered via the - ``agentpool.capabilities`` entry-point group. The discovered + ``wolfharness.capabilities`` entry-point group. The discovered mapping is stored in ``_entry_point_capabilities`` and used by ``resolve_capability_type()`` to resolve YAML ``type:`` references to capability classes. External packages can @@ -39,7 +39,7 @@ import asyncio from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -47,15 +47,15 @@ from pydantic_ai.capabilities import AbstractCapability - from agentpool.agents.base_agent import BaseAgent - from agentpool.agents.native_agent import Agent as NativeAgent - from agentpool.capabilities.change_event import ChangeEvent - from agentpool.delegation.pool import AgentPool - from agentpool.host.context import HostContext - from agentpool.host.registry import AgentRegistry - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest, AnyAgentConfig - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.agents.native_agent import Agent as NativeAgent + from wolfharness.capabilities.change_event import ChangeEvent + from wolfharness.delegation.pool import AgentPool + from wolfharness.host.context import HostContext + from wolfharness.host.registry import AgentRegistry + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest, AnyAgentConfig + from wolfharness.orchestrator.session_controller import SessionState logger = get_logger(__name__) @@ -111,7 +111,7 @@ def entry_point_capabilities(self) -> dict[str, type[AbstractCapability[object]] """Return the discovered entry-point capability types. Maps type names to capability classes discovered via the - ``agentpool.capabilities`` entry-point group. Populated by + ``wolfharness.capabilities`` entry-point group. Populated by ``compile()``. """ return self._entry_point_capabilities @@ -129,7 +129,7 @@ def compile( ``AggregatedResourceSource`` per agent. Discovers entry-point capabilities via the - ``agentpool.capabilities`` entry-point group and stores them + ``wolfharness.capabilities`` entry-point group and stores them for resolving YAML ``type:`` references to capability classes. Returns an empty ``AgentRegistry`` — agents are created lazily @@ -142,8 +142,8 @@ def compile( Returns: An empty AgentRegistry. """ - from agentpool.capabilities.registry import discover_entry_point_capabilities - from agentpool.host.registry import AgentRegistry + from wolfharness.capabilities.registry import discover_entry_point_capabilities + from wolfharness.host.registry import AgentRegistry self._capability_registry = {} self._entry_point_capabilities = discover_entry_point_capabilities() @@ -154,7 +154,7 @@ def compile( # Register capabilities at AGENT scope — these are compiled # from the agent's config and are specific to this agent. - from agentpool.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel agent_scope = Scope(level=ScopeLevel.AGENT, agent_name=agent_name) for cap in caps: @@ -186,9 +186,9 @@ def register_config_capabilities( manifest: The agents manifest to register caps from. host_context: The host context with shared services. """ - from agentpool.capabilities.extension_registry import Scope, ScopeLevel - from agentpool.models.agents import NativeAgentConfig - from agentpool_config.capabilities import build_config_capabilities + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.models.agents import NativeAgentConfig + from wolfharness_config.capabilities import build_config_capabilities for agent_name, cfg in manifest.agents.items(): if not isinstance(cfg, NativeAgentConfig) or not cfg.capabilities: @@ -208,7 +208,7 @@ def _build_agent_descriptions( Uses ``description`` field if set, otherwise falls back to the first non-empty line of ``system_prompt`` (for string prompts). """ - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig descriptions: dict[str, str] = {} agents = host_context.manifest.agents @@ -263,8 +263,8 @@ def _compile_agent_capabilities( Returns: List of compiled ``AbstractCapability`` instances. """ - from agentpool.capabilities.subagent_capability import SubagentCapability - from agentpool.models.agents import NativeAgentConfig + from wolfharness.capabilities.subagent_capability import SubagentCapability + from wolfharness.models.agents import NativeAgentConfig caps: list[AbstractCapability[Any]] = [] @@ -293,12 +293,12 @@ def _compile_agent_capabilities( # _extra_capabilities (line ~438) and conflict with the # agent's own _external_capabilities (duplicate tools). if isinstance(cfg, NativeAgentConfig) and cfg.capabilities: - from agentpool_config.capabilities import build_config_capabilities + from wolfharness_config.capabilities import build_config_capabilities config_caps = build_config_capabilities(cfg.capabilities) # Register directly at AGENT scope — do NOT add to `caps`. - from agentpool.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel agent_scope = Scope(level=ScopeLevel.AGENT, agent_name=agent_name) for c in config_caps: @@ -306,7 +306,7 @@ def _compile_agent_capabilities( # 4. Team communication capability — shared instance with session_metadata=None. # Per-session instance with actual metadata is created in create_session_agent(). - from agentpool_config.team_mode import resolve_team_mode + from wolfharness_config.team_mode import resolve_team_mode global_tm = host_context.manifest.team_mode agent_tm = cfg.team_mode @@ -314,7 +314,7 @@ def _compile_agent_capabilities( if resolved_tm is not None and resolved_tm.enabled: eligible = resolved_tm.lead_eligible + resolved_tm.member_eligible if agent_name in eligible: - from agentpool.capabilities.team_comm_capability import TeamCommCapability + from wolfharness.capabilities.team_comm_capability import TeamCommCapability agent_descs = self._build_agent_descriptions(host_context, eligible) caps.append( @@ -327,13 +327,13 @@ def _compile_agent_capabilities( # MCP servers are NOT compiled here — they are handled by MCPManager # which creates MCPCapability instances. MCPCapability is now - # deprecated; McpServerCap (agentpool.capabilities.mcp_server_cap) + # deprecated; McpServerCap (wolfharness.capabilities.mcp_server_cap) # is the replacement. Full migration to McpServerCap with # SessionConnectionPool injection happens in Phase 2/4. # Phase 4 task 4.13 will migrate MCPManager to use McpServerCap # via ExtensionRegistry. - from agentpool.capabilities.combined_toolset import _NamedCapability + from wolfharness.capabilities.combined_toolset import _NamedCapability logger.debug( "Compiled capabilities for agent", @@ -356,7 +356,7 @@ def _has_subagent_toolset(self, cfg: AnyAgentConfig) -> bool: Returns: True if the config has a tool with ``type == "subagent"``. """ - from agentpool_config.toolsets import SubagentToolsetConfig + from wolfharness_config.toolsets import SubagentToolsetConfig return any(isinstance(tool_config, SubagentToolsetConfig) for tool_config in cfg.tools) @@ -380,7 +380,7 @@ def resolve_capability_type( CapabilityNotFoundError: If ``type_name`` is not a registered entry-point capability. """ - from agentpool.capabilities.registry import resolve_capability_type + from wolfharness.capabilities.registry import resolve_capability_type return resolve_capability_type(type_name, self._entry_point_capabilities) @@ -422,7 +422,7 @@ async def create_session_agent( Returns: The created agent instance (already entered via __aenter__). """ - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig # Fix config name if missing. if cfg.name is None: @@ -463,13 +463,13 @@ async def create_session_agent( # (ACP, etc.) receive capabilities through their own protocol. caps = self._capability_registry.get(agent_name, []) if caps: - from agentpool.agents.native_agent import Agent as _NativeAgent + from wolfharness.agents.native_agent import Agent as _NativeAgent if isinstance(agent, _NativeAgent): agent._extra_capabilities = list(caps) # Per-session TeamCommCapability with actual session metadata. - from agentpool_config.team_mode import resolve_team_mode + from wolfharness_config.team_mode import resolve_team_mode global_tm = host_context.manifest.team_mode agent_tm = cfg.team_mode @@ -477,8 +477,8 @@ async def create_session_agent( if resolved_tm is not None and resolved_tm.enabled: eligible = resolved_tm.lead_eligible + resolved_tm.member_eligible if agent_name in eligible: - from agentpool.agents.native_agent import Agent as _NativeAgent2 - from agentpool.capabilities.team_comm_capability import TeamCommCapability + from wolfharness.agents.native_agent import Agent as _NativeAgent2 + from wolfharness.capabilities.team_comm_capability import TeamCommCapability # Set team_role metadata so tools can check lead/member permissions. # Protocol servers don't set this — factory is the right place. @@ -512,7 +512,7 @@ async def create_session_agent( agent._extra_capabilities = new_caps # Register the per-session TeamCommCapability at SESSION scope. - from agentpool.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel session_scope = Scope(level=ScopeLevel.SESSION, session_id=session_id) self._pool.extension_registry.register(team_cap, session_scope) @@ -553,7 +553,7 @@ async def _create_native_child( Path A: Inherits env, filesystem, MCP snapshot, and ACP transports from the parent agent. Model is NOT inherited. """ - from agentpool_config.context import ConfigContextManager + from wolfharness_config.context import ConfigContextManager with ConfigContextManager(host_context.config_file_path): agent: NativeAgent[Any, Any] = cfg.get_agent( @@ -571,8 +571,8 @@ async def _create_native_child( await agent.__aenter__() # MCP snapshot strategy A: INHERIT from parent. - from agentpool.agents.native_agent import Agent as _NativeAgent - from agentpool.mcp_server.config_snapshot import ( + from wolfharness.agents.native_agent import Agent as _NativeAgent + from wolfharness.mcp_server.config_snapshot import ( McpConfigSnapshot, ) @@ -643,7 +643,7 @@ async def _create_native_main( Path B: Builds MCP snapshot from the agent's own pool and agent configs. Loads conversation history from storage. """ - from agentpool_config.context import ConfigContextManager + from wolfharness_config.context import ConfigContextManager with ConfigContextManager(host_context.config_file_path): agent: NativeAgent[Any, Any] = cfg.get_agent( @@ -663,7 +663,7 @@ async def _create_native_main( ) # MCP snapshot strategy B: BUILD from agent. - from agentpool.mcp_server.config_snapshot import ( + from wolfharness.mcp_server.config_snapshot import ( McpConfigSnapshot, ) @@ -697,11 +697,11 @@ async def _create_non_native( Path C: Builds MCP snapshot manually from pool MCPManager and agent config's ``get_mcp_servers()``. """ - from agentpool.mcp_server.config_snapshot import ( + from wolfharness.mcp_server.config_snapshot import ( McpConfigEntry, McpConfigSnapshot, ) - from agentpool_config.context import ConfigContextManager + from wolfharness_config.context import ConfigContextManager with ConfigContextManager(host_context.config_file_path): agent: BaseAgent[Any, Any] = cfg.get_agent( @@ -762,7 +762,7 @@ async def _start_hot_swap_listeners( agent: The agent instance whose capabilities to monitor. caps: The compiled capability list to monitor. """ - from agentpool.capabilities.combined_toolset import ( + from wolfharness.capabilities.combined_toolset import ( _NamedCapability, _OnChangeCapable, ) @@ -829,7 +829,7 @@ async def _hot_swap_loop( except asyncio.CancelledError: raise except Exception: - from agentpool.capabilities.combined_toolset import _NamedCapability + from wolfharness.capabilities.combined_toolset import _NamedCapability cap_name = cap.name if isinstance(cap, _NamedCapability) else type(cap).__name__ logger.exception( diff --git a/src/agentpool/host/registry.py b/src/wolfharness/host/registry.py similarity index 96% rename from src/agentpool/host/registry.py rename to src/wolfharness/host/registry.py index 1b11ed90b..79031c1a7 100644 --- a/src/agentpool/host/registry.py +++ b/src/wolfharness/host/registry.py @@ -8,7 +8,7 @@ if TYPE_CHECKING: from collections.abc import Iterator - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent class AgentRegistry: diff --git a/src/agentpool/host/stubs.py b/src/wolfharness/host/stubs.py similarity index 99% rename from src/agentpool/host/stubs.py rename to src/wolfharness/host/stubs.py index 299fd268d..f6e1f76e7 100644 --- a/src/agentpool/host/stubs.py +++ b/src/wolfharness/host/stubs.py @@ -16,7 +16,7 @@ if TYPE_CHECKING: - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities logger = structlog.get_logger(__name__) diff --git a/src/agentpool/jinja_filters.py b/src/wolfharness/jinja_filters.py similarity index 98% rename from src/agentpool/jinja_filters.py rename to src/wolfharness/jinja_filters.py index 6a66c37e2..f63c0f73a 100644 --- a/src/agentpool/jinja_filters.py +++ b/src/wolfharness/jinja_filters.py @@ -1,4 +1,4 @@ -"""Jinja filters for agentpool documentation.""" +"""Jinja filters for wolfharness documentation.""" from __future__ import annotations diff --git a/src/agentpool/lifecycle/AGENTS.md b/src/wolfharness/lifecycle/AGENTS.md similarity index 92% rename from src/agentpool/lifecycle/AGENTS.md rename to src/wolfharness/lifecycle/AGENTS.md index 27a0509d3..3f1cd820b 100644 --- a/src/agentpool/lifecycle/AGENTS.md +++ b/src/wolfharness/lifecycle/AGENTS.md @@ -25,5 +25,5 @@ ## Anti-Patterns -- **Mixing `lifecycle.EventEnvelope` with `orchestrator.event_bus.EventEnvelope`**: Import from `agentpool.lifecycle.types` for lifecycle transport; from `agentpool.orchestrator.event_bus` for internal EventBus. +- **Mixing `lifecycle.EventEnvelope` with `orchestrator.event_bus.EventEnvelope`**: Import from `wolfharness.lifecycle.types` for lifecycle transport; from `wolfharness.orchestrator.event_bus` for internal EventBus. - **Do NOT instrument MemoryJournal / MemorySnapshotStore**: Pure in-memory implementations, no telemetry needed. diff --git a/src/agentpool/lifecycle/__init__.py b/src/wolfharness/lifecycle/__init__.py similarity index 75% rename from src/agentpool/lifecycle/__init__.py rename to src/wolfharness/lifecycle/__init__.py index 8d1646696..347e2cacc 100644 --- a/src/agentpool/lifecycle/__init__.py +++ b/src/wolfharness/lifecycle/__init__.py @@ -12,28 +12,28 @@ from __future__ import annotations -from agentpool.lifecycle.comm_channel import DirectChannel, ProtocolChannel -from agentpool.lifecycle.event_transport import InProcessTransport -from agentpool.lifecycle.factory import create_dimensions -from agentpool.lifecycle.journal import DurableJournal, MemoryJournal -from agentpool.lifecycle.protocols import ( +from wolfharness.lifecycle.comm_channel import DirectChannel, ProtocolChannel +from wolfharness.lifecycle.event_transport import InProcessTransport +from wolfharness.lifecycle.factory import create_dimensions +from wolfharness.lifecycle.journal import DurableJournal, MemoryJournal +from wolfharness.lifecycle.protocols import ( CommChannel, EventTransport, Journal, SnapshotStore, TriggerSource, ) -from agentpool.lifecycle.snapshot_store import ( +from wolfharness.lifecycle.snapshot_store import ( DurableSnapshotStore, MemorySnapshotStore, ) -from agentpool.lifecycle.triggers import ( +from wolfharness.lifecycle.triggers import ( ChannelTrigger, ImmediateTrigger, ProtocolTrigger, ScheduledTrigger, ) -from agentpool.lifecycle.types import ( +from wolfharness.lifecycle.types import ( DeliveryMode, EventEnvelope, Feedback, diff --git a/src/agentpool/lifecycle/comm_channel.py b/src/wolfharness/lifecycle/comm_channel.py similarity index 98% rename from src/agentpool/lifecycle/comm_channel.py rename to src/wolfharness/lifecycle/comm_channel.py index 946b14470..0ff2da869 100644 --- a/src/agentpool/lifecycle/comm_channel.py +++ b/src/wolfharness/lifecycle/comm_channel.py @@ -21,19 +21,19 @@ from collections import deque from typing import TYPE_CHECKING, Any -from agentpool.agents.events import ( +from wolfharness.agents.events import ( MessageReplacementEvent, PlanUpdateEvent, StateUpdate, ToolCallUpdateEvent, ) -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: - from agentpool.lifecycle.protocols import Journal - from agentpool.lifecycle.types import Feedback, RunState - from agentpool.orchestrator.event_bus import EventBus + from wolfharness.lifecycle.protocols import Journal + from wolfharness.lifecycle.types import Feedback, RunState + from wolfharness.orchestrator.event_bus import EventBus logger = get_logger(__name__) diff --git a/src/agentpool/lifecycle/event_transport.py b/src/wolfharness/lifecycle/event_transport.py similarity index 99% rename from src/agentpool/lifecycle/event_transport.py rename to src/wolfharness/lifecycle/event_transport.py index 0ee43a7ba..75f64ba2f 100644 --- a/src/agentpool/lifecycle/event_transport.py +++ b/src/wolfharness/lifecycle/event_transport.py @@ -17,7 +17,7 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool.lifecycle.types import EventEnvelope + from wolfharness.lifecycle.types import EventEnvelope class InProcessTransport: diff --git a/src/agentpool/lifecycle/factory.py b/src/wolfharness/lifecycle/factory.py similarity index 92% rename from src/agentpool/lifecycle/factory.py rename to src/wolfharness/lifecycle/factory.py index 99b7741c2..b231b4463 100644 --- a/src/agentpool/lifecycle/factory.py +++ b/src/wolfharness/lifecycle/factory.py @@ -7,7 +7,7 @@ Usage:: - from agentpool.lifecycle.factory import create_dimensions + from wolfharness.lifecycle.factory import create_dimensions trigger, journal, snapshot, comm, transport = create_dimensions( lifecycle_config, @@ -33,28 +33,28 @@ from platformdirs import user_state_dir from sqlalchemy import Engine, create_engine -from agentpool.lifecycle.comm_channel import DirectChannel -from agentpool.lifecycle.event_transport import InProcessTransport -from agentpool.lifecycle.journal import DurableJournal, MemoryJournal -from agentpool.lifecycle.snapshot_store import ( +from wolfharness.lifecycle.comm_channel import DirectChannel +from wolfharness.lifecycle.event_transport import InProcessTransport +from wolfharness.lifecycle.journal import DurableJournal, MemoryJournal +from wolfharness.lifecycle.snapshot_store import ( DurableSnapshotStore, MemorySnapshotStore, ) if TYPE_CHECKING: - from agentpool.lifecycle.protocols import ( + from wolfharness.lifecycle.protocols import ( CommChannel, EventTransport, Journal, SnapshotStore, TriggerSource, ) - from agentpool_config.lifecycle import LifecycleConfig + from wolfharness_config.lifecycle import LifecycleConfig -_APP_NAME = "agentpool" -_APP_AUTHOR = "agentpool" +_APP_NAME = "wolfharness" +_APP_AUTHOR = "wolfharness" _STATE_DIR: Path = Path(user_state_dir(_APP_NAME, _APP_AUTHOR)) _LIFECYCLE_DB: Path = _STATE_DIR / "lifecycle.db" diff --git a/src/agentpool/lifecycle/journal.py b/src/wolfharness/lifecycle/journal.py similarity index 98% rename from src/agentpool/lifecycle/journal.py rename to src/wolfharness/lifecycle/journal.py index 97f6cbf10..00cbee719 100644 --- a/src/agentpool/lifecycle/journal.py +++ b/src/wolfharness/lifecycle/journal.py @@ -28,8 +28,8 @@ from sqlmodel import Field, SQLModel from sqlmodel.main import SQLModelConfig # type: ignore[attr-defined] -from agentpool.lifecycle.types import ResumeResult, ToolExecutionRecord -from agentpool.log import get_logger +from wolfharness.lifecycle.types import ResumeResult, ToolExecutionRecord +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -37,7 +37,7 @@ from sqlalchemy.engine import Engine - from agentpool.lifecycle.protocols import SnapshotStore + from wolfharness.lifecycle.protocols import SnapshotStore logger = get_logger(__name__) @@ -673,7 +673,7 @@ def close(self) -> None: # Register known event types for deserialization reconstruction. -from agentpool.agents.events.events import ( # noqa: E402 +from wolfharness.agents.events.events import ( # noqa: E402 MessageReplacementEvent, PlanUpdateEvent, RunErrorEvent, diff --git a/src/agentpool/lifecycle/protocols.py b/src/wolfharness/lifecycle/protocols.py similarity index 99% rename from src/agentpool/lifecycle/protocols.py rename to src/wolfharness/lifecycle/protocols.py index 805591336..29516ee90 100644 --- a/src/agentpool/lifecycle/protocols.py +++ b/src/wolfharness/lifecycle/protocols.py @@ -14,7 +14,7 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool.lifecycle.types import ( + from wolfharness.lifecycle.types import ( EventEnvelope, Feedback, Prompt, diff --git a/src/agentpool/lifecycle/snapshot_store.py b/src/wolfharness/lifecycle/snapshot_store.py similarity index 99% rename from src/agentpool/lifecycle/snapshot_store.py rename to src/wolfharness/lifecycle/snapshot_store.py index ab8d45f0c..4446e66eb 100644 --- a/src/agentpool/lifecycle/snapshot_store.py +++ b/src/wolfharness/lifecycle/snapshot_store.py @@ -4,7 +4,7 @@ DurableSnapshotStore provides crash-safe SQL persistence with fsync on write. Both implementations conform to the ``SnapshotStore`` Protocol defined in -``agentpool.lifecycle.protocols``. +``wolfharness.lifecycle.protocols``. """ from __future__ import annotations @@ -23,7 +23,7 @@ import logfire -from agentpool.log import get_logger +from wolfharness.log import get_logger logger = get_logger(__name__) diff --git a/src/agentpool/lifecycle/triggers.py b/src/wolfharness/lifecycle/triggers.py similarity index 97% rename from src/agentpool/lifecycle/triggers.py rename to src/wolfharness/lifecycle/triggers.py index b24f1f061..beb2a36d5 100644 --- a/src/agentpool/lifecycle/triggers.py +++ b/src/wolfharness/lifecycle/triggers.py @@ -19,7 +19,7 @@ if TYPE_CHECKING: - from agentpool.lifecycle.types import Prompt + from wolfharness.lifecycle.types import Prompt class ImmediateTrigger: @@ -60,7 +60,7 @@ def poll(self) -> Prompt | None: if self._delivered: return None self._delivered = True - from agentpool.lifecycle.types import Prompt + from wolfharness.lifecycle.types import Prompt return Prompt(content=self._prompt) @@ -100,7 +100,7 @@ async def deliver(self, content: str, priority: str = "normal") -> None: content: The prompt text to deliver. priority: Delivery priority (``"normal"`` or ``"asap"``). """ - from agentpool.lifecycle.types import Prompt + from wolfharness.lifecycle.types import Prompt prompt = Prompt(content=content, priority=priority) await self._queue.put(prompt) diff --git a/src/agentpool/lifecycle/types.py b/src/wolfharness/lifecycle/types.py similarity index 100% rename from src/agentpool/lifecycle/types.py rename to src/wolfharness/lifecycle/types.py diff --git a/src/agentpool/log.py b/src/wolfharness/log.py similarity index 97% rename from src/agentpool/log.py rename to src/wolfharness/log.py index b71395547..fda2f61d2 100644 --- a/src/agentpool/log.py +++ b/src/wolfharness/log.py @@ -1,4 +1,4 @@ -"""Logging configuration for agentpool with structlog support.""" +"""Logging configuration for wolfharness with structlog support.""" from __future__ import annotations @@ -203,7 +203,7 @@ def get_logger(name: str, log_level: LogLevel | None = None) -> structlog.stdlib """Get a structlog logger for the given name. Args: - name: The name of the logger, will be prefixed with 'agentpool.' + name: The name of the logger, will be prefixed with 'wolfharness.' log_level: The logging level to set for the logger Returns: @@ -228,13 +228,13 @@ def get_logger(name: str, log_level: LogLevel | None = None) -> structlog.stdlib cache_logger_on_first_use=True, ) - logger = structlog.get_logger(f"agentpool.{name}") + logger = structlog.get_logger(f"wolfharness.{name}") if log_level is not None: if isinstance(log_level, str): log_level = getattr(logging, log_level.upper()) assert log_level # Set level on underlying stdlib logger - stdlib_logger = logging.getLogger(f"agentpool.{name}") + stdlib_logger = logging.getLogger(f"wolfharness.{name}") stdlib_logger.setLevel(log_level) return logger # type: ignore[no-any-return] diff --git a/src/wolfharness/mcp_server/__init__.py b/src/wolfharness/mcp_server/__init__.py new file mode 100644 index 000000000..e63d9946e --- /dev/null +++ b/src/wolfharness/mcp_server/__init__.py @@ -0,0 +1,6 @@ +"""MCP server integration for AgentPool.""" + +from wolfharness.mcp_server.client import MCPClient +from wolfharness.mcp_server.tool_bridge import ToolManagerBridge + +__all__ = ["MCPClient", "ToolManagerBridge"] diff --git a/src/agentpool/mcp_server/client.py b/src/wolfharness/mcp_server/client.py similarity index 97% rename from src/agentpool/mcp_server/client.py rename to src/wolfharness/mcp_server/client.py index 00731a443..34582b639 100644 --- a/src/agentpool/mcp_server/client.py +++ b/src/wolfharness/mcp_server/client.py @@ -19,15 +19,15 @@ from pydantic_ai import BinaryContent, RunContext, ToolReturn from schemez import FunctionSchema -from agentpool.agents.context import AgentContext -from agentpool.log import get_logger -from agentpool.mcp_server.constants import MCP_TO_LOGGING -from agentpool.mcp_server.helpers import extract_text_content, mcp_tool_to_fn_schema -from agentpool.mcp_server.message_handler import MCPMessageHandler -from agentpool.tools import CallDeferred -from agentpool.tools.base import FunctionTool -from agentpool.utils.signatures import create_modified_signature -from agentpool_config.mcp_server import ( +from wolfharness.agents.context import AgentContext +from wolfharness.log import get_logger +from wolfharness.mcp_server.constants import MCP_TO_LOGGING +from wolfharness.mcp_server.helpers import extract_text_content, mcp_tool_to_fn_schema +from wolfharness.mcp_server.message_handler import MCPMessageHandler +from wolfharness.tools import CallDeferred +from wolfharness.tools.base import FunctionTool +from wolfharness.utils.signatures import create_modified_signature +from wolfharness_config.mcp_server import ( AcpMCPServerConfig, SSEMCPServerConfig, StdioMCPServerConfig, @@ -60,7 +60,7 @@ ) from upathtools.filesystems import MCPFileSystem, MCPToolsFileSystem - from agentpool_config.mcp_server import MCPServerConfig + from wolfharness_config.mcp_server import MCPServerConfig logger = get_logger(__name__) @@ -299,7 +299,7 @@ def _get_client( icons = [Icon(src=self._client_icon_path)] client_info = Implementation( name=self._client_name, - version=version("agentpool"), + version=version("wolfharness"), title=self._client_title, websiteUrl=self._client_website_url, icons=icons, @@ -341,7 +341,7 @@ def _get_client_from_transport(self, transport: ClientTransport) -> fastmcp.Clie icons = [Icon(src=self._client_icon_path)] client_info = Implementation( name=self._client_name, - version=version("agentpool"), + version=version("wolfharness"), title=self._client_title, websiteUrl=self._client_website_url, icons=icons, @@ -570,7 +570,7 @@ async def call_tool( # noqa: PLR0915 agent_ctx: AgentContext[Any] | None = None, ) -> ToolReturn | str | Any: """Call an MCP tool with full PydanticAI return type support.""" - from agentpool.mcp_server.conversions import from_mcp_content + from wolfharness.mcp_server.conversions import from_mcp_content self._ensure_connected() # Create progress handler that bridges to AgentContext if available @@ -716,7 +716,7 @@ def _mcp_content_return_value( if __name__ == "__main__": - path = "/home/phil65/dev/oss/agentpool/tests/mcp_server/server.py" + path = "/home/phil65/dev/oss/wolfharness/tests/mcp_server/server.py" # path = Path(__file__).parent / "test_mcp_server.py" config = StdioMCPServerConfig(command="uv", args=["run", str(path)]) diff --git a/src/agentpool/mcp_server/config_snapshot.py b/src/wolfharness/mcp_server/config_snapshot.py similarity index 98% rename from src/agentpool/mcp_server/config_snapshot.py rename to src/wolfharness/mcp_server/config_snapshot.py index 8ae0fac0e..3daf49e5b 100644 --- a/src/agentpool/mcp_server/config_snapshot.py +++ b/src/wolfharness/mcp_server/config_snapshot.py @@ -7,7 +7,7 @@ if TYPE_CHECKING: - from agentpool_config.mcp_server import BaseMCPServerConfig + from wolfharness_config.mcp_server import BaseMCPServerConfig SourceScope = Literal["pool", "agent", "session", "skill"] diff --git a/src/agentpool/mcp_server/constants.py b/src/wolfharness/mcp_server/constants.py similarity index 100% rename from src/agentpool/mcp_server/constants.py rename to src/wolfharness/mcp_server/constants.py diff --git a/src/agentpool/mcp_server/conversions.py b/src/wolfharness/mcp_server/conversions.py similarity index 98% rename from src/agentpool/mcp_server/conversions.py rename to src/wolfharness/mcp_server/conversions.py index 2af91b071..d5cceabb3 100644 --- a/src/agentpool/mcp_server/conversions.py +++ b/src/wolfharness/mcp_server/conversions.py @@ -14,8 +14,8 @@ UserPromptPart, ) -from agentpool.log import get_logger -from agentpool.utils.pydantic_ai_helpers import url_from_mime_type +from wolfharness.log import get_logger +from wolfharness.utils.pydantic_ai_helpers import url_from_mime_type if TYPE_CHECKING: diff --git a/src/agentpool/mcp_server/global_pool.py b/src/wolfharness/mcp_server/global_pool.py similarity index 98% rename from src/agentpool/mcp_server/global_pool.py rename to src/wolfharness/mcp_server/global_pool.py index 225f423d0..ff1098839 100644 --- a/src/agentpool/mcp_server/global_pool.py +++ b/src/wolfharness/mcp_server/global_pool.py @@ -30,7 +30,7 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool_config.mcp_server import BaseMCPServerConfig + from wolfharness_config.mcp_server import BaseMCPServerConfig logger = logging.getLogger(__name__) @@ -123,7 +123,7 @@ async def get_transport( RuntimeError: If the owner task fails to initialize the connection. TimeoutError: If the owner task does not become ready in time. """ - from agentpool_config.mcp_server import ( + from wolfharness_config.mcp_server import ( AcpMCPServerConfig, StdioMCPServerConfig, ) diff --git a/src/agentpool/mcp_server/helpers.py b/src/wolfharness/mcp_server/helpers.py similarity index 96% rename from src/agentpool/mcp_server/helpers.py rename to src/wolfharness/mcp_server/helpers.py index 88d3812b3..9f29eb960 100644 --- a/src/agentpool/mcp_server/helpers.py +++ b/src/wolfharness/mcp_server/helpers.py @@ -8,7 +8,7 @@ from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: diff --git a/src/agentpool/mcp_server/manager.py b/src/wolfharness/mcp_server/manager.py similarity index 97% rename from src/agentpool/mcp_server/manager.py rename to src/wolfharness/mcp_server/manager.py index 804e69663..dae61ed34 100644 --- a/src/agentpool/mcp_server/manager.py +++ b/src/wolfharness/mcp_server/manager.py @@ -13,12 +13,12 @@ import anyio from pydantic_ai.capabilities import AbstractCapability -from agentpool.capabilities.combined_toolset import CombinedToolsetCapability -from agentpool.capabilities.mcp_server_cap import McpServerCap -from agentpool.common_types import MCPServerStatus -from agentpool.log import get_logger -from agentpool.mcp_server.global_pool import GlobalConnectionPool -from agentpool_config.mcp_server import AcpMCPServerConfig, BaseMCPServerConfig +from wolfharness.capabilities.combined_toolset import CombinedToolsetCapability +from wolfharness.capabilities.mcp_server_cap import McpServerCap +from wolfharness.common_types import MCPServerStatus +from wolfharness.log import get_logger +from wolfharness.mcp_server.global_pool import GlobalConnectionPool +from wolfharness_config.mcp_server import AcpMCPServerConfig, BaseMCPServerConfig if TYPE_CHECKING: @@ -31,11 +31,11 @@ from mcp.types import ElicitRequestParams, SamplingMessage from pydantic_ai.capabilities import MCP - from agentpool.mcp_server.config_snapshot import McpConfigSnapshot - from agentpool.mcp_server.session_pool import SessionConnectionPool - from agentpool.ui.base import InputProvider - from agentpool_config.mcp_server import MCPServerConfig - from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager + from wolfharness.mcp_server.config_snapshot import McpConfigSnapshot + from wolfharness.mcp_server.session_pool import SessionConnectionPool + from wolfharness.ui.base import InputProvider + from wolfharness_config.mcp_server import MCPServerConfig + from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager logger = get_logger(__name__) @@ -256,7 +256,7 @@ def get_or_create_session(self, session_id: str) -> McpSessionContext: Returns: The ``McpSessionContext`` for this session. """ - from agentpool.mcp_server.session_pool import SessionConnectionPool + from wolfharness.mcp_server.session_pool import SessionConnectionPool ctx = self._session_contexts.get(session_id) if ctx is None: @@ -355,8 +355,8 @@ async def _sampling_callback( context: RequestContext[Any, Any, Any], ) -> str: """Handle MCP sampling by creating a new agent with specified preferences.""" - from agentpool.agents import Agent - from agentpool.mcp_server.conversions import sampling_messages_to_user_content + from wolfharness.agents import Agent + from wolfharness.mcp_server.conversions import sampling_messages_to_user_content prompts = sampling_messages_to_user_content(messages) model = self.sampling_model @@ -409,7 +409,7 @@ async def setup_server( ) return None - from agentpool.mcp_server.client import MCPClient + from wolfharness.mcp_server.client import MCPClient try: client = MCPClient( @@ -691,7 +691,7 @@ async def get_capabilities( # noqa: PLR0915 from pydantic_ai.capabilities import MCP from pydantic_ai.mcp import MCPToolset - from agentpool_config.mcp_server import ( + from wolfharness_config.mcp_server import ( SSEMCPServerConfig, StdioMCPServerConfig, StreamableHTTPMCPServerConfig, diff --git a/src/agentpool/mcp_server/message_handler.py b/src/wolfharness/mcp_server/message_handler.py similarity index 96% rename from src/agentpool/mcp_server/message_handler.py rename to src/wolfharness/mcp_server/message_handler.py index 1564d29eb..7b085caca 100644 --- a/src/agentpool/mcp_server/message_handler.py +++ b/src/wolfharness/mcp_server/message_handler.py @@ -1,11 +1,11 @@ -"""FastMCP message handler for agentpool.""" +"""FastMCP message handler for wolfharness.""" from __future__ import annotations from dataclasses import dataclass from typing import TYPE_CHECKING -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -14,14 +14,14 @@ from mcp.shared.session import RequestResponder import mcp.types - from agentpool.mcp_server import MCPClient + from wolfharness.mcp_server import MCPClient logger = get_logger(__name__) @dataclass class MCPMessageHandler: - """Custom message handler that bridges FastMCP to agentpool notifications.""" + """Custom message handler that bridges FastMCP to wolfharness notifications.""" client: MCPClient """The MCP client instance.""" diff --git a/src/agentpool/mcp_server/registries/__init__.py b/src/wolfharness/mcp_server/registries/__init__.py similarity index 100% rename from src/agentpool/mcp_server/registries/__init__.py rename to src/wolfharness/mcp_server/registries/__init__.py diff --git a/src/agentpool/mcp_server/registries/official_registry_client.py b/src/wolfharness/mcp_server/registries/official_registry_client.py similarity index 100% rename from src/agentpool/mcp_server/registries/official_registry_client.py rename to src/wolfharness/mcp_server/registries/official_registry_client.py diff --git a/src/agentpool/mcp_server/registries/pulsemcp_client.py b/src/wolfharness/mcp_server/registries/pulsemcp_client.py similarity index 100% rename from src/agentpool/mcp_server/registries/pulsemcp_client.py rename to src/wolfharness/mcp_server/registries/pulsemcp_client.py diff --git a/src/agentpool/mcp_server/session_pool.py b/src/wolfharness/mcp_server/session_pool.py similarity index 96% rename from src/agentpool/mcp_server/session_pool.py rename to src/wolfharness/mcp_server/session_pool.py index bb21c6f54..e68fb5730 100644 --- a/src/agentpool/mcp_server/session_pool.py +++ b/src/wolfharness/mcp_server/session_pool.py @@ -24,14 +24,14 @@ import threading from typing import TYPE_CHECKING -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: from fastmcp.client import ClientTransport - from agentpool.mcp_server.client import MCPClient - from agentpool_config.mcp_server import BaseMCPServerConfig, MCPServerConfig + from wolfharness.mcp_server.client import MCPClient + from wolfharness_config.mcp_server import BaseMCPServerConfig, MCPServerConfig logger = get_logger(__name__) @@ -78,7 +78,7 @@ def _create_transport(config: BaseMCPServerConfig) -> ClientTransport: from fastmcp.client import SSETransport, StreamableHttpTransport from fastmcp.client.transports import StdioTransport - from agentpool_config.mcp_server import ( + from wolfharness_config.mcp_server import ( AcpMCPServerConfig, SSEMCPServerConfig, StdioMCPServerConfig, @@ -90,7 +90,7 @@ def _create_transport(config: BaseMCPServerConfig) -> ClientTransport: env = config.get_env_vars() return StdioTransport(command=command, args=args, env=env) case SSEMCPServerConfig(url=url, headers=headers): - from agentpool_config.mcp_server import make_mcp_httpx_client_factory + from wolfharness_config.mcp_server import make_mcp_httpx_client_factory return SSETransport( url=str(url), @@ -98,7 +98,7 @@ def _create_transport(config: BaseMCPServerConfig) -> ClientTransport: httpx_client_factory=make_mcp_httpx_client_factory(read_timeout=config.timeout), ) case StreamableHTTPMCPServerConfig(url=url, headers=headers): - from agentpool_config.mcp_server import make_mcp_httpx_client_factory + from wolfharness_config.mcp_server import make_mcp_httpx_client_factory return StreamableHttpTransport( url=str(url), @@ -227,7 +227,7 @@ async def get_client( Returns: A connected ``MCPClient`` wrapping the pooled transport. """ - from agentpool.mcp_server.client import MCPClient + from wolfharness.mcp_server.client import MCPClient transport = await self.get_transport(config, skill_name) client = MCPClient(config=config, transport=transport) diff --git a/src/agentpool/mcp_server/session_stream_pair.py b/src/wolfharness/mcp_server/session_stream_pair.py similarity index 100% rename from src/agentpool/mcp_server/session_stream_pair.py rename to src/wolfharness/mcp_server/session_stream_pair.py diff --git a/src/agentpool/mcp_server/tool_bridge.py b/src/wolfharness/mcp_server/tool_bridge.py similarity index 96% rename from src/agentpool/mcp_server/tool_bridge.py rename to src/wolfharness/mcp_server/tool_bridge.py index dda58ee0c..65e82b709 100644 --- a/src/agentpool/mcp_server/tool_bridge.py +++ b/src/wolfharness/mcp_server/tool_bridge.py @@ -25,10 +25,10 @@ from pydantic_ai.models.test import TestModel from pydantic_ai.usage import RunUsage -from agentpool.agents import Agent -from agentpool.capabilities.change_event import ChangeEvent -from agentpool.log import get_logger -from agentpool.utils.signatures import filter_schema_params, get_params_matching_predicate +from wolfharness.agents import Agent +from wolfharness.capabilities.change_event import ChangeEvent +from wolfharness.log import get_logger +from wolfharness.utils.signatures import filter_schema_params, get_params_matching_predicate if TYPE_CHECKING: @@ -39,9 +39,9 @@ from pydantic_ai.messages import UserContent from uvicorn import Server - from agentpool.agents import AgentContext - from agentpool.agents.base_agent import BaseAgent - from agentpool.tools.base import Tool + from wolfharness.agents import AgentContext + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.tools.base import Tool _ = ChangeEvent # Used at runtime in method signature @@ -132,7 +132,7 @@ def _convert_to_tool_result(result: Any) -> FastMCPToolResult: """ from fastmcp.tools.tool import ToolResult as FastMCPToolResult - from agentpool.tools.base import ToolResult as AgentPoolToolResult + from wolfharness.tools.base import ToolResult as AgentPoolToolResult match result: case FastMCPToolResult(): @@ -169,7 +169,7 @@ def _append_injection_to_result(result: Any, injection: str) -> Any: - dict: Add 'injected_context' key - Other: Wrap in dict with original and injection """ - from agentpool.tools.base import ToolResult as AgentPoolToolResult + from wolfharness.tools.base import ToolResult as AgentPoolToolResult match result: case str(): @@ -300,7 +300,7 @@ async def stop(self) -> None: def _subscribe_to_tool_changes(self) -> None: """Subscribe to tool changes from all observable capabilities.""" - from agentpool.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel node = self.node host_ctx = node.host_context @@ -328,7 +328,7 @@ def _subscribe_to_tool_changes(self) -> None: def _unsubscribe_from_tool_changes(self) -> None: """Disconnect from tool change signals on all observable capabilities.""" - from agentpool.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel node = self.node host_ctx = node.host_context @@ -416,7 +416,7 @@ def url(self) -> str: @property def resolved_server_name(self) -> str: """Get the server name.""" - return self.server_name or f"agentpool-{self.node.name}-tools" + return self.server_name or f"wolfharness-{self.node.name}-tools" async def _register_tools(self) -> None: """Register all node tools with the FastMCP server.""" @@ -436,7 +436,7 @@ def _register_single_tool(self, tool: Tool) -> None: from fastmcp.tools import Tool as FastMCPTool class _BridgeTool(FastMCPTool): - """Custom FastMCP Tool that wraps a agentpool Tool. + """Custom FastMCP Tool that wraps a wolfharness Tool. This allows us to use our own schema and invoke tools with AgentContext. """ @@ -467,7 +467,7 @@ async def run(self, arguments: dict[str, Any]) -> FastMCPToolResult: """Execute the wrapped tool with context bridging.""" from fastmcp.server.dependencies import get_context - from agentpool.tools.base import ToolResult as AgentPoolToolResult + from wolfharness.tools.base import ToolResult as AgentPoolToolResult args = arguments.copy() # Validate args against tool's schema @@ -552,7 +552,7 @@ async def invoke_tool_with_context( Handles tools that expect AgentContext, RunContext, or neither. Runs pre/post tool hooks if configured on the node. """ - from agentpool.tasks import ToolSkippedError + from wolfharness.tasks import ToolSkippedError if hooks := self.node.hooks: pre_result = await hooks.run_pre_tool_hooks( diff --git a/src/agentpool/messaging/__init__.py b/src/wolfharness/messaging/__init__.py similarity index 69% rename from src/agentpool/messaging/__init__.py rename to src/wolfharness/messaging/__init__.py index ae08cbd15..3c1aeb041 100644 --- a/src/agentpool/messaging/__init__.py +++ b/src/wolfharness/messaging/__init__.py @@ -1,12 +1,12 @@ """Core messsaging classes for AgentPool.""" -from agentpool.messaging.chat_filesystem import ChatMessageFileSystem -from agentpool.messaging.messages import ChatMessage, TokenCost, AgentResponse, TeamResponse -from agentpool.messaging.message_container import ChatMessageList -from agentpool.messaging.event_manager import EventManager -from agentpool.messaging.messagenode import MessageNode, SourceType, get_source_type -from agentpool.messaging.message_history import MessageHistory -from agentpool.messaging.compaction import ( +from wolfharness.messaging.chat_filesystem import ChatMessageFileSystem +from wolfharness.messaging.messages import ChatMessage, TokenCost, AgentResponse, TeamResponse +from wolfharness.messaging.message_container import ChatMessageList +from wolfharness.messaging.event_manager import EventManager +from wolfharness.messaging.messagenode import MessageNode, SourceType, get_source_type +from wolfharness.messaging.message_history import MessageHistory +from wolfharness.messaging.compaction import ( CompactionPipeline, CompactionStep, FilterBinaryContent, diff --git a/src/agentpool/messaging/chat_filesystem.py b/src/wolfharness/messaging/chat_filesystem.py similarity index 99% rename from src/agentpool/messaging/chat_filesystem.py rename to src/wolfharness/messaging/chat_filesystem.py index 71b4fab84..2106bbeee 100644 --- a/src/agentpool/messaging/chat_filesystem.py +++ b/src/wolfharness/messaging/chat_filesystem.py @@ -13,7 +13,7 @@ if TYPE_CHECKING: - from agentpool.messaging.message_container import ChatMessageList + from wolfharness.messaging.message_container import ChatMessageList class ChatMessageFileSystem(AsyncFileSystem): # type: ignore[misc] diff --git a/src/agentpool/messaging/compaction.py b/src/wolfharness/messaging/compaction.py similarity index 98% rename from src/agentpool/messaging/compaction.py rename to src/wolfharness/messaging/compaction.py index a99e5a8da..496f1f4a3 100644 --- a/src/agentpool/messaging/compaction.py +++ b/src/wolfharness/messaging/compaction.py @@ -6,7 +6,7 @@ Example: ```python - from agentpool.messaging.compaction import ( + from wolfharness.messaging.compaction import ( CompactionPipeline, FilterThinking, TruncateToolOutputs, @@ -75,7 +75,7 @@ from pydantic_ai import ModelRequestPart, ModelResponsePart - from agentpool.messaging.message_history import MessageHistory + from wolfharness.messaging.message_history import MessageHistory # Type aliases ModelMessage = ModelRequest | ModelResponse @@ -658,7 +658,7 @@ async def compact_conversation( Returns: Tuple of (original_count, compacted_count) of model messages """ - from agentpool.messaging.messages import ChatMessage + from wolfharness.messaging.messages import ChatMessage chat_messages = conversation.get_history() if not chat_messages: @@ -713,7 +713,7 @@ def _extract_text_content(msg: ModelMessage) -> str: ): parts_text.append(str(content)) case UserPromptPart(content=list() as content): - from agentpool.agents.native_agent.helpers import _summarize_content_block + from wolfharness.agents.native_agent.helpers import _summarize_content_block for item in content: parts_text.append(_summarize_content_block(item)) # noqa: PERF401 diff --git a/src/agentpool/messaging/connection_manager.py b/src/wolfharness/messaging/connection_manager.py similarity index 96% rename from src/agentpool/messaging/connection_manager.py rename to src/wolfharness/messaging/connection_manager.py index 79c17a49c..2eeadba8f 100644 --- a/src/agentpool/messaging/connection_manager.py +++ b/src/wolfharness/messaging/connection_manager.py @@ -9,18 +9,18 @@ from anyenv.signals import Signal -from agentpool.log import get_logger -from agentpool.talk import AggregatedTalkStats, Talk, TeamTalk -from agentpool.utils.inspection import get_fn_name +from wolfharness.log import get_logger +from wolfharness.talk import AggregatedTalkStats, Talk, TeamTalk +from wolfharness.utils.inspection import get_fn_name if TYPE_CHECKING: from collections.abc import AsyncIterator from datetime import timedelta - from agentpool.common_types import AgentName, AnyTransformFn, AsyncFilterFn, QueueStrategy - from agentpool.messaging import ChatMessage, MessageNode - from agentpool_config.forward_targets import ConnectionType + from wolfharness.common_types import AgentName, AnyTransformFn, AsyncFilterFn, QueueStrategy + from wolfharness.messaging import ChatMessage, MessageNode + from wolfharness_config.forward_targets import ConnectionType logger = get_logger(__name__) @@ -295,7 +295,7 @@ def get_mermaid_diagram( if __name__ == "__main__": - from agentpool.agents import Agent + from wolfharness.agents import Agent agent = Agent("test_agent", model="openai:gpt-5-nano") agent_2 = Agent("test_agent_2", model="openai:gpt-5-nano") diff --git a/src/agentpool/messaging/context.py b/src/wolfharness/messaging/context.py similarity index 85% rename from src/agentpool/messaging/context.py rename to src/wolfharness/messaging/context.py index 80511bdaf..dfc2830fa 100644 --- a/src/agentpool/messaging/context.py +++ b/src/wolfharness/messaging/context.py @@ -7,11 +7,11 @@ if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool.agents.base_agent import BaseAgent - from agentpool.messaging import MessageNode - from agentpool.prompts.manager import PromptManager - from agentpool.ui.base import InputProvider + from wolfharness import AgentPool + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.messaging import MessageNode + from wolfharness.prompts.manager import PromptManager + from wolfharness.ui.base import InputProvider @dataclass(kw_only=True) @@ -38,7 +38,7 @@ def node_name(self) -> str: @property def agent(self) -> BaseAgent[TDeps, Any]: """Return agent node, type-narrowed to BaseAgent.""" - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent assert isinstance(self.node, BaseAgent) return self.node # ty: ignore[invalid-return-type] @@ -48,7 +48,7 @@ def get_input_provider(self) -> InputProvider: if self.input_provider: return self.input_provider # 2. Session-bound provider (authoritative for pooled sessions) - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext if isinstance(self, AgentContext): session_state = self.get_session_state() @@ -63,7 +63,7 @@ def get_input_provider(self) -> InputProvider: # turn. This catches cases where session.input_provider was not set # (e.g., run_stream path) or the agent was cached before the provider # was available. - from agentpool.mcp_server.manager import _current_input_provider + from wolfharness.mcp_server.manager import _current_input_provider contextvar_provider = _current_input_provider.get() if contextvar_provider is not None: diff --git a/src/agentpool/messaging/event_manager.py b/src/wolfharness/messaging/event_manager.py similarity index 98% rename from src/agentpool/messaging/event_manager.py rename to src/wolfharness/messaging/event_manager.py index bb2d6bbf0..9598e992f 100644 --- a/src/agentpool/messaging/event_manager.py +++ b/src/wolfharness/messaging/event_manager.py @@ -14,9 +14,9 @@ from evented_config import EmailConfig, FileWatchConfig, TimeEventConfig, WebhookConfig from pydantic import SecretStr -from agentpool.log import get_logger -from agentpool.utils.inspection import execute, get_fn_name -from agentpool.utils.time_utils import get_now +from wolfharness.log import get_logger +from wolfharness.utils.inspection import execute, get_fn_name +from wolfharness.utils.time_utils import get_now if TYPE_CHECKING: @@ -28,7 +28,7 @@ from evented.timed_watcher import TimeEventSource from evented_config import EventConfig - from agentpool.agents.events import RichAgentStreamEvent, SubAgentEvent + from wolfharness.agents.events import RichAgentStreamEvent, SubAgentEvent logger = get_logger(__name__) @@ -106,7 +106,7 @@ async def emit_agent_event( event: The agent stream event to emit source_session_id: Optional ID of the session that produced the event """ - from agentpool.agents.events import SubAgentEvent + from wolfharness.agents.events import SubAgentEvent if not self.enabled: return diff --git a/src/agentpool/messaging/events.py b/src/wolfharness/messaging/events.py similarity index 86% rename from src/agentpool/messaging/events.py rename to src/wolfharness/messaging/events.py index ac81bbc53..20332fbd0 100644 --- a/src/agentpool/messaging/events.py +++ b/src/wolfharness/messaging/events.py @@ -8,9 +8,9 @@ if TYPE_CHECKING: - from agentpool.messaging import ChatMessage - from agentpool.talk.talk import Talk - from agentpool_config.events import ConnectionEventType + from wolfharness.messaging import ChatMessage + from wolfharness.talk.talk import Talk + from wolfharness_config.events import ConnectionEventType ChangeType = Literal["added", "modified", "deleted"] diff --git a/src/agentpool/messaging/graph_adapter.py b/src/wolfharness/messaging/graph_adapter.py similarity index 96% rename from src/agentpool/messaging/graph_adapter.py rename to src/wolfharness/messaging/graph_adapter.py index 26164a44d..dfc167502 100644 --- a/src/agentpool/messaging/graph_adapter.py +++ b/src/wolfharness/messaging/graph_adapter.py @@ -14,8 +14,8 @@ if TYPE_CHECKING: from pydantic_graph.graph_builder import Graph - from agentpool.agents.events import RichAgentStreamEvent - from agentpool.messaging import ChatMessage + from wolfharness.agents.events import RichAgentStreamEvent + from wolfharness.messaging import ChatMessage @dataclass diff --git a/src/agentpool/messaging/message_container.py b/src/wolfharness/messaging/message_container.py similarity index 92% rename from src/agentpool/messaging/message_container.py rename to src/wolfharness/messaging/message_container.py index 47cde3bea..deeebbf39 100644 --- a/src/agentpool/messaging/message_container.py +++ b/src/wolfharness/messaging/message_container.py @@ -7,18 +7,18 @@ from psygnal.containers import EventedList -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage -from agentpool.messaging.chat_filesystem import ChatMessageFileSystem -from agentpool.utils.count_tokens import batch_count_tokens +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage +from wolfharness.messaging.chat_filesystem import ChatMessageFileSystem +from wolfharness.utils.count_tokens import batch_count_tokens if TYPE_CHECKING: from datetime import datetime - from agentpool.common_types import MessageRole - from agentpool.messaging.messages import FormatStyle - from agentpool.utils.dag import DAGNode + from wolfharness.common_types import MessageRole + from wolfharness.messaging.messages import FormatStyle + from wolfharness.utils.dag import DAGNode logger = get_logger(__name__) @@ -152,7 +152,7 @@ def to_mermaid_graph( rankdir: Literal["TB", "BT", "LR", "RL"] = "LR", ) -> str: """Convert message flow to mermaid graph.""" - from agentpool.utils.dag import dag_to_list + from wolfharness.utils.dag import dag_to_list dag = self._build_flow_dag(message) if not dag: diff --git a/src/agentpool/messaging/message_history.py b/src/wolfharness/messaging/message_history.py similarity index 93% rename from src/agentpool/messaging/message_history.py rename to src/wolfharness/messaging/message_history.py index d94d359de..412f01b25 100644 --- a/src/agentpool/messaging/message_history.py +++ b/src/wolfharness/messaging/message_history.py @@ -9,9 +9,9 @@ from upathtools import read_path, to_upath -from agentpool.log import get_logger -from agentpool.storage import StorageManager -from agentpool_config.session import SessionQuery +from wolfharness.log import get_logger +from wolfharness.storage import StorageManager +from wolfharness_config.session import SessionQuery if TYPE_CHECKING: @@ -22,10 +22,10 @@ from toprompt import AnyPromptType from upathtools import JoinablePathLike - from agentpool.messaging import ChatMessage - from agentpool.prompts.conversion_manager import ConversionManager - from agentpool.prompts.prompts import PromptType - from agentpool_config.session import MemoryConfig + from wolfharness.messaging import ChatMessage + from wolfharness.prompts.conversion_manager import ConversionManager + from wolfharness.prompts.prompts import PromptType + from wolfharness_config.session import MemoryConfig logger = get_logger(__name__) @@ -51,9 +51,9 @@ def __init__( session_config: Optional MemoryConfig resources: Optional paths to load as context """ - from agentpool.messaging import ChatMessageList - from agentpool.prompts.conversion_manager import ConversionManager - from agentpool_config.storage import MemoryStorageConfig, StorageConfig + from wolfharness.messaging import ChatMessageList + from wolfharness.prompts.conversion_manager import ConversionManager + from wolfharness_config.storage import MemoryStorageConfig, StorageConfig storage_cfg = StorageConfig(providers=[MemoryStorageConfig()]) self._storage = storage or StorageManager(config=storage_cfg) @@ -160,7 +160,7 @@ async def format_history( async def load_context_source(self, source: PromptType | str) -> None: """Load context from a single source.""" - from agentpool.prompts.prompts import BasePrompt + from wolfharness.prompts.prompts import BasePrompt try: match source: @@ -193,7 +193,7 @@ def set_history(self, history: list[ChatMessage[Any]]) -> None: async def clear(self) -> None: """Clear conversation history and prompts.""" - from agentpool.messaging import ChatMessageList + from wolfharness.messaging import ChatMessageList self.chat_messages = ChatMessageList() self._last_messages = [] @@ -215,7 +215,7 @@ async def temporary_state( """ from toprompt import to_prompt - from agentpool.messaging import ChatMessage, ChatMessageList + from wolfharness.messaging import ChatMessage, ChatMessageList old_history = self.chat_messages.copy() messages: Sequence[ChatMessage[Any]] = ChatMessageList() @@ -338,7 +338,7 @@ def get_last_message_id(self) -> str | None: if __name__ == "__main__": import anyio - from agentpool import Agent + from wolfharness import Agent async def main() -> None: async with Agent(model="openai:gpt-5-nano") as agent: diff --git a/src/agentpool/messaging/message_utils.py b/src/wolfharness/messaging/message_utils.py similarity index 94% rename from src/agentpool/messaging/message_utils.py rename to src/wolfharness/messaging/message_utils.py index 8e6599da7..fc498bba8 100644 --- a/src/agentpool/messaging/message_utils.py +++ b/src/wolfharness/messaging/message_utils.py @@ -6,8 +6,8 @@ if TYPE_CHECKING: - from agentpool.agents.base_agent import BaseAgent - from agentpool.messaging import ChatMessage + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.messaging import ChatMessage def build_message_index( diff --git a/src/agentpool/messaging/messagenode.py b/src/wolfharness/messaging/messagenode.py similarity index 94% rename from src/agentpool/messaging/messagenode.py rename to src/wolfharness/messaging/messagenode.py index a2154c07e..1c4e2c435 100644 --- a/src/agentpool/messaging/messagenode.py +++ b/src/wolfharness/messaging/messagenode.py @@ -10,9 +10,9 @@ from anyenv.signals import Signal -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage -from agentpool.talk import AggregatedTalkStats +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage +from wolfharness.talk import AggregatedTalkStats if TYPE_CHECKING: @@ -23,23 +23,23 @@ from evented.event_data import EventData from evented_config import EventConfig - from agentpool.agents.events import RichAgentStreamEvent - from agentpool.common_types import ( + from wolfharness.agents.events import RichAgentStreamEvent + from wolfharness.common_types import ( AnyTransformFn, AsyncFilterFn, ProcessorCallback, QueueStrategy, ) - from agentpool.delegation import AgentPool - from agentpool.host.context import HostContext - from agentpool.messaging.context import NodeContext - from agentpool.storage import StorageManager - from agentpool.talk import Talk, TeamTalk - from agentpool.talk.stats import AggregatedMessageStats, MessageStats - from agentpool.tools.base import FunctionTool - from agentpool.ui.base import InputProvider - from agentpool_config.forward_targets import ConnectionType - from agentpool_config.mcp_server import MCPServerConfig + from wolfharness.delegation import AgentPool + from wolfharness.host.context import HostContext + from wolfharness.messaging.context import NodeContext + from wolfharness.storage import StorageManager + from wolfharness.talk import Talk, TeamTalk + from wolfharness.talk.stats import AggregatedMessageStats, MessageStats + from wolfharness.tools.base import FunctionTool + from wolfharness.ui.base import InputProvider + from wolfharness_config.forward_targets import ConnectionType + from wolfharness_config.mcp_server import MCPServerConfig logger = get_logger(__name__) @@ -67,7 +67,7 @@ def get_source_type(node: MessageNode[Any, Any]) -> SourceType: Returns: The corresponding :data:`SourceType` value. """ - from agentpool.delegation.base_team import BaseTeam + from wolfharness.delegation.base_team import BaseTeam if isinstance(node, BaseTeam): return "team_parallel" if node.mode == "parallel" else "team_sequential" @@ -99,9 +99,9 @@ def __init__( """Initialize message node.""" super().__init__() - from agentpool.mcp_server.manager import MCPManager - from agentpool.messaging import EventManager - from agentpool.messaging.connection_manager import ConnectionManager + from wolfharness.mcp_server.manager import MCPManager + from wolfharness.messaging import EventManager + from wolfharness.messaging.connection_manager import ConnectionManager async def _event_handler(event: EventData) -> None: if prompt := event.to_prompt(): @@ -373,7 +373,7 @@ def to_tool( Returns: Tool instance that can be registered """ - from agentpool.tools.base import FunctionTool + from wolfharness.tools.base import FunctionTool async def wrapped(prompt: str) -> TResult: result = await self.run(prompt) @@ -500,8 +500,8 @@ def connect_to( ) -> Talk[Any] | TeamTalk: """Create connection(s) to target(s).""" # Handle callable case - from agentpool.agents import Agent - from agentpool.delegation.base_team import BaseTeam + from wolfharness.agents import Agent + from wolfharness.delegation.base_team import BaseTeam if callable(target): target = Agent.from_callback(target) @@ -564,7 +564,7 @@ def _build_single_node_graph( Returns: An immutable Graph ready for execution. """ - from agentpool.messaging.graph_adapter import MessageNodeStep + from wolfharness.messaging.graph_adapter import MessageNodeStep return MessageNodeStep(self).build_single_node_graph() @@ -609,8 +609,8 @@ async def run(self, *prompts: Any, **kwargs: Any) -> ChatMessage[TResult]: """ from pydantic_graph.id_types import NodeID - from agentpool.messaging.graph_adapter import AgentPoolState - from agentpool.messaging.signal_adapter import SignalEmittingGraphRun + from wolfharness.messaging.graph_adapter import AgentPoolState + from wolfharness.messaging.signal_adapter import SignalEmittingGraphRun graph = self._build_single_node_graph() state = AgentPoolState(node=self, prompts=prompts, kwargs=kwargs) @@ -647,9 +647,9 @@ async def run_stream( """ from pydantic_graph.id_types import NodeID - from agentpool.agents.events import RunErrorEvent, StreamCompleteEvent - from agentpool.messaging.graph_adapter import AgentPoolState - from agentpool.messaging.signal_adapter import SignalEmittingGraphRun + from wolfharness.agents.events import RunErrorEvent, StreamCompleteEvent + from wolfharness.messaging.graph_adapter import AgentPoolState + from wolfharness.messaging.signal_adapter import SignalEmittingGraphRun graph = self._build_single_node_graph() state = AgentPoolState(node=self, prompts=prompts, kwargs=kwargs) @@ -721,7 +721,7 @@ async def get_message_history( Returns: List of chat messages from the session. """ - from agentpool_config.session import SessionQuery + from wolfharness_config.session import SessionQuery if not self.enable_db_logging or not self.storage or not session_id: return [] diff --git a/src/agentpool/messaging/messages.py b/src/wolfharness/messaging/messages.py similarity index 97% rename from src/agentpool/messaging/messages.py rename to src/wolfharness/messaging/messages.py index 820ddd892..d03e56048 100644 --- a/src/agentpool/messaging/messages.py +++ b/src/wolfharness/messaging/messages.py @@ -28,11 +28,11 @@ ) import tokonomics -from agentpool.common_types import MessageRole, SimpleJsonType # noqa: TC001 -from agentpool.log import get_logger -from agentpool.utils.inspection import dataclasses_no_defaults_repr -from agentpool.utils.pydantic_ai_helpers import safe_args_as_dict -from agentpool.utils.time_utils import get_now +from wolfharness.common_types import MessageRole, SimpleJsonType # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness.utils.inspection import dataclasses_no_defaults_repr +from wolfharness.utils.pydantic_ai_helpers import safe_args_as_dict +from wolfharness.utils.time_utils import get_now if TYPE_CHECKING: @@ -47,7 +47,7 @@ RunUsage, ) - from agentpool.tools.tool_call_info import ToolCallInfo + from wolfharness.tools.tool_call_info import ToolCallInfo TContent = TypeVar("TContent", str, BaseModel) @@ -503,7 +503,7 @@ def get_tool_calls( tools: Original Tool set to enrich ToolCallInfos with additional info agent_name: Name of the caller """ - from agentpool.tools import ToolCallInfo + from wolfharness.tools import ToolCallInfo tools = tools or {} parts = [part for message in self.messages for part in message.parts] @@ -579,7 +579,7 @@ def format( def get_token_count(self) -> int: """Get token count, either from token usage or cost data.""" - from agentpool.utils.count_tokens import count_tokens + from wolfharness.utils.count_tokens import count_tokens if info := self.cost_info: return info.token_usage.total_tokens diff --git a/src/agentpool/messaging/processing.py b/src/wolfharness/messaging/processing.py similarity index 86% rename from src/agentpool/messaging/processing.py rename to src/wolfharness/messaging/processing.py index 1837bccc6..74dd5de66 100644 --- a/src/agentpool/messaging/processing.py +++ b/src/wolfharness/messaging/processing.py @@ -4,16 +4,16 @@ from typing import TYPE_CHECKING, Any -from agentpool.messaging import ChatMessage -from agentpool.prompts.convert import convert_prompts +from wolfharness.messaging import ChatMessage +from wolfharness.prompts.convert import convert_prompts if TYPE_CHECKING: from pydantic_ai import UserContent - from agentpool.common_types import PromptCompatible - from agentpool.messaging import MessageNode - from agentpool.messaging.connection_manager import ConnectionManager + from wolfharness.common_types import PromptCompatible + from wolfharness.messaging import MessageNode + from wolfharness.messaging.connection_manager import ConnectionManager async def prepare_prompts( diff --git a/src/agentpool/messaging/signal_adapter.py b/src/wolfharness/messaging/signal_adapter.py similarity index 97% rename from src/agentpool/messaging/signal_adapter.py rename to src/wolfharness/messaging/signal_adapter.py index 23aeef66d..3c0ac7302 100644 --- a/src/agentpool/messaging/signal_adapter.py +++ b/src/wolfharness/messaging/signal_adapter.py @@ -16,15 +16,15 @@ import logfire from pydantic_graph.graph_builder import EndMarker, GraphRun, GraphTask -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage if TYPE_CHECKING: from pydantic_graph.id_types import NodeID - from agentpool.messaging.messagenode import MessageNode - from agentpool.talk import Talk + from wolfharness.messaging.messagenode import MessageNode + from wolfharness.talk import Talk logger = get_logger(__name__) @@ -151,7 +151,7 @@ async def _emit_tasks_completed(self, tasks: Sequence[GraphTask]) -> None: actual output of the node execution rather than the (often ``None``) task inputs. """ - from agentpool.messaging.graph_adapter import AgentPoolState + from wolfharness.messaging.graph_adapter import AgentPoolState for task in tasks: node = self._node_mapping.get(task.node_id) diff --git a/src/agentpool/messaging/streaming_adapter.py b/src/wolfharness/messaging/streaming_adapter.py similarity index 98% rename from src/agentpool/messaging/streaming_adapter.py rename to src/wolfharness/messaging/streaming_adapter.py index 7ba6b5fc7..f6ee2e888 100644 --- a/src/agentpool/messaging/streaming_adapter.py +++ b/src/wolfharness/messaging/streaming_adapter.py @@ -38,7 +38,7 @@ from pydantic_graph.graph_builder import EndMarker, ErrorMarker, GraphRun -from agentpool.agents.events import ( +from wolfharness.agents.events import ( PartDeltaEvent, PartStartEvent, RichAgentStreamEvent, @@ -49,8 +49,8 @@ ToolCallCompleteEvent, ToolCallStartEvent, ) -from agentpool.log import get_logger -from agentpool.messaging.messages import ChatMessage +from wolfharness.log import get_logger +from wolfharness.messaging.messages import ChatMessage logger = get_logger(__name__) diff --git a/src/agentpool/mime_utils.py b/src/wolfharness/mime_utils.py similarity index 98% rename from src/agentpool/mime_utils.py rename to src/wolfharness/mime_utils.py index 160efd8fd..6297b3359 100644 --- a/src/agentpool/mime_utils.py +++ b/src/wolfharness/mime_utils.py @@ -1,4 +1,4 @@ -"""Centralized MIME type utilities for agentpool. +"""Centralized MIME type utilities for wolfharness. Uses Python's stdlib mimetypes for cross-platform coverage of file types. """ diff --git a/src/wolfharness/models/__init__.py b/src/wolfharness/models/__init__.py new file mode 100644 index 000000000..d10908091 --- /dev/null +++ b/src/wolfharness/models/__init__.py @@ -0,0 +1,20 @@ +"""Core data models for AgentPool.""" + +from __future__ import annotations + +from wolfharness.models.acp_agents import ACPAgentConfig, ACPAgentConfigTypes, BaseACPAgentConfig +from wolfharness.models.agents import AnyToolConfig, NativeAgentConfig # noqa: F401 +from wolfharness.models.manifest import AgentsManifest, AnyAgentConfig +from wolfharness.models.pending_interaction import PendingPermission, PendingQuestion + + +__all__ = [ + "ACPAgentConfig", + "ACPAgentConfigTypes", + "AgentsManifest", + "AnyAgentConfig", + "BaseACPAgentConfig", + "NativeAgentConfig", + "PendingPermission", + "PendingQuestion", +] diff --git a/src/agentpool/models/acp_agents/__init__.py b/src/wolfharness/models/acp_agents/__init__.py similarity index 91% rename from src/agentpool/models/acp_agents/__init__.py rename to src/wolfharness/models/acp_agents/__init__.py index a96eb4175..a959bfe09 100644 --- a/src/agentpool/models/acp_agents/__init__.py +++ b/src/wolfharness/models/acp_agents/__init__.py @@ -6,7 +6,7 @@ from pydantic import Field -from agentpool.models.acp_agents.base import ( +from wolfharness.models.acp_agents.base import ( ACPAgentConfig, BaseACPAgentConfig, RegistryACPAgentConfig, diff --git a/src/agentpool/models/acp_agents/base.py b/src/wolfharness/models/acp_agents/base.py similarity index 93% rename from src/agentpool/models/acp_agents/base.py rename to src/wolfharness/models/acp_agents/base.py index 43696abf4..be505dc08 100644 --- a/src/agentpool/models/acp_agents/base.py +++ b/src/wolfharness/models/acp_agents/base.py @@ -12,20 +12,20 @@ ) from pydantic import ConfigDict, Field -from agentpool.models.fields import EnvVarsField # noqa: TC001 -from agentpool_config import AnyToolConfig, BaseToolConfig -from agentpool_config.nodes import BaseAgentConfig -from agentpool_config.toolsets import BaseToolsetConfig +from wolfharness.models.fields import EnvVarsField # noqa: TC001 +from wolfharness_config import AnyToolConfig, BaseToolConfig +from wolfharness_config.nodes import BaseAgentConfig +from wolfharness_config.toolsets import BaseToolsetConfig if TYPE_CHECKING: from exxec import ExecutionEnvironment from pydantic_ai.capabilities import AbstractCapability - from agentpool.agents.acp_agent import ACPAgent - from agentpool.common_types import AnyEventHandlerType - from agentpool.delegation import AgentPool - from agentpool.ui.base import InputProvider + from wolfharness.agents.acp_agent import ACPAgent + from wolfharness.common_types import AnyEventHandlerType + from wolfharness.delegation import AgentPool + from wolfharness.ui.base import InputProvider class BaseACPAgentConfig(BaseAgentConfig): @@ -143,8 +143,8 @@ def get_registry_id(self) -> str | None: def get_tool_providers(self) -> list[AbstractCapability]: """Get all resource providers for this agent's tools.""" - from agentpool.capabilities.function_toolset import FunctionToolsetCapability - from agentpool.tools.base import Tool + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.tools.base import Tool providers: list[AbstractCapability] = [] static_tools: list[Tool] = [] @@ -191,7 +191,7 @@ def get_agent[TDeps]( pool: AgentPool[Any] | None = None, deps_type: type[TDeps] | None = None, # type: ignore[valid-type] ) -> ACPAgent[TDeps]: - from agentpool.agents.acp_agent import ACPAgent + from wolfharness.agents.acp_agent import ACPAgent return ACPAgent[TDeps].from_config( self, diff --git a/src/agentpool/models/agents.py b/src/wolfharness/models/agents.py similarity index 87% rename from src/agentpool/models/agents.py rename to src/wolfharness/models/agents.py index 50bca8bb9..a8920d2f7 100644 --- a/src/agentpool/models/agents.py +++ b/src/wolfharness/models/agents.py @@ -13,19 +13,19 @@ from tokonomics.model_names import ModelId # noqa: TC002 from toprompt import render_prompt -from agentpool import log -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.common_types import EndStrategy # noqa: TC001 -from agentpool.models.fields import OutputTypeField, SystemPromptField # noqa: TC001 -from agentpool.models.model_configs import AnyModelConfig # noqa: TC001 -from agentpool.prompts.prompts import PromptMessage, StaticPrompt -from agentpool_config import BaseToolConfig, NativeAgentToolConfig -from agentpool_config.builtin_tools import BaseBuiltinToolConfig -from agentpool_config.knowledge import Knowledge # noqa: TC001 -from agentpool_config.nodes import BaseAgentConfig -from agentpool_config.session import MemoryConfig, SessionQuery -from agentpool_config.toolsets import BaseToolsetConfig, ToolsetConfig -from agentpool_config.workers import WorkerConfig # noqa: TC001 +from wolfharness import log +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.common_types import EndStrategy # noqa: TC001 +from wolfharness.models.fields import OutputTypeField, SystemPromptField # noqa: TC001 +from wolfharness.models.model_configs import AnyModelConfig # noqa: TC001 +from wolfharness.prompts.prompts import PromptMessage, StaticPrompt +from wolfharness_config import BaseToolConfig, NativeAgentToolConfig +from wolfharness_config.builtin_tools import BaseBuiltinToolConfig +from wolfharness_config.knowledge import Knowledge # noqa: TC001 +from wolfharness_config.nodes import BaseAgentConfig +from wolfharness_config.session import MemoryConfig, SessionQuery +from wolfharness_config.toolsets import BaseToolsetConfig, ToolsetConfig +from wolfharness_config.workers import WorkerConfig # noqa: TC001 if TYPE_CHECKING: @@ -33,13 +33,13 @@ from pydantic_ai.capabilities import AbstractCapability - from agentpool.agents.native_agent import Agent - from agentpool.common_types import AnyEventHandlerType - from agentpool.delegation import AgentPool - from agentpool.prompts.prompts import BasePrompt - from agentpool.tools.base import Tool - from agentpool.ui.base import InputProvider - from agentpool_config.workers import AgentWorkerConfig + from wolfharness.agents.native_agent import Agent + from wolfharness.common_types import AnyEventHandlerType + from wolfharness.delegation import AgentPool + from wolfharness.prompts.prompts import BasePrompt + from wolfharness.tools.base import Tool + from wolfharness.ui.base import InputProvider + from wolfharness_config.workers import AgentWorkerConfig ToolMode = Literal["codemode"] @@ -55,7 +55,7 @@ class NativeAgentConfig(BaseAgentConfig): Defines an agent's complete configuration including its model, environment, and behavior settings. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/agent_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/agent_configuration/ """ model_config = ConfigDict( @@ -73,13 +73,13 @@ class NativeAgentConfig(BaseAgentConfig): examples=["openai:gpt-5-nano"], title="Model configuration or name", json_schema_extra={ - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/model_configuration/" + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/model_configuration/" }, ) """The model to use for this agent. Can be either a simple model name string (e.g. 'openai:gpt-5') or a structured model definition. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/model_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/model_configuration/ """ tools: Sequence[AnyToolConfig | str] = Field( @@ -100,7 +100,7 @@ class NativeAgentConfig(BaseAgentConfig): ], title="Tool configurations", json_schema_extra={ - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/tool_configuration/" + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/tool_configuration/" }, ) """A list of tools and toolsets to register with this agent. @@ -108,7 +108,7 @@ class NativeAgentConfig(BaseAgentConfig): Supports both single tools (bash, import, web_search, etc.) and toolsets (file_access, process_management, code, etc.). - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/tool_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/tool_configuration/ """ session: str | SessionQuery | MemoryConfig | None = Field( @@ -116,12 +116,12 @@ class NativeAgentConfig(BaseAgentConfig): examples=["main_session", "user_123"], title="Session configuration", json_schema_extra={ - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/session_configuration/" + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/session_configuration/" }, ) """Session configuration for conversation recovery. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/session_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/session_configuration/ """ output_type: OutputTypeField = None @@ -149,7 +149,7 @@ class NativeAgentConfig(BaseAgentConfig): system_prompt: SystemPromptField = None """System prompt for the agent. Can be a string or list of strings/prompt configs. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/system_prompts_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/system_prompts_configuration/ """ # context_sources: list[ContextSource] = Field(default_factory=list) @@ -159,12 +159,12 @@ class NativeAgentConfig(BaseAgentConfig): default=None, title="Knowledge sources", json_schema_extra={ - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/knowledge_configuration/" + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/knowledge_configuration/" }, ) """Knowledge sources for this agent. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/knowledge_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/knowledge_configuration/ """ workers: list[WorkerConfig] = Field( @@ -175,12 +175,12 @@ class NativeAgentConfig(BaseAgentConfig): ], title="Worker agents", json_schema_extra={ - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/worker_configuration/" + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/worker_configuration/" }, ) """Worker agents which will be available as tools. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/worker_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/worker_configuration/ """ usage_limits: UsageLimits | None = Field(default=None, title="Usage limits") @@ -260,14 +260,14 @@ def handle_capabilities(cls, data: dict[str, Any]) -> dict[str, Any]: against the typed built-in config model. 2. **Entry-point name** (e.g. ``"mermaid_lint"``) → wrapped in :class:`EntryPointCapabilityConfig` for later resolution via the - ``agentpool.capabilities`` entry-point group. + ``wolfharness.capabilities`` entry-point group. 3. **Python import path** (e.g. ``"pydantic_ai.capabilities.Instrumentation"``) → wrapped in :class:`GenericCapabilityConfig` for ``__import__`` resolution. """ from pydantic import TypeAdapter - from agentpool_config.capabilities import ( + from wolfharness_config.capabilities import ( CapabilityConfig, EntryPointCapabilityConfig, GenericCapabilityConfig, @@ -288,7 +288,7 @@ def handle_capabilities(cls, data: dict[str, Any]) -> dict[str, Any]: # Lazily discover entry-point names only when needed. if ep_names is None: try: - from agentpool.capabilities.registry import ( + from wolfharness.capabilities.registry import ( discover_entry_point_capabilities, ) @@ -332,7 +332,7 @@ def get_agent[TDeps]( pool: AgentPool[Any] | None = None, deps_type: builtins.type[TDeps] | None = None, ) -> Agent[TDeps, Any]: - from agentpool.agents.native_agent import Agent + from wolfharness.agents.native_agent import Agent return Agent[TDeps].from_config( self, @@ -352,7 +352,7 @@ def get_tool_providers(self) -> list[AbstractCapability]: Returns: List of AbstractCapability instances """ - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool providers: list[AbstractCapability] = [] static_tools: list[Tool] = [] @@ -433,7 +433,7 @@ def get_history_processors(self) -> list[Callable[..., Any]]: """ import inspect - from agentpool.utils.importing import import_callable + from wolfharness.utils.importing import import_callable # Get session config memory_cfg = self.get_session_config() @@ -467,7 +467,7 @@ def get_history_processors(self) -> list[Callable[..., Any]]: def get_system_prompts(self) -> list[BasePrompt]: """Get all system prompts as BasePrompts.""" - from agentpool_config.system_prompts import ( + from wolfharness_config.system_prompts import ( FilePromptConfig, FunctionPromptConfig, LibraryPromptConfig, @@ -528,7 +528,7 @@ def get_system_prompts(self) -> list[BasePrompt]: def render_system_prompts(self, context: dict[str, Any] | None = None) -> list[str]: """Render system prompts with context.""" - from agentpool_config.system_prompts import ( + from wolfharness_config.system_prompts import ( FilePromptConfig, FunctionPromptConfig, LibraryPromptConfig, diff --git a/src/agentpool/models/fields.py b/src/wolfharness/models/fields.py similarity index 86% rename from src/agentpool/models/fields.py rename to src/wolfharness/models/fields.py index 6e4646f7c..6016087b1 100644 --- a/src/agentpool/models/fields.py +++ b/src/wolfharness/models/fields.py @@ -8,8 +8,8 @@ from exxec_config import E2bExecutionEnvironmentConfig, ExecutionEnvironmentConfig from pydantic import Field -from agentpool_config.output_types import StructuredResponseConfig -from agentpool_config.system_prompts import PromptConfig +from wolfharness_config.output_types import StructuredResponseConfig +from wolfharness_config.system_prompts import PromptConfig OutputTypeField = Annotated[ @@ -56,7 +56,7 @@ ["You are an AI assistant.", "Always be concise."], ], json_schema_extra={ - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/system_prompts_configuration/" + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/system_prompts_configuration/" }, description="""System prompt for the agent. Can be a string or list of strings/prompt configs""", diff --git a/src/agentpool/models/file_agents.py b/src/wolfharness/models/file_agents.py similarity index 100% rename from src/agentpool/models/file_agents.py rename to src/wolfharness/models/file_agents.py diff --git a/src/agentpool/models/file_parsing.py b/src/wolfharness/models/file_parsing.py similarity index 96% rename from src/agentpool/models/file_parsing.py rename to src/wolfharness/models/file_parsing.py index d0e7c316b..7a26ae97b 100644 --- a/src/agentpool/models/file_parsing.py +++ b/src/wolfharness/models/file_parsing.py @@ -12,12 +12,12 @@ from upathtools import to_upath -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.file_agents import FileAgentConfig + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.file_agents import FileAgentConfig logger = get_logger(__name__) @@ -164,7 +164,7 @@ def parse_opencode_format( if system_prompt: config_kwargs["system_prompt"] = system_prompt - # Pass through agentpool specific fields + # Pass through wolfharness specific fields for field in PASSTHROUGH_FIELDS: if field in metadata: config_kwargs[field] = metadata[field] @@ -217,7 +217,7 @@ def parse_agent_file( Raises: ValueError: If file cannot be parsed """ - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig path = to_upath(file_path) content = path.read_text("utf-8") diff --git a/src/agentpool/models/fixed_args_test_model.py b/src/wolfharness/models/fixed_args_test_model.py similarity index 100% rename from src/agentpool/models/fixed_args_test_model.py rename to src/wolfharness/models/fixed_args_test_model.py diff --git a/src/agentpool/models/manifest.py b/src/wolfharness/models/manifest.py similarity index 89% rename from src/agentpool/models/manifest.py rename to src/wolfharness/models/manifest.py index 57d27df7f..46a3b1200 100644 --- a/src/agentpool/models/manifest.py +++ b/src/wolfharness/models/manifest.py @@ -12,36 +12,36 @@ from upathtools_config import FilesystemConfigType from upathtools_config.base import URIFileSystemConfig -from agentpool import log -from agentpool.models.acp_agents import ACPAgentConfigTypes -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.file_agents import FileAgentConfig -from agentpool.models.model_configs import AnyModelConfig, StringModelConfig -from agentpool_config.commands import CommandConfig, StaticCommandConfig -from agentpool_config.compaction import CompactionConfig -from agentpool_config.context import ConfigContextManager -from agentpool_config.converters import ConversionConfig -from agentpool_config.graph_config import GraphConfig -from agentpool_config.graph_translation import translate_config_to_graph -from agentpool_config.mcp_server import BaseMCPServerConfig, MCPServerConfig -from agentpool_config.observability import ObservabilityConfig -from agentpool_config.output_types import StructuredResponseConfig -from agentpool_config.pool_server import ACPPoolServerConfig, MCPPoolServerConfig -from agentpool_config.session_pool import ACPConfig, OpenCodeConfig, SessionPoolConfig -from agentpool_config.skills import SkillsConfig -from agentpool_config.storage import StorageConfig -from agentpool_config.system_prompts import PromptLibraryConfig -from agentpool_config.task import Job -from agentpool_config.team_mode import TeamModeConfig -from agentpool_config.teams import TeamConfig +from wolfharness import log +from wolfharness.models.acp_agents import ACPAgentConfigTypes +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.file_agents import FileAgentConfig +from wolfharness.models.model_configs import AnyModelConfig, StringModelConfig +from wolfharness_config.commands import CommandConfig, StaticCommandConfig +from wolfharness_config.compaction import CompactionConfig +from wolfharness_config.context import ConfigContextManager +from wolfharness_config.converters import ConversionConfig +from wolfharness_config.graph_config import GraphConfig +from wolfharness_config.graph_translation import translate_config_to_graph +from wolfharness_config.mcp_server import BaseMCPServerConfig, MCPServerConfig +from wolfharness_config.observability import ObservabilityConfig +from wolfharness_config.output_types import StructuredResponseConfig +from wolfharness_config.pool_server import ACPPoolServerConfig, MCPPoolServerConfig +from wolfharness_config.session_pool import ACPConfig, OpenCodeConfig, SessionPoolConfig +from wolfharness_config.skills import SkillsConfig +from wolfharness_config.storage import StorageConfig +from wolfharness_config.system_prompts import PromptLibraryConfig +from wolfharness_config.task import Job +from wolfharness_config.team_mode import TeamModeConfig +from wolfharness_config.teams import TeamConfig if TYPE_CHECKING: from upathtools import JoinablePathLike - from agentpool.messaging.compaction import CompactionPipeline - from agentpool.models.acp_agents import BaseACPAgentConfig - from agentpool_config.nodes import NodeConfig + from wolfharness.messaging.compaction import CompactionPipeline + from wolfharness.models.acp_agents import BaseACPAgentConfig + from wolfharness_config.nodes import NodeConfig logger = log.get_logger(__name__) @@ -131,7 +131,7 @@ class AgentsManifest(Schema): agents: dict[str, AnyAgentConfig] = Field( default_factory=dict, json_schema_extra={ - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/agent_configuration/" + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/agent_configuration/" }, ) """Mapping of agent IDs to their configurations. @@ -165,7 +165,7 @@ class AgentsManifest(Schema): endpoint: http://localhost:8000/agent/run ``` - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/agent_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/agent_configuration/ """ default_agent: str | None = None @@ -223,12 +223,12 @@ class AgentsManifest(Schema): teams: dict[str, TeamConfig] = Field( default_factory=dict, json_schema_extra={ - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/team_configuration/" + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/team_configuration/" }, ) """Mapping of team IDs to their configurations. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/team_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/team_configuration/ """ team_mode: TeamModeConfig | None = Field( @@ -245,12 +245,12 @@ class AgentsManifest(Schema): storage: StorageConfig = Field( default_factory=StorageConfig, json_schema_extra={ - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/storage_configuration/" + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/storage_configuration/" }, ) """Storage provider configuration. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/storage_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/storage_configuration/ """ observability: ObservabilityConfig = Field(default_factory=ObservabilityConfig) @@ -262,12 +262,12 @@ class AgentsManifest(Schema): responses: dict[str, StructuredResponseConfig] = Field( default_factory=dict, json_schema_extra={ - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/response_configuration/" + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/response_configuration/" }, ) """Mapping of response names to their definitions. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/response_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/response_configuration/ """ model_variants: dict[str, AnyModelConfig] = Field( @@ -326,14 +326,14 @@ class AgentsManifest(Schema): [{"type": "streamable-http", "url": "http://mcp.example.com"}], ], json_schema_extra={ - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/mcp_configuration/" + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/mcp_configuration/" }, ) """List of MCP server configurations: These MCP servers are used to provide tools and other resources to the nodes. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/mcp_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/mcp_configuration/ """ pool_server: MCPPoolServerConfig | ACPPoolServerConfig = Field( default_factory=MCPPoolServerConfig @@ -346,14 +346,14 @@ class AgentsManifest(Schema): prompts: PromptLibraryConfig = Field( default_factory=PromptLibraryConfig, json_schema_extra={ - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/prompt_configuration/" + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/prompt_configuration/" }, ) """Prompt library configuration. This configuration defines the prompt library, which is used to provide prompts to the nodes. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/prompt_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/prompt_configuration/ """ skills: SkillsConfig = Field(default_factory=SkillsConfig) @@ -468,7 +468,7 @@ class AgentsManifest(Schema): json_schema_extra={ "x-icon": "octicon:file-code-16", "x-doc-title": "Manifest Overview", - "documentation_url": "https://phil65.github.io/agentpool/YAML%20Configuration/manifest_configuration/", + "documentation_url": "https://phil65.github.io/wolfharness/YAML%20Configuration/manifest_configuration/", "patternProperties": { # Allow YAML anchors (dot prefix) r"^\.": { @@ -567,7 +567,7 @@ def _loaded_file_agents(self) -> dict[str, NativeAgentConfig]: Parses markdown files in Claude Code, OpenCode, or AgentPool format and converts them to NativeAgentConfig. Results are cached. """ - from agentpool.models.file_parsing import parse_file_agent_reference + from wolfharness.models.file_parsing import parse_file_agent_reference loaded: dict[str, NativeAgentConfig] = {} for name, reference in self.file_agents.items(): @@ -597,7 +597,7 @@ def nodes(self) -> dict[str, NodeConfig]: @property def acp_agents(self) -> dict[str, BaseACPAgentConfig]: """Get ACP agents filtered from unified agents dict.""" - from agentpool.models.acp_agents import BaseACPAgentConfig + from wolfharness.models.acp_agents import BaseACPAgentConfig return {k: v for k, v in self.agents.items() if isinstance(v, BaseACPAgentConfig)} @@ -723,9 +723,9 @@ def from_resolved( """Load agent configuration with layered inheritance. Resolves configuration from multiple sources in precedence order: - 1. Global config (~/.config/agentpool/agentpool.yml) + 1. Global config (~/.config/wolfharness/wolfharness.yml) 2. Custom config (AGENTPOOL_CONFIG env var) - 3. Project config (agentpool.yml in project/git root) + 3. Project config (wolfharness.yml in project/git root) 4. Explicit config (highest precedence) The fallback_config is only used if NO other config defines any agents. @@ -744,7 +744,7 @@ def from_resolved( ValueError: If explicit_path is provided but cannot be loaded, or if merged config is invalid """ - from agentpool_config.resolution import resolve_config + from wolfharness_config.resolution import resolve_config resolved = resolve_config( explicit_path=explicit_path, @@ -853,7 +853,7 @@ def validate_extra_fields(self) -> Self: if __name__ == "__main__": - from agentpool.models.model_configs import InputModelConfig + from wolfharness.models.model_configs import InputModelConfig model = InputModelConfig() agent_cfg = NativeAgentConfig(name="test_agent", model=model) diff --git a/src/agentpool/models/model_configs.py b/src/wolfharness/models/model_configs.py similarity index 98% rename from src/agentpool/models/model_configs.py rename to src/wolfharness/models/model_configs.py index 332077bbd..e310a4a86 100644 --- a/src/agentpool/models/model_configs.py +++ b/src/wolfharness/models/model_configs.py @@ -1,7 +1,7 @@ """Model configuration. Replacement for llmling_models_config.configs. -Provides Pydantic-based model configurations for agentpool agents. +Provides Pydantic-based model configurations for wolfharness agents. """ from __future__ import annotations @@ -19,7 +19,7 @@ from tokonomics.model_names.gemini import GeminiModelName from tokonomics.model_names.openai import OpenaiModelName -from agentpool_config.model_capabilities import ModelCapabilities +from wolfharness_config.model_capabilities import ModelCapabilities if TYPE_CHECKING: @@ -306,7 +306,7 @@ def get_model_settings(self) -> PyAIModelSettings: return ModelSettings(**{k: v for k, v in settings.items() if v is not None}) # type: ignore[typeddict-item, no-any-return] def get_model(self) -> Model: - from agentpool.utils.model_helpers import _get_openai_based_model, infer_model + from wolfharness.utils.model_helpers import _get_openai_based_model, infer_model # If base_url is explicitly configured, create an OpenAI-compatible # model pointing to that endpoint — this is the most common pattern @@ -353,7 +353,7 @@ class FunctionModelConfig(BaseModelConfig): """Function identifier for the model.""" def get_model(self) -> Any: - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model return function_to_model(self.function) @@ -466,7 +466,7 @@ class TestModelConfig(BaseModelConfig): def get_model(self) -> Any: if self.tool_args: - from agentpool.models.fixed_args_test_model import FixedArgsTestModel + from wolfharness.models.fixed_args_test_model import FixedArgsTestModel return FixedArgsTestModel( tool_args=self.tool_args, @@ -796,7 +796,7 @@ def get_model_settings(self) -> OpenAIResponsesModelSettings | OpenAIChatModelSe return OpenAIResponsesModelSettings(**filtered_responses) # type: ignore[typeddict-item, no-any-return] def get_model(self) -> Any: - from agentpool.utils.model_helpers import infer_model + from wolfharness.utils.model_helpers import infer_model prefix = "openai:" if self.api_type == "responses" else "openai-chat:" return infer_model(prefix + self.identifier) @@ -1004,14 +1004,14 @@ def get_model(self) -> Any: if self.auth_method == "oauth": from pydantic_ai.models.anthropic import AnthropicModel - from agentpool.auth.anthropic_auth import ( + from wolfharness.auth.anthropic_auth import ( AnthropicMaxProvider, ) provider = AnthropicMaxProvider() return AnthropicModel(self.identifier, provider=provider) # type: ignore[arg-type] - from agentpool.utils.model_helpers import infer_model + from wolfharness.utils.model_helpers import infer_model return infer_model(self.identifier) @@ -1162,7 +1162,7 @@ def get_model_settings(self) -> GeminiModelSettings: return GeminiModelSettings(**{k: v for k, v in settings.items() if v is not None}) # type: ignore[typeddict-item, no-any-return] def get_model(self) -> Any: - from agentpool.utils.model_helpers import infer_model + from wolfharness.utils.model_helpers import infer_model return infer_model("gemini:" + self.identifier) diff --git a/src/agentpool/models/pending_interaction.py b/src/wolfharness/models/pending_interaction.py similarity index 100% rename from src/agentpool/models/pending_interaction.py rename to src/wolfharness/models/pending_interaction.py diff --git a/src/agentpool/observability/__init__.py b/src/wolfharness/observability/__init__.py similarity index 64% rename from src/agentpool/observability/__init__.py rename to src/wolfharness/observability/__init__.py index ab5dc2479..01902d5fc 100644 --- a/src/agentpool/observability/__init__.py +++ b/src/wolfharness/observability/__init__.py @@ -2,7 +2,7 @@ from __future__ import annotations -from agentpool.observability.observability_registry import ObservabilityRegistry +from wolfharness.observability.observability_registry import ObservabilityRegistry registry = ObservabilityRegistry() diff --git a/src/agentpool/observability/observability_registry.py b/src/wolfharness/observability/observability_registry.py similarity index 96% rename from src/agentpool/observability/observability_registry.py rename to src/wolfharness/observability/observability_registry.py index bb540ed98..2f1b5f9f4 100644 --- a/src/agentpool/observability/observability_registry.py +++ b/src/wolfharness/observability/observability_registry.py @@ -7,11 +7,11 @@ import logfire -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: - from agentpool_config.observability import BaseObservabilityConfig, ObservabilityConfig + from wolfharness_config.observability import BaseObservabilityConfig, ObservabilityConfig logger = get_logger(__name__) diff --git a/src/agentpool/observability/spans.py b/src/wolfharness/observability/spans.py similarity index 99% rename from src/agentpool/observability/spans.py rename to src/wolfharness/observability/spans.py index bf1d0f3ac..f7d7f3cc2 100644 --- a/src/agentpool/observability/spans.py +++ b/src/wolfharness/observability/spans.py @@ -32,7 +32,7 @@ import logfire -from agentpool.log import get_logger +from wolfharness.log import get_logger _log = get_logger(__name__) diff --git a/src/agentpool/observability/trace.py b/src/wolfharness/observability/trace.py similarity index 100% rename from src/agentpool/observability/trace.py rename to src/wolfharness/observability/trace.py diff --git a/src/agentpool/orchestrator/AGENTS.md b/src/wolfharness/orchestrator/AGENTS.md similarity index 100% rename from src/agentpool/orchestrator/AGENTS.md rename to src/wolfharness/orchestrator/AGENTS.md diff --git a/src/agentpool/orchestrator/__init__.py b/src/wolfharness/orchestrator/__init__.py similarity index 75% rename from src/agentpool/orchestrator/__init__.py rename to src/wolfharness/orchestrator/__init__.py index c462d30ec..9206e3331 100644 --- a/src/agentpool/orchestrator/__init__.py +++ b/src/wolfharness/orchestrator/__init__.py @@ -11,16 +11,16 @@ from __future__ import annotations -from agentpool.orchestrator.event_bus import ( +from wolfharness.orchestrator.event_bus import ( DEFAULT_QUEUE_MAXSIZE, EventEnvelope, EventBus, drain_and_merge, ) -from agentpool.orchestrator.metrics import MetricsCollector, SessionPoolMetrics -from agentpool.orchestrator.run import RunHandle -from agentpool.orchestrator.runtime_registry import RuntimeAgentRegistry -from agentpool.orchestrator.session_controller import ( +from wolfharness.orchestrator.metrics import MetricsCollector, SessionPoolMetrics +from wolfharness.orchestrator.run import RunHandle +from wolfharness.orchestrator.runtime_registry import RuntimeAgentRegistry +from wolfharness.orchestrator.session_controller import ( DEFAULT_SESSION_TTL_SECONDS, CheckpointMismatchError, SessionBusyError, @@ -29,7 +29,7 @@ SessionNotFoundError, SessionState, ) -from agentpool.orchestrator.session_pool import ( +from wolfharness.orchestrator.session_pool import ( DEFAULT_MAX_AUTO_RESUME, SessionPool, ) diff --git a/src/agentpool/orchestrator/core.py b/src/wolfharness/orchestrator/core.py similarity index 87% rename from src/agentpool/orchestrator/core.py rename to src/wolfharness/orchestrator/core.py index b3448dea2..f829537a5 100644 --- a/src/agentpool/orchestrator/core.py +++ b/src/wolfharness/orchestrator/core.py @@ -11,7 +11,7 @@ from __future__ import annotations -from agentpool.orchestrator.event_bus import ( +from wolfharness.orchestrator.event_bus import ( DEFAULT_QUEUE_MAXSIZE, EventBus, EventEnvelope, @@ -25,8 +25,8 @@ _rebind, # noqa: F401 drain_and_merge, ) -from agentpool.orchestrator.run import RunHandle -from agentpool.orchestrator.session_controller import ( +from wolfharness.orchestrator.run import RunHandle +from wolfharness.orchestrator.session_controller import ( DEFAULT_SESSION_TTL_SECONDS, CheckpointMismatchError, SessionBusyError, @@ -36,7 +36,7 @@ SessionNotFoundError, SessionState, ) -from agentpool.orchestrator.session_pool import ( +from wolfharness.orchestrator.session_pool import ( DEFAULT_MAX_AUTO_RESUME, SessionPool, ) diff --git a/src/agentpool/orchestrator/event_bus.py b/src/wolfharness/orchestrator/event_bus.py similarity index 99% rename from src/agentpool/orchestrator/event_bus.py rename to src/wolfharness/orchestrator/event_bus.py index ea2aff307..06ba4d9aa 100644 --- a/src/agentpool/orchestrator/event_bus.py +++ b/src/wolfharness/orchestrator/event_bus.py @@ -19,7 +19,7 @@ from pydantic_ai import TextPartDelta, ThinkingPartDelta, ToolCallPartDelta -from agentpool.agents.events import ( +from wolfharness.agents.events import ( CompactionEvent, ElicitationDeferredEvent, PartDeltaEvent, @@ -36,13 +36,13 @@ ToolCallProgressEvent, ToolCallStartEvent, ) -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController logger = get_logger(__name__) diff --git a/src/agentpool/orchestrator/event_mapper.py b/src/wolfharness/orchestrator/event_mapper.py similarity index 99% rename from src/agentpool/orchestrator/event_mapper.py rename to src/wolfharness/orchestrator/event_mapper.py index 423f463a1..c230ede25 100644 --- a/src/agentpool/orchestrator/event_mapper.py +++ b/src/wolfharness/orchestrator/event_mapper.py @@ -45,7 +45,7 @@ except ImportError: EnqueuedMessagesEvent = None # type: ignore[assignment,misc] -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( PartDeltaEvent, PartStartEvent, RichAgentStreamEvent, @@ -54,8 +54,8 @@ ToolCallStartEvent, UserMessageInsertedEvent, ) -from agentpool.tools.base import ToolKind -from agentpool.utils.pydantic_ai_helpers import safe_args_as_dict +from wolfharness.tools.base import ToolKind +from wolfharness.utils.pydantic_ai_helpers import safe_args_as_dict ENQUEUED_MESSAGES_AVAILABLE = EnqueuedMessagesEvent is not None diff --git a/src/agentpool/orchestrator/metrics.py b/src/wolfharness/orchestrator/metrics.py similarity index 78% rename from src/agentpool/orchestrator/metrics.py rename to src/wolfharness/orchestrator/metrics.py index 4502bb945..75c712011 100644 --- a/src/agentpool/orchestrator/metrics.py +++ b/src/wolfharness/orchestrator/metrics.py @@ -6,11 +6,11 @@ import math from typing import TYPE_CHECKING -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: - from agentpool.orchestrator.core import SessionPool + from wolfharness.orchestrator.core import SessionPool logger = get_logger(__name__) @@ -41,7 +41,7 @@ class SessionPoolMetrics: def to_prometheus(self) -> str: """Return metrics in Prometheus exposition format. - All metric names use the ``agentpool_`` prefix and the same + All metric names use the ``wolfharness_`` prefix and the same label names as the existing Grafana dashboards so no dashboard changes are required. @@ -50,30 +50,30 @@ def to_prometheus(self) -> str: """ lines: list[str] = [] - lines.append("# TYPE agentpool_sessions_total gauge") - lines.append(f"agentpool_sessions_total {self.active_sessions}") + lines.append("# TYPE wolfharness_sessions_total gauge") + lines.append(f"wolfharness_sessions_total {self.active_sessions}") - lines.append("# TYPE agentpool_active_turns_total gauge") - lines.append(f"agentpool_active_turns_total {self.active_turns}") + lines.append("# TYPE wolfharness_active_turns_total gauge") + lines.append(f"wolfharness_active_turns_total {self.active_turns}") - lines.append("# TYPE agentpool_auto_resume_total counter") - lines.append(f"agentpool_auto_resume_total {self.auto_resume_count}") + lines.append("# TYPE wolfharness_auto_resume_total counter") + lines.append(f"wolfharness_auto_resume_total {self.auto_resume_count}") - lines.append("# TYPE agentpool_event_bus_subscribers gauge") + lines.append("# TYPE wolfharness_event_bus_subscribers gauge") for session_id, count in self.event_bus_queue_depth.items(): sid = session_id.replace('"', '\\"') - lines.append(f'agentpool_event_bus_subscribers{{session_id="{sid}"}} {count}') + lines.append(f'wolfharness_event_bus_subscribers{{session_id="{sid}"}} {count}') - lines.append("# TYPE agentpool_session_lifetime_seconds gauge") - lines.append(f"agentpool_session_lifetime_seconds {self.session_lifetime_seconds:.3f}") + lines.append("# TYPE wolfharness_session_lifetime_seconds gauge") + lines.append(f"wolfharness_session_lifetime_seconds {self.session_lifetime_seconds:.3f}") - lines.append("# TYPE agentpool_turn_latency_ms summary") - lines.append(f'agentpool_turn_latency_ms{{quantile="0.99"}} {self.turn_latency_p99:.3f}') + lines.append("# TYPE wolfharness_turn_latency_ms summary") + lines.append(f'wolfharness_turn_latency_ms{{quantile="0.99"}} {self.turn_latency_p99:.3f}') - lines.append("# TYPE agentpool_active_runs_by_agent_type gauge") + lines.append("# TYPE wolfharness_active_runs_by_agent_type gauge") for agent_type, count in self.active_runs_by_agent_type.items(): at = agent_type.replace('"', '\\"') - lines.append(f'agentpool_active_runs_by_agent_type{{agent_type="{at}"}} {count}') + lines.append(f'wolfharness_active_runs_by_agent_type{{agent_type="{at}"}} {count}') return "\n".join(lines) diff --git a/src/agentpool/orchestrator/run.py b/src/wolfharness/orchestrator/run.py similarity index 97% rename from src/agentpool/orchestrator/run.py rename to src/wolfharness/orchestrator/run.py index 0951651d8..1c944aa77 100644 --- a/src/agentpool/orchestrator/run.py +++ b/src/wolfharness/orchestrator/run.py @@ -15,18 +15,18 @@ import logfire -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import ( +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import ( RunErrorEvent, RunFailedEvent, RunStartedEvent, StreamCompleteEvent, UserMessageInsertedEvent, ) -from agentpool.lifecycle import RunOutcome -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage -from agentpool.observability.spans import safe_span +from wolfharness.lifecycle import RunOutcome +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage +from wolfharness.observability.spans import safe_span if TYPE_CHECKING: @@ -36,12 +36,12 @@ from pydantic_ai import AgentRun from pydantic_ai.messages import ModelMessage - from agentpool.agents.base_agent import BaseAgent - from agentpool.agents.events.events import RichAgentStreamEvent - from agentpool.host.context import HostContext - from agentpool.host.registry import AgentRegistry - from agentpool.lifecycle.protocols import CommChannel - from agentpool.orchestrator.core import EventBus, SessionState + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.agents.events.events import RichAgentStreamEvent + from wolfharness.host.context import HostContext + from wolfharness.host.registry import AgentRegistry + from wolfharness.lifecycle.protocols import CommChannel + from wolfharness.orchestrator.core import EventBus, SessionState logger = get_logger(__name__) @@ -308,9 +308,9 @@ def _inject_agent_context(self) -> None: """ if self._host_context is None: return - from agentpool.capabilities.agent_context import AgentContextDeps - from agentpool.capabilities.runloop_delegation import RunLoopDelegationService - from agentpool.host.context import RunScope + from wolfharness.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.runloop_delegation import RunLoopDelegationService + from wolfharness.host.context import RunScope registry = self._agent_registry if registry is None: @@ -401,7 +401,7 @@ async def start( session_id=self.session_id, agent_type=self.agent_type, ): - from agentpool.observability.trace import get_trace_id + from wolfharness.observability.trace import get_trace_id logfire.info( "RunHandle started (per-prompt)", @@ -556,7 +556,7 @@ async def _execute_turn( # noqa: PLR0915 # Set _current_input_provider ContextVar so MCP elicitation can # access it during turn execution. if session.input_provider is not None: - from agentpool.mcp_server.manager import _current_input_provider + from wolfharness.mcp_server.manager import _current_input_provider _current_input_provider.set(session.input_provider) # Save user prompt to agent conversation before execution. @@ -566,7 +566,7 @@ async def _execute_turn( # noqa: PLR0915 # staged_content (consumed by NativeTurn), and saving an empty user # message would pollute conversation history (issue #284). if current_prompts: - from agentpool.agents.native_agent.helpers import _summarize_content_block + from wolfharness.agents.native_agent.helpers import _summarize_content_block prompt_text = "\n".join( p if isinstance(p, str) else " ".join(_summarize_content_block(b) for b in p) @@ -684,7 +684,7 @@ def steer( The ``message_id`` string on success, ``None`` if no agent_run is active and the message was queued. """ - from agentpool.lifecycle.types import Feedback + from wolfharness.lifecycle.types import Feedback # Construct Feedback with message_id and content_blocks. fb_kwargs: dict[str, Any] = {} @@ -797,7 +797,7 @@ def followup( A ``message_id`` string on success, ``None`` if no session is attached. """ - from agentpool.utils.identifiers import ascending + from wolfharness.utils.identifiers import ascending message_id = ascending("message") session = self.session @@ -894,7 +894,7 @@ async def _emit_user_message_inserted( session_id=self.session_id, ): try: - from agentpool.utils.identifiers import ascending + from wolfharness.utils.identifiers import ascending event: UserMessageInsertedEvent[Any] = UserMessageInsertedEvent( session_id=self.session_id, diff --git a/src/agentpool/orchestrator/runtime_registry.py b/src/wolfharness/orchestrator/runtime_registry.py similarity index 96% rename from src/agentpool/orchestrator/runtime_registry.py rename to src/wolfharness/orchestrator/runtime_registry.py index 1328eb9bb..3aa953982 100644 --- a/src/agentpool/orchestrator/runtime_registry.py +++ b/src/wolfharness/orchestrator/runtime_registry.py @@ -13,7 +13,7 @@ if TYPE_CHECKING: - from agentpool.models.manifest import AnyAgentConfig + from wolfharness.models.manifest import AnyAgentConfig class RuntimeAgentRegistry: diff --git a/src/agentpool/orchestrator/session_controller.py b/src/wolfharness/orchestrator/session_controller.py similarity index 96% rename from src/agentpool/orchestrator/session_controller.py rename to src/wolfharness/orchestrator/session_controller.py index 85217ddf3..ae958462c 100644 --- a/src/agentpool/orchestrator/session_controller.py +++ b/src/wolfharness/orchestrator/session_controller.py @@ -14,29 +14,29 @@ import anyio -from agentpool.log import get_logger -from agentpool.orchestrator.runtime_registry import RuntimeAgentRegistry -from agentpool.utils.time_utils import get_now +from wolfharness.log import get_logger +from wolfharness.orchestrator.runtime_registry import RuntimeAgentRegistry +from wolfharness.utils.time_utils import get_now if TYPE_CHECKING: from collections.abc import Awaitable, Callable from datetime import datetime - from agentpool.delegation import AgentPool - from agentpool.host.context import HostContext - from agentpool.host.registry import AgentRegistry - from agentpool.lifecycle.protocols import ( + from wolfharness.delegation import AgentPool + from wolfharness.host.context import HostContext + from wolfharness.host.registry import AgentRegistry + from wolfharness.lifecycle.protocols import ( CommChannel, EventTransport, Journal, SnapshotStore, TriggerSource, ) - from agentpool.lifecycle.types import Feedback, ResumeResult - from agentpool.models.pending_interaction import PendingPermission - from agentpool.orchestrator.event_bus import EventBus - from agentpool_storage.protocols import SessionPersistence + from wolfharness.lifecycle.types import Feedback, ResumeResult + from wolfharness.models.pending_interaction import PendingPermission + from wolfharness.orchestrator.event_bus import EventBus + from wolfharness_storage.protocols import SessionPersistence logger = get_logger(__name__) @@ -309,8 +309,8 @@ def set_current_run_id(self, run_id: str | None) -> None: if old == run_id: return # Publish StateUpdate via CommChannel when available. - from agentpool.agents.events import StateUpdate - from agentpool.lifecycle.types import RunState + from wolfharness.agents.events import StateUpdate + from wolfharness.lifecycle.types import RunState comm = self._comm_channel if comm is None: @@ -360,13 +360,15 @@ def revoke(self, message_id: str) -> bool: # Mixin imports placed after SessionState/exception definitions to avoid # circular import issues (mixins need SessionState at runtime). -from agentpool.orchestrator.session_controller_agent import ( # noqa: E402 +from wolfharness.orchestrator.session_controller_agent import ( # noqa: E402 SessionControllerAgentMixin, ) -from agentpool.orchestrator.session_controller_close import ( # noqa: E402 +from wolfharness.orchestrator.session_controller_close import ( # noqa: E402 SessionControllerCloseMixin, ) -from agentpool.orchestrator.session_controller_runs import SessionControllerRunsMixin # noqa: E402 +from wolfharness.orchestrator.session_controller_runs import ( # noqa: E402 + SessionControllerRunsMixin, +) class SessionController( diff --git a/src/agentpool/orchestrator/session_controller_agent.py b/src/wolfharness/orchestrator/session_controller_agent.py similarity index 96% rename from src/agentpool/orchestrator/session_controller_agent.py rename to src/wolfharness/orchestrator/session_controller_agent.py index a0a7442c5..b562633df 100644 --- a/src/agentpool/orchestrator/session_controller_agent.py +++ b/src/wolfharness/orchestrator/session_controller_agent.py @@ -11,22 +11,22 @@ import anyio -from agentpool.log import get_logger -from agentpool_server.opencode_server.models.session_info import SessionInfo +from wolfharness.log import get_logger +from wolfharness_server.opencode_server.models.session_info import SessionInfo if TYPE_CHECKING: import asyncio - from agentpool.agents.base_agent import BaseAgent - from agentpool.delegation import AgentPool - from agentpool.orchestrator.runtime_registry import RuntimeAgentRegistry - from agentpool_storage.protocols import SessionPersistence + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.delegation import AgentPool + from wolfharness.orchestrator.runtime_registry import RuntimeAgentRegistry + from wolfharness_storage.protocols import SessionPersistence # SessionState is imported at runtime (not under TYPE_CHECKING) because it is # used in _get_or_create_session_locked. This works because session_controller.py # defines SessionState before importing this module. -from agentpool.orchestrator.session_controller import SessionState +from wolfharness.orchestrator.session_controller import SessionState logger = get_logger(__name__) @@ -102,7 +102,7 @@ def _state_to_data(self, state: SessionState) -> Any: """ from datetime import UTC, datetime - from agentpool.sessions.models import SessionData + from wolfharness.sessions.models import SessionData # Derive created_at from created_at_ns (epoch nanoseconds) so the # persisted timestamp matches the session ID's embedded timestamp. @@ -149,7 +149,7 @@ async def _get_or_create_session_locked( A tuple of (session_state, was_created) where was_created is True if the session was newly created, False if it already existed. """ - from agentpool.orchestrator.session_controller import SessionLifecyclePolicy + from wolfharness.orchestrator.session_controller import SessionLifecyclePolicy if session_id in self._sessions: state = self._sessions[session_id] @@ -180,7 +180,7 @@ async def _get_or_create_session_locked( # This ensures time.created order matches session ID lexicographic # order, since both come from the same now_ms() call inside # generate_session_id() / ascending() / descending(). - from agentpool.utils.identifiers import extract_timestamp_ms + from wolfharness.utils.identifiers import extract_timestamp_ms ts_ms = extract_timestamp_ms(session_id) if ts_ms is not None: @@ -342,7 +342,7 @@ async def _initialize_lifecycle_and_recovery( session: The session state to initialize dimensions on. agent: The agent instance for this session. """ - from agentpool.lifecycle import ( + from wolfharness.lifecycle import ( DirectChannel, InProcessTransport, MemoryJournal, @@ -386,7 +386,7 @@ async def _initialize_lifecycle_and_recovery( session._lifecycle_session_id = session.session_id # Wire HostContext and AgentRegistry on SessionState (task 1.6). - from agentpool.host.registry import AgentRegistry + from wolfharness.host.registry import AgentRegistry host_ctx = self.pool.get_context() agent_registry = AgentRegistry( diff --git a/src/agentpool/orchestrator/session_controller_close.py b/src/wolfharness/orchestrator/session_controller_close.py similarity index 96% rename from src/agentpool/orchestrator/session_controller_close.py rename to src/wolfharness/orchestrator/session_controller_close.py index f55d84cda..e6fc24b2f 100644 --- a/src/agentpool/orchestrator/session_controller_close.py +++ b/src/wolfharness/orchestrator/session_controller_close.py @@ -11,18 +11,18 @@ import time from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: import anyio - from agentpool.delegation.pool import AgentPool - from agentpool.orchestrator.event_bus import EventBus - from agentpool.orchestrator.run import RunHandle - from agentpool.orchestrator.session_controller import SessionState - from agentpool.sessions.models import PendingDeferredCall, SessionData - from agentpool_storage.protocols import SessionPersistence + from wolfharness.delegation.pool import AgentPool + from wolfharness.orchestrator.event_bus import EventBus + from wolfharness.orchestrator.run import RunHandle + from wolfharness.orchestrator.session_controller import SessionState + from wolfharness.sessions.models import PendingDeferredCall, SessionData + from wolfharness_storage.protocols import SessionPersistence logger = get_logger(__name__) @@ -107,7 +107,7 @@ async def _close_session_unlocked( # noqa: PLR0915 # MCP tool calls unblock immediately. registry = run_handle.run_ctx.elicitation_registry if registry is not None: - from agentpool.orchestrator.session_controller import SessionClosedError + from wolfharness.orchestrator.session_controller import SessionClosedError registry.reject_all(SessionClosedError(session_id)) # Step 2: Await RunHandle completion (10s timeout) diff --git a/src/agentpool/orchestrator/session_controller_runs.py b/src/wolfharness/orchestrator/session_controller_runs.py similarity index 97% rename from src/agentpool/orchestrator/session_controller_runs.py rename to src/wolfharness/orchestrator/session_controller_runs.py index 6d790339d..c5b44ee55 100644 --- a/src/agentpool/orchestrator/session_controller_runs.py +++ b/src/wolfharness/orchestrator/session_controller_runs.py @@ -17,25 +17,25 @@ import logfire from opentelemetry.context import attach, detach -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import ( +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import ( RunErrorEvent, RunFailedEvent, UserMessageInsertedEvent, ) -from agentpool.lifecycle.comm_channel import ProtocolChannel -from agentpool.log import get_logger -from agentpool.observability.spans import safe_span -from agentpool.orchestrator.run import RunHandle, inject_cancelled_tool_results +from wolfharness.lifecycle.comm_channel import ProtocolChannel +from wolfharness.log import get_logger +from wolfharness.observability.spans import safe_span +from wolfharness.orchestrator.run import RunHandle, inject_cancelled_tool_results if TYPE_CHECKING: from pydantic_ai.messages import ModelMessage - from agentpool.agents.base_agent import BaseAgent - from agentpool.delegation import AgentPool - from agentpool.orchestrator.event_bus import EventBus - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.delegation import AgentPool + from wolfharness.orchestrator.event_bus import EventBus + from wolfharness.orchestrator.session_controller import SessionState logger = get_logger(__name__) @@ -105,7 +105,7 @@ async def _emit_user_message_inserted( source=source, ): try: - from agentpool.utils.identifiers import ascending + from wolfharness.utils.identifiers import ascending event = UserMessageInsertedEvent( session_id=session_id, @@ -432,7 +432,7 @@ def _start_run_handle( from opentelemetry import trace as otel_trace from opentelemetry.context import Context - tracer = otel_trace.get_tracer("agentpool.run") + tracer = otel_trace.get_tracer("wolfharness.run") run_span = tracer.start_span( "run.message", context=Context(), # Empty context → new trace, no parent @@ -449,7 +449,7 @@ def _start_run_handle( session.set_current_run_id(run_handle.run_id) # Generate message_id for the initial prompt. - from agentpool.lifecycle.types import Feedback + from wolfharness.lifecycle.types import Feedback fb_kwargs: dict[str, Any] = {} if message_id is not None: @@ -529,7 +529,7 @@ async def _route_message( # Generate message_id once so both _emit_user_message_inserted() and # steer()/followup() share the same ID for dedup. if message_id is None: - from agentpool.utils.identifiers import ascending + from wolfharness.utils.identifiers import ascending message_id = ascending("message") async with session._request_lock: @@ -586,7 +586,7 @@ async def _route_message( message_id=message_id, meta=meta, ) - from agentpool.lifecycle.types import Feedback + from wolfharness.lifecycle.types import Feedback fb_kwargs: dict[str, Any] = {} if message_id is not None: @@ -671,7 +671,7 @@ async def wait_for_completion(self, session_id: str, timeout: float | None = 300 asyncio.TimeoutError: If the run does not complete within ``timeout`` seconds. """ - from agentpool.orchestrator.session_controller import SessionNotFoundError + from wolfharness.orchestrator.session_controller import SessionNotFoundError if timeout is None: timeout = 300 diff --git a/src/agentpool/orchestrator/session_pool.py b/src/wolfharness/orchestrator/session_pool.py similarity index 96% rename from src/agentpool/orchestrator/session_pool.py rename to src/wolfharness/orchestrator/session_pool.py index dc0dae9e6..1287a8a17 100644 --- a/src/agentpool/orchestrator/session_pool.py +++ b/src/wolfharness/orchestrator/session_pool.py @@ -12,31 +12,35 @@ import time from typing import TYPE_CHECKING, Any, Final -from agentpool.agents.events import ( +from wolfharness.agents.events import ( SessionResumeEvent, ) -from agentpool.log import get_logger -from agentpool.orchestrator.event_bus import EventBus -from agentpool.orchestrator.session_controller import ( +from wolfharness.log import get_logger +from wolfharness.orchestrator.event_bus import EventBus +from wolfharness.orchestrator.session_controller import ( CheckpointMismatchError, SessionBusyError, SessionController, SessionNotFoundError, SessionState, ) -from agentpool.orchestrator.session_pool_config import SessionPoolConfig +from wolfharness.orchestrator.session_pool_config import SessionPoolConfig if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool.agents.base_agent import BaseAgent - from agentpool.agents.native_agent import Agent - from agentpool.agents.native_agent.checkpoint import CheckpointData - from agentpool.delegation import AgentPool - from agentpool.messaging import ChatMessage - from agentpool.sessions.models import ElicitationResumePayload, PendingDeferredCall, SessionData - from agentpool_storage.protocols import SessionPersistence + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.agents.native_agent import Agent + from wolfharness.agents.native_agent.checkpoint import CheckpointData + from wolfharness.delegation import AgentPool + from wolfharness.messaging import ChatMessage + from wolfharness.sessions.models import ( + ElicitationResumePayload, + PendingDeferredCall, + SessionData, + ) + from wolfharness_storage.protocols import SessionPersistence logger = get_logger(__name__) @@ -44,9 +48,9 @@ DEFAULT_MAX_AUTO_RESUME: Final[int] = 10 # Mixin imports placed after session_controller imports to avoid circular issues. -from agentpool.orchestrator.session_pool_messaging import SessionPoolMessagingMixin # noqa: E402 -from agentpool.orchestrator.session_pool_runs import SessionPoolRunsMixin # noqa: E402 -from agentpool.orchestrator.session_pool_teams import SessionPoolTeamsMixin # noqa: E402 +from wolfharness.orchestrator.session_pool_messaging import SessionPoolMessagingMixin # noqa: E402 +from wolfharness.orchestrator.session_pool_runs import SessionPoolRunsMixin # noqa: E402 +from wolfharness.orchestrator.session_pool_teams import SessionPoolTeamsMixin # noqa: E402 class SessionPool( @@ -183,7 +187,7 @@ async def create_child_session( This is a first-class API for hierarchical session creation. The child session inherits the parent's ``project_id`` and ``cwd`` automatically. A sortable session ID is generated via - :func:`agentpool.utils.identifiers.generate_session_id` when not + :func:`wolfharness.utils.identifiers.generate_session_id` when not provided. Args: @@ -197,7 +201,7 @@ async def create_child_session( Returns: The child session state. """ - from agentpool.utils.identifiers import generate_session_id + from wolfharness.utils.identifiers import generate_session_id child_session_id = session_id or generate_session_id() metadata.setdefault("agent_type", agent_type) @@ -282,7 +286,7 @@ async def _load_checkpoint_data(self, session_id: str) -> CheckpointData: Raises: SessionNotFoundError: If no checkpoint exists for the session. """ - from agentpool.agents.native_agent.checkpoint import CheckpointManager + from wolfharness.agents.native_agent.checkpoint import CheckpointManager storage = self.pool.storage if storage is None: @@ -311,8 +315,8 @@ async def _reconstruct_native_agent( Raises: SessionNotFoundError: If the agent config is not found. """ - from agentpool.models.agents import NativeAgentConfig - from agentpool_config.context import ConfigContextManager + from wolfharness.models.agents import NativeAgentConfig + from wolfharness_config.context import ConfigContextManager cfg = self.pool.manifest.agents.get(agent_name) if cfg is None: @@ -357,7 +361,7 @@ async def _reconstruct_acp_agent( Raises: SessionNotFoundError: If the agent config is not found. """ - from agentpool_config.context import ConfigContextManager + from wolfharness_config.context import ConfigContextManager cfg = self.pool.manifest.agents.get(agent_name) if cfg is None: @@ -436,7 +440,7 @@ async def _resume_native_agent( # noqa: PLR0915 # we skip the comparison and proceed with resume. if session_data.agent_config_hash: try: - from agentpool.agents.native_agent.checkpoint import ( + from wolfharness.agents.native_agent.checkpoint import ( compute_agent_config_hash, ) @@ -522,7 +526,7 @@ async def _resume_native_agent( # noqa: PLR0915 if elicitation_payloads: from mcp.types import ElicitResult as MCPElicitResult - from agentpool.ui.elicitation import normalize_elicit_content + from wolfharness.ui.elicitation import normalize_elicit_content for payload in elicitation_payloads: # Map elicitation handle to ToolCallPart.tool_call_id diff --git a/src/agentpool/orchestrator/session_pool_config.py b/src/wolfharness/orchestrator/session_pool_config.py similarity index 100% rename from src/agentpool/orchestrator/session_pool_config.py rename to src/wolfharness/orchestrator/session_pool_config.py diff --git a/src/agentpool/orchestrator/session_pool_messaging.py b/src/wolfharness/orchestrator/session_pool_messaging.py similarity index 96% rename from src/agentpool/orchestrator/session_pool_messaging.py rename to src/wolfharness/orchestrator/session_pool_messaging.py index a890ac38d..fb85c017a 100644 --- a/src/agentpool/orchestrator/session_pool_messaging.py +++ b/src/wolfharness/orchestrator/session_pool_messaging.py @@ -12,21 +12,21 @@ import logfire -from agentpool.agents.events import StreamCompleteEvent -from agentpool.lifecycle.types import DeliveryMode, Feedback -from agentpool.log import get_logger -from agentpool.utils.pydantic_ai_helpers import flatten_prompts +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.lifecycle.types import DeliveryMode, Feedback +from wolfharness.log import get_logger +from wolfharness.utils.pydantic_ai_helpers import flatten_prompts if TYPE_CHECKING: from collections import OrderedDict - from agentpool.agents.base_agent import BaseAgent - from agentpool.delegation import AgentPool - from agentpool.messaging import ChatMessage - from agentpool.orchestrator.event_bus import EventBus - from agentpool.orchestrator.run import RunHandle - from agentpool.orchestrator.session_controller import SessionController, SessionState + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.delegation import AgentPool + from wolfharness.messaging import ChatMessage + from wolfharness.orchestrator.event_bus import EventBus + from wolfharness.orchestrator.run import RunHandle + from wolfharness.orchestrator.session_controller import SessionController, SessionState logger = get_logger(__name__) @@ -117,7 +117,7 @@ async def _process_prompt_run_turn( ``start()`` to completion. If a run is active, steers the message into it. """ - from agentpool.agents.events import RunErrorEvent, StreamCompleteEvent + from wolfharness.agents.events import RunErrorEvent, StreamCompleteEvent session, _ = await self.sessions.get_or_create_session(session_id) if session.is_closing: @@ -289,8 +289,8 @@ async def run_agent( Exception: Any error from the agent run is re-raised after session cleanup. """ - from agentpool.agents.events import RunErrorEvent - from agentpool.utils.identifiers import generate_session_id + from wolfharness.agents.events import RunErrorEvent + from wolfharness.utils.identifiers import generate_session_id session_id = generate_session_id() await self.create_session( @@ -439,8 +439,8 @@ async def steer_from_background_task(self, session_id: str, message: str) -> str Returns: message_id if delivered, None otherwise. """ - from agentpool.agents.events.events import UserMessageInsertedEvent - from agentpool.utils.identifiers import ascending + from wolfharness.agents.events.events import UserMessageInsertedEvent + from wolfharness.utils.identifiers import ascending session = self.sessions._sessions.get(session_id) if session is None: diff --git a/src/agentpool/orchestrator/session_pool_runs.py b/src/wolfharness/orchestrator/session_pool_runs.py similarity index 95% rename from src/agentpool/orchestrator/session_pool_runs.py rename to src/wolfharness/orchestrator/session_pool_runs.py index e194525c5..4da37e9a4 100644 --- a/src/agentpool/orchestrator/session_pool_runs.py +++ b/src/wolfharness/orchestrator/session_pool_runs.py @@ -11,14 +11,14 @@ from typing import TYPE_CHECKING, Any import uuid -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import ( +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import ( RunErrorEvent, StreamCompleteEvent, ) -from agentpool.log import get_logger -from agentpool.orchestrator.run import RunHandle -from agentpool.utils.pydantic_ai_helpers import flatten_prompts +from wolfharness.log import get_logger +from wolfharness.orchestrator.run import RunHandle +from wolfharness.utils.pydantic_ai_helpers import flatten_prompts if TYPE_CHECKING: @@ -26,10 +26,10 @@ from pydantic_ai.messages import ModelMessage - from agentpool.agents.base_agent import BaseAgent - from agentpool.delegation import AgentPool - from agentpool.orchestrator.event_bus import EventBus - from agentpool.orchestrator.session_controller import SessionController, SessionState + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.delegation import AgentPool + from wolfharness.orchestrator.event_bus import EventBus + from wolfharness.orchestrator.session_controller import SessionController, SessionState logger = get_logger(__name__) @@ -112,7 +112,7 @@ def _create_run_handle( SessionBusyError: If the session already has an active run that is not completed. """ - from agentpool.orchestrator.session_controller import SessionBusyError + from wolfharness.orchestrator.session_controller import SessionBusyError # Staleness check: prevent silently overwriting an active run. if session.current_run_id is not None and session.current_run_id in self.sessions._runs: @@ -142,7 +142,7 @@ def _create_run_handle( # Handle both list[ModelMessage] and MessageHistory objects. # Some callers (e.g. subagent_tools.py) pass MessageHistory() # which is not directly iterable as list[ModelMessage]. - from agentpool.messaging.message_history import MessageHistory + from wolfharness.messaging.message_history import MessageHistory if isinstance(message_history, MessageHistory): model_msgs: list[ModelMessage] = [] @@ -158,7 +158,7 @@ def _create_run_handle( if conversation is not None: for chat_msg in conversation.get_history(): model_messages.extend(chat_msg.messages) - from agentpool.orchestrator.run import inject_cancelled_tool_results + from wolfharness.orchestrator.run import inject_cancelled_tool_results run_handle._message_history = inject_cancelled_tool_results(model_messages) if deferred_tool_results is not None: diff --git a/src/agentpool/orchestrator/session_pool_teams.py b/src/wolfharness/orchestrator/session_pool_teams.py similarity index 91% rename from src/agentpool/orchestrator/session_pool_teams.py rename to src/wolfharness/orchestrator/session_pool_teams.py index b87f78163..7b7fc7bf7 100644 --- a/src/agentpool/orchestrator/session_pool_teams.py +++ b/src/wolfharness/orchestrator/session_pool_teams.py @@ -8,15 +8,15 @@ from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: from collections.abc import Sequence - from agentpool.delegation.base_team import BaseTeam - from agentpool.messaging.messagenode import MessageNode - from agentpool_config.teams import TeamConfig + from wolfharness.delegation.base_team import BaseTeam + from wolfharness.messaging.messagenode import MessageNode + from wolfharness_config.teams import TeamConfig logger = get_logger(__name__) @@ -32,7 +32,7 @@ def _build_team_from_config( This replaces the deprecated ``TeamConfig.get_team()`` method, keeping team instantiation in the core layer instead of the config layer. """ - from agentpool.delegation.base_team import BaseTeam + from wolfharness.delegation.base_team import BaseTeam member_configs = team_config.get_member_configs() @@ -84,7 +84,7 @@ async def create_team_from_config( ValueError: If a member name is not found in the manifest agents or teams section. """ - from agentpool_config.context import ConfigContextManager + from wolfharness_config.context import ConfigContextManager member_names = [team_config.get_member_name(m) for m in team_config.members] diff --git a/src/agentpool/orchestrator/turn.py b/src/wolfharness/orchestrator/turn.py similarity index 97% rename from src/agentpool/orchestrator/turn.py rename to src/wolfharness/orchestrator/turn.py index d371aa563..ebe46ccf3 100644 --- a/src/agentpool/orchestrator/turn.py +++ b/src/wolfharness/orchestrator/turn.py @@ -11,11 +11,11 @@ from pydantic_ai.messages import ModelMessage - from agentpool.agents.context import AgentRunContext - from agentpool.agents.events.events import RichAgentStreamEvent - from agentpool.hooks import AgentHooks - from agentpool.hooks.base import HookResult - from agentpool.messaging import ChatMessage + from wolfharness.agents.context import AgentRunContext + from wolfharness.agents.events.events import RichAgentStreamEvent + from wolfharness.hooks import AgentHooks + from wolfharness.hooks.base import HookResult + from wolfharness.messaging import ChatMessage class Turn(ABC): @@ -243,7 +243,7 @@ def _log_tool_execution( status: Execution status (``"completed"``, ``"cancelled"``, ``"failed"``, etc.). Defaults to ``"completed"``. """ - from agentpool.lifecycle.types import ToolExecutionRecord + from wolfharness.lifecycle.types import ToolExecutionRecord # Per-Turn idempotency guard using _logged_tools set. # This Turn instance is not reused across turns — _logged_tools diff --git a/src/agentpool/prompts/__init__.py b/src/wolfharness/prompts/__init__.py similarity index 100% rename from src/agentpool/prompts/__init__.py rename to src/wolfharness/prompts/__init__.py diff --git a/src/agentpool/prompts/base.py b/src/wolfharness/prompts/base.py similarity index 100% rename from src/agentpool/prompts/base.py rename to src/wolfharness/prompts/base.py diff --git a/src/agentpool/prompts/builtin_provider.py b/src/wolfharness/prompts/builtin_provider.py similarity index 91% rename from src/agentpool/prompts/builtin_provider.py rename to src/wolfharness/prompts/builtin_provider.py index 684653f18..c332b8748 100644 --- a/src/agentpool/prompts/builtin_provider.py +++ b/src/wolfharness/prompts/builtin_provider.py @@ -4,12 +4,12 @@ from typing import TYPE_CHECKING, Any -from agentpool.prompts.base import BasePromptProvider -from agentpool_config.system_prompts import StaticPromptConfig +from wolfharness.prompts.base import BasePromptProvider +from wolfharness_config.system_prompts import StaticPromptConfig if TYPE_CHECKING: - from agentpool_config.system_prompts import StaticPromptConfig + from wolfharness_config.system_prompts import StaticPromptConfig class BuiltinPromptProvider(BasePromptProvider): diff --git a/src/agentpool/prompts/conversion_manager.py b/src/wolfharness/prompts/conversion_manager.py similarity index 95% rename from src/agentpool/prompts/conversion_manager.py rename to src/wolfharness/prompts/conversion_manager.py index 678618b91..60f660052 100644 --- a/src/agentpool/prompts/conversion_manager.py +++ b/src/wolfharness/prompts/conversion_manager.py @@ -4,8 +4,8 @@ from concurrent.futures import ThreadPoolExecutor from typing import TYPE_CHECKING, Any -from agentpool.mime_utils import guess_type -from agentpool_config.converters import ConversionConfig +from wolfharness.mime_utils import guess_type +from wolfharness_config.converters import ConversionConfig if TYPE_CHECKING: @@ -89,7 +89,7 @@ async def convert_content(self, content: Any, mime_type: str | None = None) -> s if __name__ == "__main__": from docler_config.converter_configs import MarkItDownConfig - from agentpool_config.converters import ConversionConfig + from wolfharness_config.converters import ConversionConfig config = ConversionConfig(providers=[MarkItDownConfig()]) manager = ConversionManager(config) diff --git a/src/agentpool/prompts/convert.py b/src/wolfharness/prompts/convert.py similarity index 94% rename from src/agentpool/prompts/convert.py rename to src/wolfharness/prompts/convert.py index ec80c9aa5..a25c1d513 100644 --- a/src/agentpool/prompts/convert.py +++ b/src/wolfharness/prompts/convert.py @@ -10,7 +10,7 @@ from toprompt import to_prompt from upathtools import UPath, read_path, to_upath -from agentpool.common_types import PathReference +from wolfharness.common_types import PathReference if TYPE_CHECKING: @@ -18,7 +18,7 @@ from pydantic_ai import UserContent - from agentpool.common_types import PromptCompatible + from wolfharness.common_types import PromptCompatible async def convert_prompts(prompts: Sequence[PromptCompatible]) -> list[UserContent]: @@ -34,7 +34,7 @@ async def convert_prompts(prompts: Sequence[PromptCompatible]) -> list[UserConte for p in prompts: match p: case PathReference(path=path, fs=fs, mime_type=mime_type, display_name=display_name): - from agentpool.repomap import get_resource_context + from wolfharness.repomap import get_resource_context # Add display link if available if display_name: @@ -50,7 +50,7 @@ async def convert_prompts(prompts: Sequence[PromptCompatible]) -> list[UserConte result.append(path) case os.PathLike() | UPath(): - from agentpool.mime_utils import guess_type + from wolfharness.mime_utils import guess_type path_obj = to_upath(p) # ty: ignore[invalid-argument-type] mime_type = guess_type(str(path_obj)) diff --git a/src/agentpool/prompts/instructions.py b/src/wolfharness/prompts/instructions.py similarity index 98% rename from src/agentpool/prompts/instructions.py rename to src/wolfharness/prompts/instructions.py index adf2a0adb..4e32ee14c 100644 --- a/src/agentpool/prompts/instructions.py +++ b/src/wolfharness/prompts/instructions.py @@ -29,7 +29,7 @@ def instruction(ctx: RunContext[AgentContext[Any]]) -> str: from pydantic_ai import RunContext - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext # Import runtime_checkable for protocol instance checking diff --git a/src/agentpool/prompts/manager.py b/src/wolfharness/prompts/manager.py similarity index 95% rename from src/agentpool/prompts/manager.py rename to src/wolfharness/prompts/manager.py index 40e3263bd..9687fbaf9 100644 --- a/src/agentpool/prompts/manager.py +++ b/src/wolfharness/prompts/manager.py @@ -9,14 +9,14 @@ from pydantic_ai import UserPromptPart from slashed import Command, CommandContext -from agentpool.log import get_logger -from agentpool.prompts.builtin_provider import BuiltinPromptProvider +from wolfharness.log import get_logger +from wolfharness.prompts.builtin_provider import BuiltinPromptProvider if TYPE_CHECKING: - from agentpool.agents.staged_content import StagedContent - from agentpool.prompts.base import BasePromptProvider - from agentpool_config.system_prompts import PromptLibraryConfig, StaticPromptConfig + from wolfharness.agents.staged_content import StagedContent + from wolfharness.prompts.base import BasePromptProvider + from wolfharness_config.system_prompts import PromptLibraryConfig, StaticPromptConfig logger = get_logger(__name__) diff --git a/src/agentpool/prompts/parts/zed.md b/src/wolfharness/prompts/parts/zed.md similarity index 87% rename from src/agentpool/prompts/parts/zed.md rename to src/wolfharness/prompts/parts/zed.md index 4c5dbfe7e..b3f587262 100644 --- a/src/agentpool/prompts/parts/zed.md +++ b/src/wolfharness/prompts/parts/zed.md @@ -10,8 +10,8 @@ When referencing code locations in responses, use markdown links with `file://` Line range format is `#L:` (1-based, inclusive). Examples: -- [toolset.py](file:///home/phil65/dev/oss/agentpool/src/agentpool_toolsets/openapi/toolset.py) -- [OpenAPITools class](file:///home/phil65/dev/oss/agentpool/src/agentpool_toolsets/openapi/toolset.py#L19:80) +- [toolset.py](file:///home/phil65/dev/oss/wolfharness/src/wolfharness_toolsets/openapi/toolset.py) +- [OpenAPITools class](file:///home/phil65/dev/oss/wolfharness/src/wolfharness_toolsets/openapi/toolset.py#L19:80) Use these clickable references when pointing to specific code locations. For showing actual code content, still use fenced code blocks with the path-based syntax. diff --git a/src/agentpool/prompts/prompts.py b/src/wolfharness/prompts/prompts.py similarity index 98% rename from src/agentpool/prompts/prompts.py rename to src/wolfharness/prompts/prompts.py index 8ae96b8c4..4aaa4f82a 100644 --- a/src/agentpool/prompts/prompts.py +++ b/src/wolfharness/prompts/prompts.py @@ -14,10 +14,10 @@ from slashed import Command from upathtools import UPath, to_upath -from agentpool.log import get_logger -from agentpool.mcp_server import MCPClient -from agentpool.utils import importing -from agentpool.utils.inspection import execute +from wolfharness.log import get_logger +from wolfharness.mcp_server import MCPClient +from wolfharness.utils import importing +from wolfharness.utils.inspection import execute if TYPE_CHECKING: @@ -29,7 +29,7 @@ from pydantic_ai import ModelRequestPart from slashed import CommandContext - from agentpool.agents.staged_content import StagedContent + from wolfharness.agents.staged_content import StagedContent logger = get_logger(__name__) @@ -355,7 +355,7 @@ def from_callable( else: description = description_override or f"Prompt from {name}" - from agentpool.utils.inspection import get_fn_qualname + from wolfharness.utils.inspection import get_fn_qualname path = f"{fn.__module__}.{get_fn_qualname(fn)}" return cls( @@ -467,7 +467,7 @@ async def get_components( RuntimeError: If prompt fetch fails ValueError: If prompt contains unsupported message types """ - from agentpool.mcp_server.conversions import content_block_as_text + from wolfharness.mcp_server.conversions import content_block_as_text try: result = await self.client.get_prompt(self.name, arguments) diff --git a/src/agentpool/running/py.typed b/src/wolfharness/py.typed similarity index 100% rename from src/agentpool/running/py.typed rename to src/wolfharness/py.typed diff --git a/src/agentpool/repomap/__init__.py b/src/wolfharness/repomap/__init__.py similarity index 81% rename from src/agentpool/repomap/__init__.py rename to src/wolfharness/repomap/__init__.py index 91255481d..5e0846bc4 100644 --- a/src/agentpool/repomap/__init__.py +++ b/src/wolfharness/repomap/__init__.py @@ -34,21 +34,21 @@ from __future__ import annotations -from agentpool.repomap.context import ( +from wolfharness.repomap.context import ( generate_directory_context, generate_file_context, get_resource_context, ) -from agentpool.repomap.core import RepoMap -from agentpool.repomap.types import FileInfo, RepoMapResult, TokenCounter -from agentpool.repomap.languages import ( +from wolfharness.repomap.core import RepoMap +from wolfharness.repomap.types import FileInfo, RepoMapResult, TokenCounter +from wolfharness.repomap.languages import ( get_supported_languages, get_supported_languages_md, is_language_supported, ) -from agentpool.repomap.outline import generate_file_outline, get_file_map_from_content -from agentpool.repomap.tags import Tag, get_tags_from_content -from agentpool.repomap.utils import find_src_files, is_important, truncate_with_notice +from wolfharness.repomap.outline import generate_file_outline, get_file_map_from_content +from wolfharness.repomap.tags import Tag, get_tags_from_content +from wolfharness.repomap.utils import find_src_files, is_important, truncate_with_notice __all__ = [ "FileInfo", diff --git a/src/agentpool/repomap/context.py b/src/wolfharness/repomap/context.py similarity index 95% rename from src/agentpool/repomap/context.py rename to src/wolfharness/repomap/context.py index 8c4747665..85cb95069 100644 --- a/src/agentpool/repomap/context.py +++ b/src/wolfharness/repomap/context.py @@ -20,7 +20,7 @@ from typing import TYPE_CHECKING -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -89,9 +89,9 @@ async def generate_directory_context( """ from upathtools.filesystems import AsyncLocalFileSystem - from agentpool.repomap.core import RepoMap - from agentpool.repomap.languages import is_language_supported - from agentpool.repomap.utils import is_important + from wolfharness.repomap.core import RepoMap + from wolfharness.repomap.languages import is_language_supported + from wolfharness.repomap.utils import is_important logger.info("Generating directory context", path=str(path)) fs = fs or AsyncLocalFileSystem() @@ -172,8 +172,8 @@ async def generate_file_context(path: Path, fs: AsyncFileSystem | None = None) - Returns: File context string or None if generation fails """ - from agentpool.repomap.outline import generate_file_outline - from agentpool.repomap.utils import truncate_with_notice + from wolfharness.repomap.outline import generate_file_outline + from wolfharness.repomap.utils import truncate_with_notice logger.info("Generating file context", path=str(path)) try: diff --git a/src/agentpool/repomap/core.py b/src/wolfharness/repomap/core.py similarity index 98% rename from src/agentpool/repomap/core.py rename to src/wolfharness/repomap/core.py index 38689098e..d317eb915 100644 --- a/src/agentpool/repomap/core.py +++ b/src/wolfharness/repomap/core.py @@ -12,8 +12,8 @@ import re from typing import TYPE_CHECKING, Any, ClassVar, cast -from agentpool.repomap.tags import Tag, get_tags_from_content -from agentpool.repomap.utils import MIN_TOKEN_SAMPLE_SIZE, get_rel_path +from wolfharness.repomap.tags import Tag, get_tags_from_content +from wolfharness.repomap.utils import MIN_TOKEN_SAMPLE_SIZE, get_rel_path if TYPE_CHECKING: @@ -21,7 +21,7 @@ from fsspec import AbstractFileSystem - from agentpool.repomap.types import FileInfo, RepoMapResult, TokenCounter + from wolfharness.repomap.types import FileInfo, RepoMapResult, TokenCounter # Constants CACHE_VERSION = 3 @@ -37,7 +37,7 @@ class RepoMap: Uses async fsspec filesystem for non-blocking IO operations. """ - TAGS_CACHE_DIR: ClassVar[str] = f".agentpool.tags.cache.v{CACHE_VERSION}" + TAGS_CACHE_DIR: ClassVar[str] = f".wolfharness.tags.cache.v{CACHE_VERSION}" warned_files: ClassVar[set[str]] = set() def __init__( @@ -100,7 +100,7 @@ async def _cat_file(self, path: str) -> str | None: async def _info(self, path: str) -> FileInfo | None: """Get file info.""" - from agentpool.repomap.types import FileInfo + from wolfharness.repomap.types import FileInfo try: info = await self.fs._info(path) @@ -232,7 +232,7 @@ async def get_map_with_metadata( boost_files: Files to boost in ranking. boost_idents: Identifiers to boost in ranking. """ - from agentpool.repomap.types import RepoMapResult + from wolfharness.repomap.types import RepoMapResult if not files: return RepoMapResult( diff --git a/src/agentpool/repomap/languages.py b/src/wolfharness/repomap/languages.py similarity index 96% rename from src/agentpool/repomap/languages.py rename to src/wolfharness/repomap/languages.py index ee4e04a77..c30b0b89d 100644 --- a/src/agentpool/repomap/languages.py +++ b/src/wolfharness/repomap/languages.py @@ -18,7 +18,9 @@ def get_scm_fname(lang: str) -> Path | None: from importlib import resources fname = f"{lang}-tags.scm" - ref = resources.files("agentpool") / "repomap" / "queries" / "tree-sitter-language-pack" / fname + ref = ( + resources.files("wolfharness") / "repomap" / "queries" / "tree-sitter-language-pack" / fname + ) # Try to get the path if isinstance(ref, os.PathLike): diff --git a/src/agentpool/repomap/outline.py b/src/wolfharness/repomap/outline.py similarity index 97% rename from src/agentpool/repomap/outline.py rename to src/wolfharness/repomap/outline.py index 5ed4059fe..5eda6d151 100644 --- a/src/agentpool/repomap/outline.py +++ b/src/wolfharness/repomap/outline.py @@ -10,8 +10,8 @@ if TYPE_CHECKING: from fsspec.asyn import AsyncFileSystem -from agentpool.repomap.languages import is_language_supported -from agentpool.repomap.tags import get_tags_from_content +from wolfharness.repomap.languages import is_language_supported +from wolfharness.repomap.tags import get_tags_from_content async def generate_file_outline( diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/README.md b/src/wolfharness/repomap/queries/tree-sitter-language-pack/README.md similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/README.md rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/README.md diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/arduino-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/arduino-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/arduino-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/arduino-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/c-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/c-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/c-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/c-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/chatito-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/chatito-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/chatito-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/chatito-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/clojure-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/clojure-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/clojure-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/clojure-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/commonlisp-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/commonlisp-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/commonlisp-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/commonlisp-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/cpp-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/cpp-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/cpp-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/cpp-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/csharp-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/csharp-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/csharp-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/csharp-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/d-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/d-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/d-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/d-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/dart-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/dart-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/dart-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/dart-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/elisp-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/elisp-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/elisp-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/elisp-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/elixir-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/elixir-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/elixir-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/elixir-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/elm-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/elm-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/elm-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/elm-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/gleam-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/gleam-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/gleam-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/gleam-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/go-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/go-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/go-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/go-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/java-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/java-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/java-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/java-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/javascript-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/javascript-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/javascript-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/javascript-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/lua-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/lua-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/lua-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/lua-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/matlab-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/matlab-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/matlab-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/matlab-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/ocaml-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/ocaml-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/ocaml-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/ocaml-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/ocaml_interface-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/ocaml_interface-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/ocaml_interface-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/ocaml_interface-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/pony-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/pony-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/pony-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/pony-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/properties-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/properties-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/properties-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/properties-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/python-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/python-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/python-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/python-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/r-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/r-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/r-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/r-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/racket-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/racket-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/racket-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/racket-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/ruby-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/ruby-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/ruby-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/ruby-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/rust-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/rust-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/rust-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/rust-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/solidity-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/solidity-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/solidity-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/solidity-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/swift-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/swift-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/swift-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/swift-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-language-pack/udev-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-language-pack/udev-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-language-pack/udev-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-language-pack/udev-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/README.md b/src/wolfharness/repomap/queries/tree-sitter-languages/README.md similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/README.md rename to src/wolfharness/repomap/queries/tree-sitter-languages/README.md diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/c-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/c-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/c-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/c-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/c_sharp-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/c_sharp-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/c_sharp-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/c_sharp-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/cpp-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/cpp-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/cpp-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/cpp-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/dart-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/dart-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/dart-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/dart-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/elisp-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/elisp-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/elisp-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/elisp-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/elixir-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/elixir-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/elixir-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/elixir-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/elm-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/elm-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/elm-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/elm-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/fortran-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/fortran-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/fortran-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/fortran-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/go-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/go-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/go-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/go-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/haskell-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/haskell-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/haskell-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/haskell-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/hcl-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/hcl-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/hcl-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/hcl-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/java-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/java-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/java-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/java-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/javascript-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/javascript-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/javascript-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/javascript-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/julia-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/julia-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/julia-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/julia-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/kotlin-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/kotlin-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/kotlin-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/kotlin-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/matlab-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/matlab-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/matlab-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/matlab-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/ocaml-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/ocaml-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/ocaml-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/ocaml-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/ocaml_interface-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/ocaml_interface-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/ocaml_interface-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/ocaml_interface-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/php-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/php-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/php-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/php-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/python-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/python-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/python-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/python-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/ql-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/ql-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/ql-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/ql-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/ruby-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/ruby-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/ruby-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/ruby-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/rust-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/rust-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/rust-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/rust-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/scala-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/scala-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/scala-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/scala-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/typescript-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/typescript-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/typescript-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/typescript-tags.scm diff --git a/src/agentpool/repomap/queries/tree-sitter-languages/zig-tags.scm b/src/wolfharness/repomap/queries/tree-sitter-languages/zig-tags.scm similarity index 100% rename from src/agentpool/repomap/queries/tree-sitter-languages/zig-tags.scm rename to src/wolfharness/repomap/queries/tree-sitter-languages/zig-tags.scm diff --git a/src/agentpool/repomap/tags.py b/src/wolfharness/repomap/tags.py similarity index 98% rename from src/agentpool/repomap/tags.py rename to src/wolfharness/repomap/tags.py index 8930bdb69..7461ff342 100644 --- a/src/agentpool/repomap/tags.py +++ b/src/wolfharness/repomap/tags.py @@ -41,7 +41,7 @@ def get_tags_from_content(content: str, filename: str) -> list[Tag]: # noqa: PL from tree_sitter import Query, QueryCursor from tree_sitter_language_pack import SupportedLanguage - from agentpool.repomap.languages import get_scm_fname + from wolfharness.repomap.languages import get_scm_fname val = filename_to_lang(filename) if not val: diff --git a/src/agentpool/repomap/types.py b/src/wolfharness/repomap/types.py similarity index 100% rename from src/agentpool/repomap/types.py rename to src/wolfharness/repomap/types.py diff --git a/src/agentpool/repomap/utils.py b/src/wolfharness/repomap/utils.py similarity index 100% rename from src/agentpool/repomap/utils.py rename to src/wolfharness/repomap/utils.py diff --git a/src/wolfharness/running/__init__.py b/src/wolfharness/running/__init__.py new file mode 100644 index 000000000..d5f759fda --- /dev/null +++ b/src/wolfharness/running/__init__.py @@ -0,0 +1,20 @@ +"""Decorator auto-injection / run package.""" + +from __future__ import annotations + +from wolfharness.running.decorators import with_nodes +from wolfharness.running.discovery import NodeFunction, node_function +from wolfharness.running.executor import execute_single, execute_functions +from wolfharness.running.run_nodes import run_nodes_async, run_nodes +from wolfharness.running.injection import NodeInjectionError + +__all__ = [ + "NodeFunction", + "NodeInjectionError", + "execute_functions", + "execute_single", + "node_function", + "run_nodes", + "run_nodes_async", + "with_nodes", +] diff --git a/src/agentpool/running/decorators.py b/src/wolfharness/running/decorators.py similarity index 94% rename from src/agentpool/running/decorators.py rename to src/wolfharness/running/decorators.py index 66860eef6..9b6b0f769 100644 --- a/src/agentpool/running/decorators.py +++ b/src/wolfharness/running/decorators.py @@ -6,13 +6,13 @@ import inspect from typing import TYPE_CHECKING, overload -from agentpool.running.injection import inject_nodes +from wolfharness.running.injection import inject_nodes if TYPE_CHECKING: from collections.abc import Awaitable, Callable - from agentpool import AgentPool + from wolfharness import AgentPool @overload diff --git a/src/agentpool/running/discovery.py b/src/wolfharness/running/discovery.py similarity index 95% rename from src/agentpool/running/discovery.py rename to src/wolfharness/running/discovery.py index 5ce7b2ed7..8a84ab19b 100644 --- a/src/agentpool/running/discovery.py +++ b/src/wolfharness/running/discovery.py @@ -7,14 +7,14 @@ import inspect from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger -from agentpool.utils.inspection import get_fn_name +from wolfharness.log import get_logger +from wolfharness.utils.inspection import get_fn_name if TYPE_CHECKING: from collections.abc import Sequence - from agentpool.common_types import AnyCallable + from wolfharness.common_types import AnyCallable logger = get_logger(__name__) diff --git a/src/agentpool/running/executor.py b/src/wolfharness/running/executor.py similarity index 97% rename from src/agentpool/running/executor.py rename to src/wolfharness/running/executor.py index de838ce20..6f6143cf2 100644 --- a/src/agentpool/running/executor.py +++ b/src/wolfharness/running/executor.py @@ -11,15 +11,15 @@ import anyio -from agentpool.log import get_logger -from agentpool.running import with_nodes +from wolfharness.log import get_logger +from wolfharness.running import with_nodes if TYPE_CHECKING: import os - from agentpool import AgentPool - from agentpool.running.discovery import NodeFunction + from wolfharness import AgentPool + from wolfharness.running.discovery import NodeFunction logger = get_logger(__name__) diff --git a/src/agentpool/running/injection.py b/src/wolfharness/running/injection.py similarity index 95% rename from src/agentpool/running/injection.py rename to src/wolfharness/running/injection.py index f7bc3c015..c9a836158 100644 --- a/src/agentpool/running/injection.py +++ b/src/wolfharness/running/injection.py @@ -6,14 +6,14 @@ import typing from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger -from agentpool.utils.inspection import get_fn_qualname +from wolfharness.log import get_logger +from wolfharness.utils.inspection import get_fn_qualname if TYPE_CHECKING: from collections.abc import Callable - from agentpool import AgentPool, MessageNode + from wolfharness import AgentPool, MessageNode logger = get_logger(__name__) @@ -21,7 +21,7 @@ def is_node_type(typ: Any) -> bool: """Check if a type is or inherits from MessageNode.""" - from agentpool import MessageNode + from wolfharness import MessageNode if typ is MessageNode: return True diff --git a/src/agentpool_cli/py.typed b/src/wolfharness/running/py.typed similarity index 100% rename from src/agentpool_cli/py.typed rename to src/wolfharness/running/py.typed diff --git a/src/agentpool/running/run_nodes.py b/src/wolfharness/running/run_nodes.py similarity index 93% rename from src/agentpool/running/run_nodes.py rename to src/wolfharness/running/run_nodes.py index 86226cc34..3734ce124 100644 --- a/src/agentpool/running/run_nodes.py +++ b/src/wolfharness/running/run_nodes.py @@ -5,13 +5,13 @@ import asyncio from typing import TYPE_CHECKING, Any -from agentpool.running.executor import discover_functions, execute_functions +from wolfharness.running.executor import discover_functions, execute_functions if TYPE_CHECKING: from upathtools import JoinablePathLike - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.manifest import AgentsManifest async def run_nodes_async( @@ -44,7 +44,7 @@ async def analyze(analyzer: Agent) -> str: print(results["analyze"]) ``` """ - from agentpool import AgentPool + from wolfharness import AgentPool # Find functions to run if module: diff --git a/src/agentpool/server.py b/src/wolfharness/server.py similarity index 97% rename from src/agentpool/server.py rename to src/wolfharness/server.py index 70ab21cb2..122c5a706 100644 --- a/src/agentpool/server.py +++ b/src/wolfharness/server.py @@ -5,13 +5,13 @@ import abc from typing import TYPE_CHECKING, Any, Self -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: from types import TracebackType - from agentpool import AgentPool + from wolfharness import AgentPool logger = get_logger(__name__) diff --git a/src/agentpool/sessions/__init__.py b/src/wolfharness/sessions/__init__.py similarity index 60% rename from src/agentpool/sessions/__init__.py rename to src/wolfharness/sessions/__init__.py index dacf804a4..d7d4f1f71 100644 --- a/src/agentpool/sessions/__init__.py +++ b/src/wolfharness/sessions/__init__.py @@ -1,12 +1,12 @@ """Session data models.""" -from agentpool.sessions.models import ProjectData, SessionData -from agentpool.sessions.state_mapper import ( +from wolfharness.sessions.models import ProjectData, SessionData +from wolfharness.sessions.state_mapper import ( InvariantResult, SessionStateMapper, VALID_SESSION_STATUSES, ) -from agentpool_storage.protocols import SessionPersistence +from wolfharness_storage.protocols import SessionPersistence __all__ = [ "VALID_SESSION_STATUSES", diff --git a/src/agentpool/sessions/models.py b/src/wolfharness/sessions/models.py similarity index 98% rename from src/agentpool/sessions/models.py rename to src/wolfharness/sessions/models.py index 18918cdcd..34e1f0e46 100644 --- a/src/agentpool/sessions/models.py +++ b/src/wolfharness/sessions/models.py @@ -8,13 +8,13 @@ from pydantic import Field from schemez import Schema -from agentpool.utils.time_utils import get_now +from wolfharness.utils.time_utils import get_now class ProjectData(Schema): """Persistable project/worktree state. - Represents a codebase/worktree that agentpool operates on. + Represents a codebase/worktree that wolfharness operates on. Sessions are associated with projects. """ diff --git a/src/agentpool/sessions/state_mapper.py b/src/wolfharness/sessions/state_mapper.py similarity index 98% rename from src/agentpool/sessions/state_mapper.py rename to src/wolfharness/sessions/state_mapper.py index 3c6f3ab39..a39400a3b 100644 --- a/src/agentpool/sessions/state_mapper.py +++ b/src/wolfharness/sessions/state_mapper.py @@ -42,7 +42,7 @@ if TYPE_CHECKING: - from agentpool.lifecycle.types import RunState + from wolfharness.lifecycle.types import RunState # Valid SessionData.status values (source of truth) @@ -109,7 +109,7 @@ def status_to_expected_run_state( ``RunState`` mapping exists (e.g., ``checkpointed`` with no ``RunHandle``, or ``closed`` with no ``RunHandle``). """ - from agentpool.lifecycle.types import RunState + from wolfharness.lifecycle.types import RunState if status == SESSION_STATUS_ACTIVE: # active maps to IDLE when idle, RUNNING when a turn is @@ -142,7 +142,7 @@ def run_state_to_expected_status(run_state: RunState) -> str: Returns: The expected ``SessionData.status`` string. """ - from agentpool.lifecycle.types import RunState + from wolfharness.lifecycle.types import RunState if run_state is RunState.IDLE: return SESSION_STATUS_ACTIVE diff --git a/src/agentpool/skills/AGENTS.md b/src/wolfharness/skills/AGENTS.md similarity index 97% rename from src/agentpool/skills/AGENTS.md rename to src/wolfharness/skills/AGENTS.md index 9cb6ca6a5..c31665c44 100644 --- a/src/agentpool/skills/AGENTS.md +++ b/src/wolfharness/skills/AGENTS.md @@ -13,7 +13,7 @@ | SkillCommand (slash commands) | `command.py` | | Skill URI resolver (`skill://`) | `uri_resolver.py` | | SkillsInstructionProvider (XML injection) | `instruction_provider.py` | -| Skill config models | `agentpool_config/skills.py` | +| Skill config models | `wolfharness_config/skills.py` | ## Conventions diff --git a/src/wolfharness/skills/__init__.py b/src/wolfharness/skills/__init__.py new file mode 100644 index 000000000..bbfad5da9 --- /dev/null +++ b/src/wolfharness/skills/__init__.py @@ -0,0 +1,6 @@ +"""Skills package for Claude Code Skills support.""" + +from wolfharness.skills.manager import SkillsManager +from wolfharness.skills.skill import Skill, to_prompt + +__all__ = ["Skill", "SkillsManager", "to_prompt"] diff --git a/src/agentpool/skills/command.py b/src/wolfharness/skills/command.py similarity index 97% rename from src/agentpool/skills/command.py rename to src/wolfharness/skills/command.py index 72380300f..963155fab 100644 --- a/src/agentpool/skills/command.py +++ b/src/wolfharness/skills/command.py @@ -12,7 +12,7 @@ if TYPE_CHECKING: - from agentpool.skills.skill import Skill + from wolfharness.skills.skill import Skill @dataclass(frozen=True) diff --git a/src/agentpool/skills/exceptions.py b/src/wolfharness/skills/exceptions.py similarity index 97% rename from src/agentpool/skills/exceptions.py rename to src/wolfharness/skills/exceptions.py index 6b8dd6c24..a8654358e 100644 --- a/src/agentpool/skills/exceptions.py +++ b/src/wolfharness/skills/exceptions.py @@ -2,7 +2,7 @@ from __future__ import annotations -from agentpool.utils.baseregistry import AgentPoolError +from wolfharness.utils.baseregistry import AgentPoolError class SkillError(AgentPoolError): diff --git a/src/agentpool/skills/manager.py b/src/wolfharness/skills/manager.py similarity index 95% rename from src/agentpool/skills/manager.py rename to src/wolfharness/skills/manager.py index e56ea1440..c3d95cc5c 100644 --- a/src/agentpool/skills/manager.py +++ b/src/wolfharness/skills/manager.py @@ -6,9 +6,9 @@ from upathtools import JoinablePathLike, UPath, to_upath -from agentpool.log import get_logger -from agentpool.skills.registry import SkillsRegistry -from agentpool_config.skills import SkillsConfig # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness.skills.registry import SkillsRegistry +from wolfharness_config.skills import SkillsConfig # noqa: TC001 if TYPE_CHECKING: @@ -16,7 +16,7 @@ from fsspec import AbstractFileSystem - from agentpool.skills.skill import Skill + from wolfharness.skills.skill import Skill logger = get_logger(__name__) @@ -124,7 +124,7 @@ async def discover_skills( config: Optional skills configuration. config_file_path: Optional path to configuration file for resolving relative paths. """ - from agentpool_config.skills import DEFAULT_SKILLS_PATHS + from wolfharness_config.skills import DEFAULT_SKILLS_PATHS base_path = config_file_path.parent if config_file_path is not None else UPath.cwd() logger.debug("Starting skills discovery", base_path=str(base_path)) diff --git a/src/agentpool/skills/registry.py b/src/wolfharness/skills/registry.py similarity index 97% rename from src/agentpool/skills/registry.py rename to src/wolfharness/skills/registry.py index d732d5a84..95f9a803e 100644 --- a/src/agentpool/skills/registry.py +++ b/src/wolfharness/skills/registry.py @@ -8,10 +8,10 @@ from upathtools import is_directory from upathtools.helpers import to_upath, upath_to_fs -from agentpool.log import get_logger -from agentpool.skills.skill import Skill -from agentpool.tools.exceptions import ToolError -from agentpool.utils.baseregistry import BaseRegistry +from wolfharness.log import get_logger +from wolfharness.skills.skill import Skill +from wolfharness.tools.exceptions import ToolError +from wolfharness.utils.baseregistry import BaseRegistry if TYPE_CHECKING: @@ -199,7 +199,7 @@ def __delitem__(self, key: str) -> None: import anyio from upathtools import UPath - from agentpool.log import configure_logging + from wolfharness.log import configure_logging configure_logging() diff --git a/src/agentpool/skills/skill.py b/src/wolfharness/skills/skill.py similarity index 99% rename from src/agentpool/skills/skill.py rename to src/wolfharness/skills/skill.py index 58b07f2ec..b67172e36 100644 --- a/src/agentpool/skills/skill.py +++ b/src/wolfharness/skills/skill.py @@ -13,7 +13,7 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from upathtools import UPath -from agentpool_config.skills import SkillMcpServerConfig, SkillToolConfig +from wolfharness_config.skills import SkillMcpServerConfig, SkillToolConfig # Type for skill paths - can be UPath (for local filesystem skills) diff --git a/src/agentpool/skills/skill_tool_manager.py b/src/wolfharness/skills/skill_tool_manager.py similarity index 96% rename from src/agentpool/skills/skill_tool_manager.py rename to src/wolfharness/skills/skill_tool_manager.py index 5ef7092f3..5905730e1 100644 --- a/src/agentpool/skills/skill_tool_manager.py +++ b/src/wolfharness/skills/skill_tool_manager.py @@ -6,11 +6,11 @@ import logging from typing import TYPE_CHECKING -from agentpool.tools.base import Tool +from wolfharness.tools.base import Tool if TYPE_CHECKING: - from agentpool_config.skills import SkillToolConfig + from wolfharness_config.skills import SkillToolConfig logger = logging.getLogger(__name__) diff --git a/src/agentpool/skills/uri_resolver.py b/src/wolfharness/skills/uri_resolver.py similarity index 97% rename from src/agentpool/skills/uri_resolver.py rename to src/wolfharness/skills/uri_resolver.py index 4bd42807a..9791a9fae 100644 --- a/src/agentpool/skills/uri_resolver.py +++ b/src/wolfharness/skills/uri_resolver.py @@ -19,16 +19,16 @@ import unicodedata from urllib.parse import unquote, urlparse -from agentpool.skills.exceptions import SecurityError, SkillNotFoundError +from wolfharness.skills.exceptions import SecurityError, SkillNotFoundError if TYPE_CHECKING: - from agentpool.capabilities.resource_protocols import ( + from wolfharness.capabilities.resource_protocols import ( SkillEntry, SkillResource, ) -from agentpool.skills.skill import Skill +from wolfharness.skills.skill import Skill logger = logging.getLogger(__name__) @@ -296,7 +296,7 @@ async def _find_skill_in_providers( Returns: The matching Skill or None if not found. """ - from agentpool.capabilities.resource_protocols import SkillResource + from wolfharness.capabilities.resource_protocols import SkillResource for provider in self._providers.values(): # Check for new SkillResource protocol first. @@ -398,7 +398,7 @@ async def resolve(self, uri: str) -> Skill: """ # Delegate to ExtensionRegistry when available. if self._extension_registry is not None: - from agentpool.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel result = await self._extension_registry.resolve_uri(uri, Scope(level=ScopeLevel.POOL)) if result is not None: diff --git a/src/agentpool/storage/__init__.py b/src/wolfharness/storage/__init__.py similarity index 71% rename from src/agentpool/storage/__init__.py rename to src/wolfharness/storage/__init__.py index 01841d777..702148e10 100644 --- a/src/agentpool/storage/__init__.py +++ b/src/wolfharness/storage/__init__.py @@ -1,7 +1,7 @@ """Storage package.""" -from agentpool.storage.manager import StorageManager -from agentpool.storage.serialization import ( +from wolfharness.storage.manager import StorageManager +from wolfharness.storage.serialization import ( deserialize_messages, deserialize_parts, serialize_messages, diff --git a/src/agentpool/storage/manager.py b/src/wolfharness/storage/manager.py similarity index 98% rename from src/agentpool/storage/manager.py rename to src/wolfharness/storage/manager.py index 23b66b1e9..ba22a9de2 100644 --- a/src/agentpool/storage/manager.py +++ b/src/wolfharness/storage/manager.py @@ -12,13 +12,13 @@ import anyio from pydantic import BaseModel, TypeAdapter -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage -from agentpool.sessions.models import PendingDeferredCall -from agentpool.storage.serialization import deserialize_messages -from agentpool.utils.identifiers import generate_session_id -from agentpool_config.session import SessionQuery -from agentpool_config.storage import StorageConfig +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage +from wolfharness.sessions.models import PendingDeferredCall +from wolfharness.storage.serialization import deserialize_messages +from wolfharness.utils.identifiers import generate_session_id +from wolfharness_config.session import SessionQuery +from wolfharness_config.storage import StorageConfig if TYPE_CHECKING: @@ -28,10 +28,10 @@ from pydantic_ai.messages import ModelMessage - from agentpool.common_types import JsonValue - from agentpool.sessions.models import ProjectData, SessionData - from agentpool_config.storage import BaseStorageProviderConfig - from agentpool_storage.base import StorageProvider + from wolfharness.common_types import JsonValue + from wolfharness.sessions.models import ProjectData, SessionData + from wolfharness_config.storage import BaseStorageProviderConfig + from wolfharness_storage.base import StorageProvider logger = get_logger(__name__) @@ -749,8 +749,8 @@ async def _generate_title_core( Returns: SessionMetadata with title, emoji, and icon, or None if generation fails. """ - from agentpool import Agent - from agentpool.utils.model_helpers import infer_model + from wolfharness import Agent + from wolfharness.utils.model_helpers import infer_model logger.info("_generate_title_core called", session_id=session_id) if not self.config.title_generation_model: diff --git a/src/agentpool/storage/serialization.py b/src/wolfharness/storage/serialization.py similarity index 98% rename from src/agentpool/storage/serialization.py rename to src/wolfharness/storage/serialization.py index 290774062..d2da20dc8 100644 --- a/src/agentpool/storage/serialization.py +++ b/src/wolfharness/storage/serialization.py @@ -8,8 +8,8 @@ from pydantic_ai import ModelMessage, ModelRequestPart, ModelResponsePart from pydantic_ai.messages import UserContent -from agentpool.log import get_logger -from agentpool.sessions.models import PendingDeferredCall +from wolfharness.log import get_logger +from wolfharness.sessions.models import PendingDeferredCall if TYPE_CHECKING: diff --git a/src/wolfharness/talk/__init__.py b/src/wolfharness/talk/__init__.py new file mode 100644 index 000000000..878cdc12c --- /dev/null +++ b/src/wolfharness/talk/__init__.py @@ -0,0 +1,13 @@ +"""Talk classes.""" + +from wolfharness.talk.stats import TalkStats, AggregatedTalkStats +from wolfharness.talk.talk import Talk, TeamTalk +from wolfharness.talk.registry import ConnectionRegistry + +__all__ = [ + "AggregatedTalkStats", + "ConnectionRegistry", + "Talk", + "TalkStats", + "TeamTalk", +] diff --git a/src/agentpool/talk/graph_edges.py b/src/wolfharness/talk/graph_edges.py similarity index 96% rename from src/agentpool/talk/graph_edges.py rename to src/wolfharness/talk/graph_edges.py index 27bd57da0..109b3fe1b 100644 --- a/src/agentpool/talk/graph_edges.py +++ b/src/wolfharness/talk/graph_edges.py @@ -1,7 +1,7 @@ """Translate Talk configuration into GraphBuilder edges and Path transforms. This module provides :class:`TalkEdgeTranslator`, which converts AgentPool -:class:`~agentpool.talk.Talk` instances into ``pydantic-graph`` +:class:`~wolfharness.talk.Talk` instances into ``pydantic-graph`` :class:`~pydantic_graph.paths.EdgePath` objects. Key mappings: @@ -25,7 +25,7 @@ from pydantic_graph.paths import TransformFunction from pydantic_graph.step import StepContext # noqa: TC002 -from agentpool.utils.inspection import is_async_callable +from wolfharness.utils.inspection import is_async_callable if TYPE_CHECKING: @@ -36,8 +36,8 @@ from pydantic_graph.paths import EdgePath from pydantic_graph.step import Step - from agentpool.messaging import MessageNode - from agentpool.talk import Talk + from wolfharness.messaging import MessageNode + from wolfharness.talk import Talk # --------------------------------------------------------------------------- @@ -94,7 +94,7 @@ def _make_sync_matches( """ def _matches(inputs: Any) -> bool: - from agentpool.talk.registry import EventContext + from wolfharness.talk.registry import EventContext ctx = EventContext( message=inputs, @@ -116,7 +116,7 @@ def _matches(inputs: Any) -> bool: @dataclass class TalkEdgeTranslator: - """Translates :class:`~agentpool.talk.Talk` connections into graph edges. + """Translates :class:`~wolfharness.talk.Talk` connections into graph edges. Attributes: builder: The :class:`GraphBuilder` receiving translated edges. @@ -244,7 +244,7 @@ def _build_transform_step(self, talk: Talk[Any]) -> Step: assert transform_fn is not None async def _transform_step(ctx: StepContext) -> Any: - from agentpool.utils.inspection import execute + from wolfharness.utils.inspection import execute return await execute(transform_fn, ctx.inputs) @@ -359,8 +359,8 @@ def _build_async_condition_step( """Create a :class:`Step` that evaluates an async condition.""" async def _eval_step(ctx: StepContext) -> _ConditionResult: - from agentpool.talk.registry import EventContext - from agentpool.utils.inspection import execute + from wolfharness.talk.registry import EventContext + from wolfharness.utils.inspection import execute # Evaluate against the first target (stop/exit are "any target") event_ctx: EventContext[Any] = EventContext( @@ -427,8 +427,8 @@ def _build_async_filter_step( """Create a :class:`Step` that evaluates an async filter condition.""" async def _eval_filter(ctx: StepContext) -> _ConditionResult: - from agentpool.talk.registry import EventContext - from agentpool.utils.inspection import execute + from wolfharness.talk.registry import EventContext + from wolfharness.utils.inspection import execute event_ctx: EventContext[Any] = EventContext( message=ctx.inputs, diff --git a/src/agentpool/talk/registry.py b/src/wolfharness/talk/registry.py similarity index 91% rename from src/agentpool/talk/registry.py rename to src/wolfharness/talk/registry.py index 23144906e..20199422c 100644 --- a/src/agentpool/talk/registry.py +++ b/src/wolfharness/talk/registry.py @@ -7,16 +7,16 @@ from anyenv.signals import Signal -from agentpool.log import get_logger -from agentpool.talk.talk import Talk -from agentpool.utils.baseregistry import AgentPoolError, BaseRegistry +from wolfharness.log import get_logger +from wolfharness.talk.talk import Talk +from wolfharness.utils.baseregistry import AgentPoolError, BaseRegistry if TYPE_CHECKING: - from agentpool import MessageNode - from agentpool.messaging import ChatMessage - from agentpool.talk.stats import TalkStats - from agentpool_config.conditions import ConnectionCondition + from wolfharness import MessageNode + from wolfharness.messaging import ChatMessage + from wolfharness.talk.stats import TalkStats + from wolfharness_config.conditions import ConnectionCondition logger = get_logger(__name__) diff --git a/src/agentpool/talk/stats.py b/src/wolfharness/talk/stats.py similarity index 96% rename from src/agentpool/talk/stats.py rename to src/wolfharness/talk/stats.py index 9915abe54..882c0c2bb 100644 --- a/src/agentpool/talk/stats.py +++ b/src/wolfharness/talk/stats.py @@ -6,15 +6,15 @@ from functools import cached_property from typing import TYPE_CHECKING, Any -from agentpool.utils.time_utils import get_now +from wolfharness.utils.time_utils import get_now if TYPE_CHECKING: from collections.abc import MutableSequence, Sequence from datetime import datetime - from agentpool.messaging.messages import ChatMessage, FormatStyle - from agentpool.tools import ToolCallInfo + from wolfharness.messaging.messages import ChatMessage, FormatStyle + from wolfharness.tools import ToolCallInfo @dataclass(frozen=True, kw_only=True) diff --git a/src/agentpool/talk/talk.py b/src/wolfharness/talk/talk.py similarity index 95% rename from src/agentpool/talk/talk.py rename to src/wolfharness/talk/talk.py index ae7674842..91e372b7b 100644 --- a/src/agentpool/talk/talk.py +++ b/src/wolfharness/talk/talk.py @@ -10,11 +10,11 @@ from anyenv.signals import Signal -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage -from agentpool.talk.stats import AggregatedTalkStats, TalkStats -from agentpool.utils.inspection import execute -from agentpool.utils.time_utils import get_now +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage +from wolfharness.talk.stats import AggregatedTalkStats, TalkStats +from wolfharness.utils.inspection import execute +from wolfharness.utils.time_utils import get_now if TYPE_CHECKING: @@ -23,17 +23,17 @@ from evented.event_data import EventData - from agentpool.common_types import ( + from wolfharness.common_types import ( AnyFilterFn, AnyTransformFn, ProcessorCallback, PromptCompatible, QueueStrategy, ) - from agentpool.messaging import MessageNode - from agentpool.messaging.events import ConnectionEventData - from agentpool_config.events import ConnectionEventType - from agentpool_config.forward_targets import ConnectionType + from wolfharness.messaging import MessageNode + from wolfharness.messaging.events import ConnectionEventData + from wolfharness_config.events import ConnectionEventType + from wolfharness_config.forward_targets import ConnectionType logger = get_logger(__name__) @@ -153,8 +153,8 @@ def __rshift__( connection >> other_agent # Connect to single agent connection >> (agent2 & agent3) # Connect to group """ - from agentpool import Agent, MessageNode - from agentpool.talk import TeamTalk + from wolfharness import Agent, MessageNode + from wolfharness.talk import TeamTalk match other: case Callable(): # ty: ignore[invalid-match-pattern] @@ -180,7 +180,7 @@ async def _evaluate_condition( default_return: bool = False, ) -> bool: """Evaluate a condition with flexible parameter handling.""" - from agentpool.talk.registry import EventContext + from wolfharness.talk.registry import EventContext if not condition: return default_return @@ -201,7 +201,7 @@ def on_event( callback: Callable[[ConnectionEventData[TTransmittedData]], Awaitable[None] | None], ) -> Self: """Register callback for connection events.""" - from agentpool.messaging.events import ConnectionEventData + from wolfharness.messaging.events import ConnectionEventData async def wrapped_callback(event: EventData) -> None: if isinstance(event, ConnectionEventData) and event.event_type == event_type: @@ -215,7 +215,7 @@ async def _emit_connection_event( event_type: ConnectionEventType, message: ChatMessage[TTransmittedData] | None, ) -> None: - from agentpool.messaging.events import ConnectionEventData + from wolfharness.messaging.events import ConnectionEventData event = ConnectionEventData[Any]( connection=self, @@ -302,8 +302,8 @@ async def _process_for_target( prompt: PromptCompatible | None = None, ) -> ChatMessage[Any] | None: """Process message for a single target.""" - from agentpool.agents.base_agent import BaseAgent - from agentpool.delegation.base_team import BaseTeam + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.delegation.base_team import BaseTeam match self.connection_type: case "run": @@ -482,8 +482,8 @@ def __rshift__( connection >> other_agent # Connect to single agent connection >> (agent2 & agent3) # Connect to group """ - from agentpool import Agent, MessageNode - from agentpool.talk import TeamTalk + from wolfharness import Agent, MessageNode + from wolfharness.talk import TeamTalk match other: case Callable(): # ty: ignore[invalid-match-pattern] diff --git a/src/agentpool/tasks/__init__.py b/src/wolfharness/tasks/__init__.py similarity index 74% rename from src/agentpool/tasks/__init__.py rename to src/wolfharness/tasks/__init__.py index 9a84b4606..71a9685af 100644 --- a/src/agentpool/tasks/__init__.py +++ b/src/wolfharness/tasks/__init__.py @@ -1,6 +1,6 @@ """Task management.""" -from agentpool.tasks.exceptions import ( +from wolfharness.tasks.exceptions import ( JobError, ToolSkippedError, RunAbortedError, @@ -8,7 +8,7 @@ JobRegistrationError, ) -from agentpool.tasks.registry import TaskRegistry +from wolfharness.tasks.registry import TaskRegistry __all__ = [ "ChainAbortedError", diff --git a/src/agentpool/tasks/exceptions.py b/src/wolfharness/tasks/exceptions.py similarity index 88% rename from src/agentpool/tasks/exceptions.py rename to src/wolfharness/tasks/exceptions.py index 6ce600066..8a543bc8c 100644 --- a/src/agentpool/tasks/exceptions.py +++ b/src/wolfharness/tasks/exceptions.py @@ -2,7 +2,7 @@ from __future__ import annotations -from agentpool.utils.baseregistry import AgentPoolError +from wolfharness.utils.baseregistry import AgentPoolError class JobError(AgentPoolError): diff --git a/src/agentpool/tasks/registry.py b/src/wolfharness/tasks/registry.py similarity index 79% rename from src/agentpool/tasks/registry.py rename to src/wolfharness/tasks/registry.py index 9ccfdf2d4..e531525c7 100644 --- a/src/agentpool/tasks/registry.py +++ b/src/wolfharness/tasks/registry.py @@ -4,9 +4,9 @@ from typing import Any -from agentpool.tasks.exceptions import JobRegistrationError -from agentpool.utils.baseregistry import BaseRegistry -from agentpool_config.task import Job +from wolfharness.tasks.exceptions import JobRegistrationError +from wolfharness.utils.baseregistry import BaseRegistry +from wolfharness_config.task import Job class TaskRegistry(BaseRegistry[str, Job[Any, Any]]): @@ -17,7 +17,7 @@ def _error_class(self) -> type[JobRegistrationError]: return JobRegistrationError def _validate_item(self, item: Any) -> Job[Any, Any]: - from agentpool_config.task import Job + from wolfharness_config.task import Job if not isinstance(item, Job): raise self._error_class(f"Expected Job, got {type(item)}") diff --git a/src/agentpool/testing.py b/src/wolfharness/testing.py similarity index 98% rename from src/agentpool/testing.py rename to src/wolfharness/testing.py index aaafc50c2..3293e83c4 100644 --- a/src/agentpool/testing.py +++ b/src/wolfharness/testing.py @@ -1,7 +1,7 @@ """Testing utilities for end-to-end ACP testing and CI integration. This module provides: -- A lightweight test harness for running end-to-end tests against the agentpool +- A lightweight test harness for running end-to-end tests against the wolfharness ACP server using ACPAgent as the client - GitHub CI integration for programmatically triggering and monitoring workflow runs @@ -39,8 +39,8 @@ async def test_commit_in_ci(): from evented_config import EventConfig - from agentpool.agents.acp_agent import ACPAgent - from agentpool.common_types import AnyEventHandlerType + from wolfharness.agents.acp_agent import ACPAgent + from wolfharness.common_types import AnyEventHandlerType @asynccontextmanager @@ -56,9 +56,9 @@ async def acp_test_session( event_configs: Sequence[EventConfig] | None = None, event_handlers: Sequence[AnyEventHandlerType] | None = None, ) -> AsyncIterator[ACPAgent[Any]]: - """Create an end-to-end ACP test session using agentpool as server. + """Create an end-to-end ACP test session using wolfharness as server. - This context manager starts an ACPAgent connected to a agentpool serve-acp + This context manager starts an ACPAgent connected to a wolfharness serve-acp subprocess, enabling full round-trip testing of the ACP protocol. Args: @@ -85,10 +85,10 @@ async def test_echo(): assert "Hello" in result.content ``` """ - from agentpool.agents.acp_agent import ACPAgent + from wolfharness.agents.acp_agent import ACPAgent # Build command line arguments - args = ["run", "agentpool", "serve-acp"] + args = ["run", "wolfharness", "serve-acp"] if config is not None: args.extend(["--config", str(config)]) diff --git a/src/agentpool/text_templates/__init__.py b/src/wolfharness/text_templates/__init__.py similarity index 93% rename from src/agentpool/text_templates/__init__.py rename to src/wolfharness/text_templates/__init__.py index d2beaa9fa..6b7069951 100644 --- a/src/agentpool/text_templates/__init__.py +++ b/src/wolfharness/text_templates/__init__.py @@ -6,7 +6,7 @@ from functools import cache from typing import Final, Literal -_RESOURCES = importlib.resources.files("agentpool.text_templates") +_RESOURCES = importlib.resources.files("wolfharness.text_templates") DEFAULT_SYSTEM_PROMPT: Final[str] = str(_RESOURCES / "system_prompt.jinja") """Path to the default system prompt template.""" diff --git a/src/agentpool/text_templates/system_prompt.jinja b/src/wolfharness/text_templates/system_prompt.jinja similarity index 100% rename from src/agentpool/text_templates/system_prompt.jinja rename to src/wolfharness/text_templates/system_prompt.jinja diff --git a/src/agentpool/text_templates/tool_call_default.jinja b/src/wolfharness/text_templates/tool_call_default.jinja similarity index 100% rename from src/agentpool/text_templates/tool_call_default.jinja rename to src/wolfharness/text_templates/tool_call_default.jinja diff --git a/src/agentpool/text_templates/tool_call_markdown.jinja b/src/wolfharness/text_templates/tool_call_markdown.jinja similarity index 100% rename from src/agentpool/text_templates/tool_call_markdown.jinja rename to src/wolfharness/text_templates/tool_call_markdown.jinja diff --git a/src/agentpool/text_templates/tool_call_simple.jinja b/src/wolfharness/text_templates/tool_call_simple.jinja similarity index 100% rename from src/agentpool/text_templates/tool_call_simple.jinja rename to src/wolfharness/text_templates/tool_call_simple.jinja diff --git a/src/agentpool/tool_impls/__init__.py b/src/wolfharness/tool_impls/__init__.py similarity index 100% rename from src/agentpool/tool_impls/__init__.py rename to src/wolfharness/tool_impls/__init__.py diff --git a/src/agentpool/tool_impls/agent_cli/__init__.py b/src/wolfharness/tool_impls/agent_cli/__init__.py similarity index 89% rename from src/agentpool/tool_impls/agent_cli/__init__.py rename to src/wolfharness/tool_impls/agent_cli/__init__.py index bd67797b8..7acdbfef1 100644 --- a/src/agentpool/tool_impls/agent_cli/__init__.py +++ b/src/wolfharness/tool_impls/agent_cli/__init__.py @@ -4,8 +4,8 @@ from typing import Literal -from agentpool.tool_impls.agent_cli.tool import AgentCliTool -from agentpool_config.tools import ToolHints +from wolfharness.tool_impls.agent_cli.tool import AgentCliTool +from wolfharness_config.tools import ToolHints __all__ = ["AgentCliTool", "create_agent_cli_tool"] diff --git a/src/agentpool/tool_impls/agent_cli/tool.py b/src/wolfharness/tool_impls/agent_cli/tool.py similarity index 96% rename from src/agentpool/tool_impls/agent_cli/tool.py rename to src/wolfharness/tool_impls/agent_cli/tool.py index c29880b32..866e0a1a5 100644 --- a/src/agentpool/tool_impls/agent_cli/tool.py +++ b/src/wolfharness/tool_impls/agent_cli/tool.py @@ -6,8 +6,8 @@ from io import StringIO from typing import TYPE_CHECKING -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.tools.base import Tool +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.tools.base import Tool if TYPE_CHECKING: diff --git a/src/agentpool/tool_impls/bash/__init__.py b/src/wolfharness/tool_impls/bash/__init__.py similarity index 94% rename from src/agentpool/tool_impls/bash/__init__.py rename to src/wolfharness/tool_impls/bash/__init__.py index c0781cae1..9356caa69 100644 --- a/src/agentpool/tool_impls/bash/__init__.py +++ b/src/wolfharness/tool_impls/bash/__init__.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING, Literal -from agentpool.tool_impls.bash.tool import BashTool -from agentpool_config.tools import ToolHints +from wolfharness.tool_impls.bash.tool import BashTool +from wolfharness_config.tools import ToolHints if TYPE_CHECKING: diff --git a/src/agentpool/tool_impls/bash/helpers.py b/src/wolfharness/tool_impls/bash/helpers.py similarity index 100% rename from src/agentpool/tool_impls/bash/helpers.py rename to src/wolfharness/tool_impls/bash/helpers.py diff --git a/src/agentpool/tool_impls/bash/tool.py b/src/wolfharness/tool_impls/bash/tool.py similarity index 97% rename from src/agentpool/tool_impls/bash/tool.py rename to src/wolfharness/tool_impls/bash/tool.py index 6fdb97e4b..5af9184ec 100644 --- a/src/agentpool/tool_impls/bash/tool.py +++ b/src/wolfharness/tool_impls/bash/tool.py @@ -14,10 +14,10 @@ ProcessStartedEvent, ) -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.log import get_logger -from agentpool.tool_impls.bash.helpers import format_output, truncate_output -from agentpool.tools.base import Tool, ToolResult +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness.tool_impls.bash.helpers import format_output, truncate_output +from wolfharness.tools.base import Tool, ToolResult if TYPE_CHECKING: diff --git a/src/agentpool/tool_impls/delete_path/__init__.py b/src/wolfharness/tool_impls/delete_path/__init__.py similarity index 93% rename from src/agentpool/tool_impls/delete_path/__init__.py rename to src/wolfharness/tool_impls/delete_path/__init__.py index 97eb9e03f..2f71feee4 100644 --- a/src/agentpool/tool_impls/delete_path/__init__.py +++ b/src/wolfharness/tool_impls/delete_path/__init__.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING, Literal -from agentpool.tool_impls.delete_path.tool import DeletePathTool -from agentpool_config.tools import ToolHints +from wolfharness.tool_impls.delete_path.tool import DeletePathTool +from wolfharness_config.tools import ToolHints if TYPE_CHECKING: diff --git a/src/agentpool/tool_impls/delete_path/tool.py b/src/wolfharness/tool_impls/delete_path/tool.py similarity index 96% rename from src/agentpool/tool_impls/delete_path/tool.py rename to src/wolfharness/tool_impls/delete_path/tool.py index bb9f85d39..a4f0dd70c 100644 --- a/src/agentpool/tool_impls/delete_path/tool.py +++ b/src/wolfharness/tool_impls/delete_path/tool.py @@ -6,9 +6,9 @@ from pathlib import Path from typing import TYPE_CHECKING, Any -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.log import get_logger -from agentpool.tools.base import Tool +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness.tools.base import Tool if TYPE_CHECKING: diff --git a/src/agentpool/tool_impls/download_file/__init__.py b/src/wolfharness/tool_impls/download_file/__init__.py similarity index 94% rename from src/agentpool/tool_impls/download_file/__init__.py rename to src/wolfharness/tool_impls/download_file/__init__.py index b337772ae..194c4c1e6 100644 --- a/src/agentpool/tool_impls/download_file/__init__.py +++ b/src/wolfharness/tool_impls/download_file/__init__.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING, Literal -from agentpool.tool_impls.download_file.tool import DownloadFileTool -from agentpool_config.tools import ToolHints +from wolfharness.tool_impls.download_file.tool import DownloadFileTool +from wolfharness_config.tools import ToolHints if TYPE_CHECKING: diff --git a/src/agentpool/tool_impls/download_file/tool.py b/src/wolfharness/tool_impls/download_file/tool.py similarity index 97% rename from src/agentpool/tool_impls/download_file/tool.py rename to src/wolfharness/tool_impls/download_file/tool.py index 708142500..246dd96a3 100644 --- a/src/agentpool/tool_impls/download_file/tool.py +++ b/src/wolfharness/tool_impls/download_file/tool.py @@ -10,9 +10,9 @@ import anyio -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.log import get_logger -from agentpool.tools.base import Tool +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness.tools.base import Tool if TYPE_CHECKING: diff --git a/src/agentpool/tool_impls/execute_code/__init__.py b/src/wolfharness/tool_impls/execute_code/__init__.py similarity index 92% rename from src/agentpool/tool_impls/execute_code/__init__.py rename to src/wolfharness/tool_impls/execute_code/__init__.py index 810720d9a..e12ae58ca 100644 --- a/src/agentpool/tool_impls/execute_code/__init__.py +++ b/src/wolfharness/tool_impls/execute_code/__init__.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING, Literal -from agentpool.tool_impls.execute_code.tool import ExecuteCodeTool -from agentpool_config.tools import ToolHints +from wolfharness.tool_impls.execute_code.tool import ExecuteCodeTool +from wolfharness_config.tools import ToolHints if TYPE_CHECKING: diff --git a/src/agentpool/tool_impls/execute_code/tool.py b/src/wolfharness/tool_impls/execute_code/tool.py similarity index 97% rename from src/agentpool/tool_impls/execute_code/tool.py rename to src/wolfharness/tool_impls/execute_code/tool.py index 03cc222e7..09f0936eb 100644 --- a/src/agentpool/tool_impls/execute_code/tool.py +++ b/src/wolfharness/tool_impls/execute_code/tool.py @@ -15,9 +15,9 @@ ProcessStartedEvent, ) -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.log import get_logger -from agentpool.tools.base import Tool +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness.tools.base import Tool if TYPE_CHECKING: diff --git a/src/agentpool/tool_impls/grep/__init__.py b/src/wolfharness/tool_impls/grep/__init__.py similarity index 95% rename from src/agentpool/tool_impls/grep/__init__.py rename to src/wolfharness/tool_impls/grep/__init__.py index 25ec48242..7b7a23381 100644 --- a/src/agentpool/tool_impls/grep/__init__.py +++ b/src/wolfharness/tool_impls/grep/__init__.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING, Literal -from agentpool.tool_impls.grep.tool import GrepTool -from agentpool_config.tools import ToolHints +from wolfharness.tool_impls.grep.tool import GrepTool +from wolfharness_config.tools import ToolHints if TYPE_CHECKING: diff --git a/src/agentpool/tool_impls/grep/tool.py b/src/wolfharness/tool_impls/grep/tool.py similarity index 94% rename from src/agentpool/tool_impls/grep/tool.py rename to src/wolfharness/tool_impls/grep/tool.py index 38dd659da..9527bfb84 100644 --- a/src/agentpool/tool_impls/grep/tool.py +++ b/src/wolfharness/tool_impls/grep/tool.py @@ -6,9 +6,9 @@ from pathlib import Path from typing import TYPE_CHECKING, Any -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.log import get_logger -from agentpool.tools.base import Tool, ToolResult +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness.tools.base import Tool, ToolResult if TYPE_CHECKING: @@ -17,7 +17,7 @@ from exxec import ExecutionEnvironment from fsspec.asyn import AsyncFileSystem - from agentpool_toolsets.fsspec_toolset.grep import GrepBackend + from wolfharness_toolsets.fsspec_toolset.grep import GrepBackend logger = get_logger(__name__) @@ -100,7 +100,7 @@ async def _grep( Returns: Grep results as formatted text """ - from agentpool_toolsets.fsspec_toolset.grep import ( + from wolfharness_toolsets.fsspec_toolset.grep import ( DEFAULT_EXCLUDE_PATTERNS, detect_grep_backend, grep_with_fsspec, @@ -172,7 +172,7 @@ async def _grep( output += "\n\n[Results truncated]" # Emit formatted content for UI display - from agentpool.agents.events import TextContentItem + from wolfharness.agents.events import TextContentItem await ctx.events.tool_call_progress( title=f"Found {match_count} matches", diff --git a/src/agentpool/tool_impls/list_directory/__init__.py b/src/wolfharness/tool_impls/list_directory/__init__.py similarity index 94% rename from src/agentpool/tool_impls/list_directory/__init__.py rename to src/wolfharness/tool_impls/list_directory/__init__.py index 8374a1bf0..c38201710 100644 --- a/src/agentpool/tool_impls/list_directory/__init__.py +++ b/src/wolfharness/tool_impls/list_directory/__init__.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING, Literal -from agentpool.tool_impls.list_directory.tool import ListDirectoryTool -from agentpool_config.tools import ToolHints +from wolfharness.tool_impls.list_directory.tool import ListDirectoryTool +from wolfharness_config.tools import ToolHints if TYPE_CHECKING: diff --git a/src/agentpool/tool_impls/list_directory/tool.py b/src/wolfharness/tool_impls/list_directory/tool.py similarity index 95% rename from src/agentpool/tool_impls/list_directory/tool.py rename to src/wolfharness/tool_impls/list_directory/tool.py index c28c5f502..d3c7f0a5d 100644 --- a/src/agentpool/tool_impls/list_directory/tool.py +++ b/src/wolfharness/tool_impls/list_directory/tool.py @@ -10,9 +10,9 @@ from upathtools import is_directory -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.log import get_logger -from agentpool.tools.base import Tool, ToolResult +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness.tools.base import Tool, ToolResult if TYPE_CHECKING: @@ -94,7 +94,7 @@ async def _list_directory( Returns: Markdown-formatted directory listing """ - from agentpool_toolsets.fsspec_toolset.helpers import format_directory_listing + from wolfharness_toolsets.fsspec_toolset.helpers import format_directory_listing path = self._resolve_path(path, ctx) msg = f"Listing directory: {path}" @@ -164,7 +164,7 @@ async def _list_directory( await ctx.events.file_operation("list", path=path, success=True) result = format_directory_listing(path, dirs, files, pattern) # Emit formatted content for UI display - from agentpool.agents.events import TextContentItem + from wolfharness.agents.events import TextContentItem await ctx.events.tool_call_progress( title=f"Listed: {path}", diff --git a/src/agentpool/tool_impls/question/__init__.py b/src/wolfharness/tool_impls/question/__init__.py similarity index 90% rename from src/agentpool/tool_impls/question/__init__.py rename to src/wolfharness/tool_impls/question/__init__.py index 012dd292a..e33a8b76e 100644 --- a/src/agentpool/tool_impls/question/__init__.py +++ b/src/wolfharness/tool_impls/question/__init__.py @@ -4,8 +4,8 @@ from typing import Literal -from agentpool.tool_impls.question.tool import QuestionTool -from agentpool_config.tools import ToolHints +from wolfharness.tool_impls.question.tool import QuestionTool +from wolfharness_config.tools import ToolHints __all__ = ["QuestionTool", "create_question_tool"] diff --git a/src/agentpool/tool_impls/question/tool.py b/src/wolfharness/tool_impls/question/tool.py similarity index 95% rename from src/agentpool/tool_impls/question/tool.py rename to src/wolfharness/tool_impls/question/tool.py index 3b697b3bf..e078f579f 100644 --- a/src/agentpool/tool_impls/question/tool.py +++ b/src/wolfharness/tool_impls/question/tool.py @@ -7,9 +7,9 @@ from pydantic_ai import ModelRetry -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.tasks.exceptions import RunAbortedError -from agentpool.tools.base import Tool, ToolResult +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.tasks.exceptions import RunAbortedError +from wolfharness.tools.base import Tool, ToolResult if TYPE_CHECKING: diff --git a/src/agentpool/tool_impls/read/__init__.py b/src/wolfharness/tool_impls/read/__init__.py similarity index 92% rename from src/agentpool/tool_impls/read/__init__.py rename to src/wolfharness/tool_impls/read/__init__.py index 928f188e5..5d06a561c 100644 --- a/src/agentpool/tool_impls/read/__init__.py +++ b/src/wolfharness/tool_impls/read/__init__.py @@ -4,14 +4,14 @@ from typing import TYPE_CHECKING, Literal -from agentpool.tool_impls.read.tool import ReadTool -from agentpool_config.tools import ToolHints +from wolfharness.tool_impls.read.tool import ReadTool +from wolfharness_config.tools import ToolHints if TYPE_CHECKING: from exxec import ExecutionEnvironment - from agentpool.prompts.conversion_manager import ConversionManager + from wolfharness.prompts.conversion_manager import ConversionManager __all__ = ["ReadTool", "create_read_tool"] @@ -82,7 +82,7 @@ def create_read_tool( ) # With converter for automatic markdown conversion - from agentpool.prompts.conversion_manager import ConversionManager + from wolfharness.prompts.conversion_manager import ConversionManager read = create_read_tool( converter=ConversionManager(), ) diff --git a/src/agentpool/tool_impls/read/tool.py b/src/wolfharness/tool_impls/read/tool.py similarity index 94% rename from src/agentpool/tool_impls/read/tool.py rename to src/wolfharness/tool_impls/read/tool.py index 66cd2de38..9af980606 100644 --- a/src/agentpool/tool_impls/read/tool.py +++ b/src/wolfharness/tool_impls/read/tool.py @@ -8,10 +8,10 @@ from pydantic_ai import BinaryContent -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.log import get_logger -from agentpool.mime_utils import guess_type, is_binary_content, is_binary_mime -from agentpool.tools.base import Tool, ToolResult +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness.mime_utils import guess_type, is_binary_content, is_binary_mime +from wolfharness.tools.base import Tool, ToolResult if TYPE_CHECKING: @@ -20,7 +20,7 @@ from exxec import ExecutionEnvironment from fsspec.asyn import AsyncFileSystem - from agentpool.prompts.conversion_manager import ConversionManager + from wolfharness.prompts.conversion_manager import ConversionManager logger = get_logger(__name__) @@ -103,7 +103,7 @@ async def _get_file_map( Returns: Structure map or None if language not supported """ - from agentpool.repomap import generate_file_outline + from wolfharness.repomap import generate_file_outline # Use centralized outline generation fs = self._get_fs(ctx) @@ -132,10 +132,10 @@ async def _read( # noqa: PLR0911, PLR0915 Text content for text files, BinaryContent for binary files (with optional dimension note as list when image was resized), or error string """ - from agentpool.agents.events import FileContentItem, LocationContentItem - from agentpool.repomap import truncate_with_notice - from agentpool_toolsets.fsspec_toolset.helpers import truncate_lines - from agentpool_toolsets.fsspec_toolset.image_utils import resize_image_if_needed + from wolfharness.agents.events import FileContentItem, LocationContentItem + from wolfharness.repomap import truncate_with_notice + from wolfharness_toolsets.fsspec_toolset.helpers import truncate_lines + from wolfharness_toolsets.fsspec_toolset.image_utils import resize_image_if_needed path = self._resolve_path(path, ctx) msg = f"Reading file: {path}" diff --git a/src/agentpool/tools/__init__.py b/src/wolfharness/tools/__init__.py similarity index 70% rename from src/agentpool/tools/__init__.py rename to src/wolfharness/tools/__init__.py index 8e0fe3fb7..6079f2ae3 100644 --- a/src/agentpool/tools/__init__.py +++ b/src/wolfharness/tools/__init__.py @@ -9,10 +9,10 @@ from pydantic_ai.exceptions import ApprovalRequired, CallDeferred -from agentpool.tools.base import FunctionTool, Tool -from agentpool.tools.exceptions import ToolError -from agentpool.tools.tool_call_info import ToolCallInfo -from agentpool.skills.registry import SkillsRegistry +from wolfharness.tools.base import FunctionTool, Tool +from wolfharness.tools.exceptions import ToolError +from wolfharness.tools.tool_call_info import ToolCallInfo +from wolfharness.skills.registry import SkillsRegistry __all__ = [ "ApprovalRequired", diff --git a/src/agentpool/tools/base.py b/src/wolfharness/tools/base.py similarity index 98% rename from src/agentpool/tools/base.py rename to src/wolfharness/tools/base.py index 2a0a39c1e..a6b823e66 100644 --- a/src/agentpool/tools/base.py +++ b/src/wolfharness/tools/base.py @@ -13,15 +13,15 @@ from pydantic_ai.tools import Tool as PydanticAiTool import schemez -from agentpool.log import get_logger -from agentpool.tools.exceptions import ToolError -from agentpool.utils.inspection import ( +from wolfharness.log import get_logger +from wolfharness.tools.exceptions import ToolError +from wolfharness.utils.inspection import ( dataclasses_no_defaults_repr, execute, get_fn_name, get_fn_qualname, ) -from agentpool_config.tools import ToolHints +from wolfharness_config.tools import ToolHints if TYPE_CHECKING: @@ -29,7 +29,7 @@ from pydantic_ai import RunContext - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext if TYPE_CHECKING: @@ -40,7 +40,7 @@ from pydantic_ai.tools import ToolDefinition from schemez import FunctionSchema, Property - from agentpool.common_types import ToolSource + from wolfharness.common_types import ToolSource # Tool state filter type ToolState = Literal["all", "enabled", "disabled"] @@ -59,7 +59,7 @@ "other", ] -TERMINAL_TOOL_METADATA_KEY = "agentpool_terminal" +TERMINAL_TOOL_METADATA_KEY = "wolfharness_terminal" _TERMINAL_TOOL_TRUE_VALUES = frozenset({"1", "true", "yes", "on"}) @@ -406,7 +406,7 @@ def apply_schema_override(base_schema: dict[str, Any]) -> dict[str, Any]: # Fallback: use schemez to generate schema from pydantic_ai import RunContext - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext # Use schema_override description if provided, otherwise use self.description desc = ( @@ -496,7 +496,7 @@ def schema_obj(self) -> FunctionSchema: """Get the OpenAI function schema for the tool.""" from pydantic_ai import RunContext - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext return schemez.create_schema( self.get_callable(), @@ -858,7 +858,7 @@ def from_callable( """Create a FunctionTool from a callable or import path string.""" if isinstance(fn, str): import_path = fn - from agentpool.utils import importing + from wolfharness.utils import importing callable_obj = importing.import_callable(fn) name = getattr(callable_obj, "__name__", "unknown") diff --git a/src/agentpool/tools/exceptions.py b/src/wolfharness/tools/exceptions.py similarity index 69% rename from src/agentpool/tools/exceptions.py rename to src/wolfharness/tools/exceptions.py index d46100c54..35d62428f 100644 --- a/src/agentpool/tools/exceptions.py +++ b/src/wolfharness/tools/exceptions.py @@ -2,7 +2,7 @@ from __future__ import annotations -from agentpool.utils.baseregistry import AgentPoolError +from wolfharness.utils.baseregistry import AgentPoolError class ToolError(AgentPoolError): diff --git a/src/agentpool/tools/tool_call_info.py b/src/wolfharness/tools/tool_call_info.py similarity index 93% rename from src/agentpool/tools/tool_call_info.py rename to src/wolfharness/tools/tool_call_info.py index c78c1aca1..2e7e853fc 100644 --- a/src/agentpool/tools/tool_call_info.py +++ b/src/wolfharness/tools/tool_call_info.py @@ -9,12 +9,12 @@ from pydantic import Field from schemez import Schema -from agentpool.text_templates import get_tool_call_template -from agentpool.utils.time_utils import get_now +from wolfharness.text_templates import get_tool_call_template +from wolfharness.utils.time_utils import get_now if TYPE_CHECKING: - from agentpool.text_templates import FormatStyle + from wolfharness.text_templates import FormatStyle class ToolCallInfo(Schema): diff --git a/src/agentpool/tools/tool_wrapping.py b/src/wolfharness/tools/tool_wrapping.py similarity index 96% rename from src/agentpool/tools/tool_wrapping.py rename to src/wolfharness/tools/tool_wrapping.py index 16ccd7be5..6f50aacb8 100644 --- a/src/agentpool/tools/tool_wrapping.py +++ b/src/wolfharness/tools/tool_wrapping.py @@ -22,8 +22,8 @@ if TYPE_CHECKING: - from agentpool.agents.context import AgentContext - from agentpool.tools.base import Tool + from wolfharness.agents.context import AgentContext + from wolfharness.tools.base import Tool def wrap_tool_for_pydantic_ai(tool: Tool[Any]) -> Any: @@ -34,7 +34,7 @@ def wrap_tool_for_pydantic_ai(tool: Tool[Any]) -> Any: accepts ``RunContext`` (which carries ``AgentContext`` in ``deps``) and injects the ``AgentContext`` into the original tool call. """ - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext original_fn = tool.get_callable() sig = inspect.signature(original_fn) diff --git a/src/agentpool/ui/__init__.py b/src/wolfharness/ui/__init__.py similarity index 51% rename from src/agentpool/ui/__init__.py rename to src/wolfharness/ui/__init__.py index c40770ec5..77cf2e549 100644 --- a/src/agentpool/ui/__init__.py +++ b/src/wolfharness/ui/__init__.py @@ -1,2 +1,2 @@ -# src/agentpool/interfaces/__init__.py +# src/wolfharness/interfaces/__init__.py """Interface definitions for AgentPool.""" diff --git a/src/agentpool/ui/base.py b/src/wolfharness/ui/base.py similarity index 96% rename from src/agentpool/ui/base.py rename to src/wolfharness/ui/base.py index 360741ac7..11f405e24 100644 --- a/src/agentpool/ui/base.py +++ b/src/wolfharness/ui/base.py @@ -12,8 +12,8 @@ from mcp import types from pydantic import BaseModel - from agentpool.agents.context import AgentContext, ConfirmationResult - from agentpool.messaging.context import NodeContext + from wolfharness.agents.context import AgentContext, ConfirmationResult + from wolfharness.messaging.context import NodeContext class InputProvider(ABC): diff --git a/src/agentpool/ui/elicitation.py b/src/wolfharness/ui/elicitation.py similarity index 99% rename from src/agentpool/ui/elicitation.py rename to src/wolfharness/ui/elicitation.py index 0deceb522..456c1fc07 100644 --- a/src/agentpool/ui/elicitation.py +++ b/src/wolfharness/ui/elicitation.py @@ -1,6 +1,6 @@ """Elicitation types for user interaction requests. -These are agentpool's internal representation of elicitation requests, +These are wolfharness's internal representation of elicitation requests, independent of MCP or any other protocol. Adapters convert to/from protocol-specific formats. @@ -16,7 +16,7 @@ if TYPE_CHECKING: - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext # ============================================================================= diff --git a/src/agentpool/ui/mock_provider.py b/src/wolfharness/ui/mock_provider.py similarity index 92% rename from src/agentpool/ui/mock_provider.py rename to src/wolfharness/ui/mock_provider.py index aba76f4f4..9cb6e9e25 100644 --- a/src/agentpool/ui/mock_provider.py +++ b/src/wolfharness/ui/mock_provider.py @@ -5,14 +5,14 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Any, Literal -from agentpool.ui.base import InputProvider +from wolfharness.ui.base import InputProvider if TYPE_CHECKING: from mcp import types - from agentpool.agents.context import AgentContext, ConfirmationResult - from agentpool.messaging.context import NodeContext + from wolfharness.agents.context import AgentContext, ConfirmationResult + from wolfharness.messaging.context import NodeContext InputMethod = Literal["get_input", "get_tool_confirmation", "get_elicitation"] diff --git a/src/agentpool/ui/stdlib_provider.py b/src/wolfharness/ui/stdlib_provider.py similarity index 94% rename from src/agentpool/ui/stdlib_provider.py rename to src/wolfharness/ui/stdlib_provider.py index 85413c771..e9da7efab 100644 --- a/src/agentpool/ui/stdlib_provider.py +++ b/src/wolfharness/ui/stdlib_provider.py @@ -9,16 +9,16 @@ import anyenv from mcp import types -from agentpool.log import get_logger -from agentpool.tools.exceptions import ToolError -from agentpool.ui.base import InputProvider +from wolfharness.log import get_logger +from wolfharness.tools.exceptions import ToolError +from wolfharness.ui.base import InputProvider if TYPE_CHECKING: from pydantic import BaseModel - from agentpool.agents.context import AgentContext, ConfirmationResult - from agentpool.messaging.context import NodeContext + from wolfharness.agents.context import AgentContext, ConfirmationResult + from wolfharness.messaging.context import NodeContext logger = get_logger(__name__) diff --git a/src/agentpool/utils/__init__.py b/src/wolfharness/utils/__init__.py similarity index 88% rename from src/agentpool/utils/__init__.py rename to src/wolfharness/utils/__init__.py index 7b63ffd29..abbf7399d 100644 --- a/src/agentpool/utils/__init__.py +++ b/src/wolfharness/utils/__init__.py @@ -15,15 +15,15 @@ def setup_env(env: jinja2.Environment) -> None: Args: env: The jinjarope environment to extend """ - from agentpool.agents.native_agent import Agent - from agentpool.functional import ( + from wolfharness.agents.native_agent import Agent + from wolfharness.functional import ( run_agent, run_agent_sync, get_structured, get_structured_multiple, pick_one, ) - from agentpool.jinja_filters import ( + from wolfharness.jinja_filters import ( pydantic_playground, pydantic_playground_iframe, pydantic_playground_link, diff --git a/src/agentpool/utils/baseregistry.py b/src/wolfharness/utils/baseregistry.py similarity index 100% rename from src/agentpool/utils/baseregistry.py rename to src/wolfharness/utils/baseregistry.py diff --git a/src/agentpool/utils/context_wrapping.py b/src/wolfharness/utils/context_wrapping.py similarity index 94% rename from src/agentpool/utils/context_wrapping.py rename to src/wolfharness/utils/context_wrapping.py index cb52a9a9a..6c5683a5e 100644 --- a/src/agentpool/utils/context_wrapping.py +++ b/src/wolfharness/utils/context_wrapping.py @@ -8,7 +8,7 @@ from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -16,9 +16,9 @@ from pydantic_ai import RunContext - from agentpool.prompts.instructions import InstructionFunc + from wolfharness.prompts.instructions import InstructionFunc -from agentpool.utils.inspection import ( +from wolfharness.utils.inspection import ( execute, get_argument_key, get_fn_name, @@ -88,7 +88,7 @@ async def from_run_context(ctx: RunContext) -> str: """ from pydantic_ai import RunContext - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext # Detect which contexts function expects agent_ctx_key = get_argument_key(fn, AgentContext) diff --git a/src/agentpool/utils/count_tokens.py b/src/wolfharness/utils/count_tokens.py similarity index 100% rename from src/agentpool/utils/count_tokens.py rename to src/wolfharness/utils/count_tokens.py diff --git a/src/agentpool/utils/dag.py b/src/wolfharness/utils/dag.py similarity index 100% rename from src/agentpool/utils/dag.py rename to src/wolfharness/utils/dag.py diff --git a/src/agentpool/utils/diffs.py b/src/wolfharness/utils/diffs.py similarity index 100% rename from src/agentpool/utils/diffs.py rename to src/wolfharness/utils/diffs.py diff --git a/src/agentpool/utils/file_watcher.py b/src/wolfharness/utils/file_watcher.py similarity index 99% rename from src/agentpool/utils/file_watcher.py rename to src/wolfharness/utils/file_watcher.py index b726150f5..63d9b40d4 100644 --- a/src/agentpool/utils/file_watcher.py +++ b/src/wolfharness/utils/file_watcher.py @@ -10,7 +10,7 @@ import anyenv -from agentpool import log +from wolfharness import log if TYPE_CHECKING: diff --git a/src/agentpool/utils/identifiers.py b/src/wolfharness/utils/identifiers.py similarity index 99% rename from src/agentpool/utils/identifiers.py rename to src/wolfharness/utils/identifiers.py index eff091074..6119efa1b 100644 --- a/src/agentpool/utils/identifiers.py +++ b/src/wolfharness/utils/identifiers.py @@ -13,7 +13,7 @@ import secrets from typing import Literal -from agentpool.utils.time_utils import now_ms +from wolfharness.utils.time_utils import now_ms PrefixType = Literal["session", "message", "permission", "user", "part", "pty", "call"] diff --git a/src/agentpool/utils/importing.py b/src/wolfharness/utils/importing.py similarity index 100% rename from src/agentpool/utils/importing.py rename to src/wolfharness/utils/importing.py diff --git a/src/agentpool/utils/inspection.py b/src/wolfharness/utils/inspection.py similarity index 98% rename from src/agentpool/utils/inspection.py rename to src/wolfharness/utils/inspection.py index ad78bec7c..fa86c5294 100644 --- a/src/agentpool/utils/inspection.py +++ b/src/wolfharness/utils/inspection.py @@ -24,10 +24,10 @@ if TYPE_CHECKING: from collections.abc import Awaitable, Callable - from agentpool.agents import AgentContext + from wolfharness.agents import AgentContext -PACKAGE_NAME = "agentpool" +PACKAGE_NAME = "wolfharness" def dataclasses_no_defaults_repr(self: Any) -> str: @@ -285,7 +285,7 @@ def call_with_context[T]( - Functions expecting AgentContext - Functions expecting context data """ - from agentpool.agents import AgentContext + from wolfharness.agents import AgentContext if inspect.ismethod(func): if get_argument_key(func, AgentContext): diff --git a/src/agentpool/utils/model_capabilities.py b/src/wolfharness/utils/model_capabilities.py similarity index 100% rename from src/agentpool/utils/model_capabilities.py rename to src/wolfharness/utils/model_capabilities.py diff --git a/src/agentpool/utils/model_helpers.py b/src/wolfharness/utils/model_helpers.py similarity index 98% rename from src/agentpool/utils/model_helpers.py rename to src/wolfharness/utils/model_helpers.py index b9f6eb0ec..1200c6ca0 100644 --- a/src/agentpool/utils/model_helpers.py +++ b/src/wolfharness/utils/model_helpers.py @@ -108,7 +108,7 @@ def _infer_single_model(model: str | Model) -> Model: # noqa: PLR0911 if model.startswith("anthropic-max:"): from pydantic_ai.models.anthropic import AnthropicModel - from agentpool.auth.anthropic_auth import AnthropicMaxProvider + from wolfharness.auth.anthropic_auth import AnthropicMaxProvider provider = AnthropicMaxProvider() model_name = model.removeprefix("anthropic-max:") @@ -130,7 +130,7 @@ def _infer_single_model(model: str | Model) -> Model: # noqa: PLR0911 return OpenAIChatModel(model_name=model_name, provider=prov) if model.startswith("import:"): - from agentpool.utils.importing import import_callable + from wolfharness.utils.importing import import_callable imported = import_callable(model.removeprefix("import:")) return imported() if isinstance(imported, type) else imported # type: ignore[return-value] diff --git a/src/agentpool/utils/network.py b/src/wolfharness/utils/network.py similarity index 100% rename from src/agentpool/utils/network.py rename to src/wolfharness/utils/network.py diff --git a/src/agentpool/utils/parse_time.py b/src/wolfharness/utils/parse_time.py similarity index 100% rename from src/agentpool/utils/parse_time.py rename to src/wolfharness/utils/parse_time.py diff --git a/src/agentpool/utils/pydantic_ai_helpers.py b/src/wolfharness/utils/pydantic_ai_helpers.py similarity index 99% rename from src/agentpool/utils/pydantic_ai_helpers.py rename to src/wolfharness/utils/pydantic_ai_helpers.py index fe0e635e6..f881cbbd3 100644 --- a/src/agentpool/utils/pydantic_ai_helpers.py +++ b/src/wolfharness/utils/pydantic_ai_helpers.py @@ -8,7 +8,7 @@ from pydantic_ai import AudioUrl, BinaryContent, DocumentUrl, ImageUrl, VideoUrl from pydantic_ai.messages import BaseToolCallPart -from agentpool.common_types import PathReference +from wolfharness.common_types import PathReference if TYPE_CHECKING: diff --git a/src/agentpool/utils/result_utils.py b/src/wolfharness/utils/result_utils.py similarity index 95% rename from src/agentpool/utils/result_utils.py rename to src/wolfharness/utils/result_utils.py index 6265d2026..c8f96bc1e 100644 --- a/src/agentpool/utils/result_utils.py +++ b/src/wolfharness/utils/result_utils.py @@ -10,7 +10,7 @@ if TYPE_CHECKING: - from agentpool_config.output_types import StructuredResponseConfig + from wolfharness_config.output_types import StructuredResponseConfig def to_type( diff --git a/src/agentpool/utils/signatures.py b/src/wolfharness/utils/signatures.py similarity index 99% rename from src/agentpool/utils/signatures.py rename to src/wolfharness/utils/signatures.py index caca00cc7..704e3ab7a 100644 --- a/src/agentpool/utils/signatures.py +++ b/src/wolfharness/utils/signatures.py @@ -8,7 +8,7 @@ from pydantic._internal import _typing_extra -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -289,7 +289,7 @@ async def wrapper(*args: Any, **kwargs: Any) -> Any: wrapper.__doc__ = getattr(original_callable, "__doc__", None) wrapper.__module__ = getattr(original_callable, "__module__", None) # type: ignore[assignment] # ty: ignore[invalid-assignment] wrapper.__wrapped__ = original_callable # type: ignore[attr-defined] - wrapper.__agentpool_wrapped__ = original_callable # type: ignore[attr-defined] + wrapper.__wolfharness_wrapped__ = original_callable # type: ignore[attr-defined] # Create modified signature without context parameters try: diff --git a/src/agentpool/utils/streams.py b/src/wolfharness/utils/streams.py similarity index 99% rename from src/agentpool/utils/streams.py rename to src/wolfharness/utils/streams.py index 86e9e6af4..d6f3f9bb9 100644 --- a/src/agentpool/utils/streams.py +++ b/src/wolfharness/utils/streams.py @@ -41,7 +41,7 @@ def to_unified_diff(self) -> str: Returns: Unified diff string """ - from agentpool.utils.diffs import compute_unified_diff + from wolfharness.utils.diffs import compute_unified_diff return compute_unified_diff( self.old_content or "", diff --git a/src/agentpool/utils/subprocess_utils.py b/src/wolfharness/utils/subprocess_utils.py similarity index 99% rename from src/agentpool/utils/subprocess_utils.py rename to src/wolfharness/utils/subprocess_utils.py index 187fd6008..6fef5598f 100644 --- a/src/agentpool/utils/subprocess_utils.py +++ b/src/wolfharness/utils/subprocess_utils.py @@ -10,7 +10,7 @@ import anyio -from agentpool import log +from wolfharness import log if TYPE_CHECKING: diff --git a/src/agentpool/utils/task_group.py b/src/wolfharness/utils/task_group.py similarity index 99% rename from src/agentpool/utils/task_group.py rename to src/wolfharness/utils/task_group.py index f9641656d..cf9869e17 100644 --- a/src/agentpool/utils/task_group.py +++ b/src/wolfharness/utils/task_group.py @@ -7,7 +7,7 @@ import anyio -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: diff --git a/src/agentpool/utils/tasks.py b/src/wolfharness/utils/tasks.py similarity index 75% rename from src/agentpool/utils/tasks.py rename to src/wolfharness/utils/tasks.py index 0ac5fbc3f..1b64dbeea 100644 --- a/src/agentpool/utils/tasks.py +++ b/src/wolfharness/utils/tasks.py @@ -2,7 +2,7 @@ This module previously provided ``TaskManager`` and ``PrioritizedTask``. All call sites have been migrated to either ``ManagedTaskGroup`` -(see :mod:`agentpool.utils.task_group`) or direct ``asyncio`` task +(see :mod:`wolfharness.utils.task_group`) or direct ``asyncio`` task tracking via ``MessageNode._pending_tasks`` / ``MessageNode.spawn_task()``. """ @@ -14,7 +14,7 @@ class TaskManager: """Stub — TaskManager has been removed. - Use :class:`agentpool.utils.task_group.ManagedTaskGroup` for structured + Use :class:`wolfharness.utils.task_group.ManagedTaskGroup` for structured concurrency, or ``MessageNode.spawn_task()`` / ``MessageNode._pending_tasks`` for direct asyncio task tracking. """ @@ -22,6 +22,6 @@ class TaskManager: def __init__(self, *args: Any, **kwargs: Any) -> None: msg = ( "TaskManager is removed. Use ManagedTaskGroup " - "(agentpool.utils.task_group) or MessageNode.spawn_task() instead." + "(wolfharness.utils.task_group) or MessageNode.spawn_task() instead." ) raise RuntimeError(msg) diff --git a/src/agentpool/utils/thread_helpers.py b/src/wolfharness/utils/thread_helpers.py similarity index 100% rename from src/agentpool/utils/thread_helpers.py rename to src/wolfharness/utils/thread_helpers.py diff --git a/src/agentpool/utils/time_utils.py b/src/wolfharness/utils/time_utils.py similarity index 100% rename from src/agentpool/utils/time_utils.py rename to src/wolfharness/utils/time_utils.py diff --git a/src/agentpool/utils/todos.py b/src/wolfharness/utils/todos.py similarity index 100% rename from src/agentpool/utils/todos.py rename to src/wolfharness/utils/todos.py diff --git a/src/agentpool/utils/token_breakdown.py b/src/wolfharness/utils/token_breakdown.py similarity index 99% rename from src/agentpool/utils/token_breakdown.py rename to src/wolfharness/utils/token_breakdown.py index f20d6efeb..64d636ec8 100644 --- a/src/agentpool/utils/token_breakdown.py +++ b/src/wolfharness/utils/token_breakdown.py @@ -26,7 +26,7 @@ from pydantic_ai.models import Model from pydantic_ai.settings import ModelSettings - from agentpool.messaging.messages import TokenCost + from wolfharness.messaging.messages import TokenCost @dataclass @@ -129,7 +129,7 @@ async def calculate_usage_from_parts( Returns: Tuple of (RequestUsage, TokenCost or None) """ - from agentpool.messaging.messages import TokenCost + from wolfharness.messaging.messages import TokenCost model_for_count = model_name or "gpt-4" diff --git a/src/agentpool/utils/tool_schema.py b/src/wolfharness/utils/tool_schema.py similarity index 100% rename from src/agentpool/utils/tool_schema.py rename to src/wolfharness/utils/tool_schema.py diff --git a/src/agentpool/utils/usage.py b/src/wolfharness/utils/usage.py similarity index 100% rename from src/agentpool/utils/usage.py rename to src/wolfharness/utils/usage.py diff --git a/src/agentpool/utils/worktree.py b/src/wolfharness/utils/worktree.py similarity index 99% rename from src/agentpool/utils/worktree.py rename to src/wolfharness/utils/worktree.py index a5ab69c58..f2f4a8c51 100644 --- a/src/agentpool/utils/worktree.py +++ b/src/wolfharness/utils/worktree.py @@ -7,7 +7,7 @@ import random import shutil -from agentpool.log import get_logger +from wolfharness.log import get_logger logger = get_logger(__name__) diff --git a/src/agentpool/vfs_registry.py b/src/wolfharness/vfs_registry.py similarity index 98% rename from src/agentpool/vfs_registry.py rename to src/wolfharness/vfs_registry.py index 3ee8cbde7..643d55db7 100644 --- a/src/agentpool/vfs_registry.py +++ b/src/wolfharness/vfs_registry.py @@ -4,8 +4,8 @@ from upathtools import AsyncUPath, list_files, read_folder, read_path -from agentpool.log import get_logger -from agentpool.utils.baseregistry import AgentPoolError +from wolfharness.log import get_logger +from wolfharness.utils.baseregistry import AgentPoolError if TYPE_CHECKING: @@ -15,7 +15,7 @@ from upathtools import AsyncUPath, UPath from upathtools.filesystems import UnionFileSystem - from agentpool.models.manifest import ResourceConfig + from wolfharness.models.manifest import ResourceConfig logger = get_logger(__name__) diff --git a/src/wolfharness_bot/__init__.py b/src/wolfharness_bot/__init__.py new file mode 100644 index 000000000..85764d6c7 --- /dev/null +++ b/src/wolfharness_bot/__init__.py @@ -0,0 +1,3 @@ +"""wolfharness_bot - Chat channel integrations for wolfharness.""" + +from __future__ import annotations diff --git a/src/agentpool_bot/bus.py b/src/wolfharness_bot/bus.py similarity index 99% rename from src/agentpool_bot/bus.py rename to src/wolfharness_bot/bus.py index 3289da1a0..2d8ccf234 100644 --- a/src/agentpool_bot/bus.py +++ b/src/wolfharness_bot/bus.py @@ -7,7 +7,7 @@ from datetime import datetime from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: diff --git a/src/agentpool_bot/channels/__init__.py b/src/wolfharness_bot/channels/__init__.py similarity index 54% rename from src/agentpool_bot/channels/__init__.py rename to src/wolfharness_bot/channels/__init__.py index 500a79b5a..5c741f3b1 100644 --- a/src/agentpool_bot/channels/__init__.py +++ b/src/wolfharness_bot/channels/__init__.py @@ -2,7 +2,7 @@ from __future__ import annotations -from agentpool_bot.channels.base import BaseChannel -from agentpool_bot.channels.manager import ChannelManager +from wolfharness_bot.channels.base import BaseChannel +from wolfharness_bot.channels.manager import ChannelManager __all__ = ["BaseChannel", "ChannelManager"] diff --git a/src/agentpool_bot/channels/base.py b/src/wolfharness_bot/channels/base.py similarity index 94% rename from src/agentpool_bot/channels/base.py rename to src/wolfharness_bot/channels/base.py index aa1fe0e21..86759d8e9 100644 --- a/src/agentpool_bot/channels/base.py +++ b/src/wolfharness_bot/channels/base.py @@ -5,12 +5,12 @@ from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger -from agentpool_bot.bus import InboundMessage +from wolfharness.log import get_logger +from wolfharness_bot.bus import InboundMessage if TYPE_CHECKING: - from agentpool_bot.bus import MessageBus, OutboundMessage + from wolfharness_bot.bus import MessageBus, OutboundMessage logger = get_logger(__name__) @@ -20,7 +20,7 @@ class BaseChannel(ABC): """Abstract base class for chat channel implementations. Each channel (Telegram, Discord, etc.) should implement this interface - to integrate with the agentpool message bus. + to integrate with the wolfharness message bus. """ name: str = "base" diff --git a/src/agentpool_bot/channels/discord.py b/src/wolfharness_bot/channels/discord.py similarity index 95% rename from src/agentpool_bot/channels/discord.py rename to src/wolfharness_bot/channels/discord.py index a3eef3e46..efe88a968 100644 --- a/src/agentpool_bot/channels/discord.py +++ b/src/wolfharness_bot/channels/discord.py @@ -11,13 +11,13 @@ import httpx import websockets -from agentpool.log import get_logger -from agentpool_bot.channels.base import BaseChannel +from wolfharness.log import get_logger +from wolfharness_bot.channels.base import BaseChannel if TYPE_CHECKING: - from agentpool_bot.bus import MessageBus, OutboundMessage - from agentpool_bot.config import DiscordConfig + from wolfharness_bot.bus import MessageBus, OutboundMessage + from wolfharness_bot.config import DiscordConfig logger = get_logger(__name__) @@ -173,9 +173,9 @@ async def _identify(self) -> None: "token": self.config.token, "intents": self.config.intents, "properties": { - "os": "agentpool", - "browser": "agentpool", - "device": "agentpool", + "os": "wolfharness", + "browser": "wolfharness", + "device": "wolfharness", }, }, } @@ -216,7 +216,7 @@ async def _handle_message_create(self, payload: dict[str, Any]) -> None: content_parts = [content] if content else [] media_paths: list[str] = [] - media_dir = Path.home() / ".agentpool" / "media" + media_dir = Path.home() / ".wolfharness" / "media" media_dir.mkdir(parents=True, exist_ok=True) for attachment in payload.get("attachments") or []: url = attachment.get("url") diff --git a/src/agentpool_bot/channels/email.py b/src/wolfharness_bot/channels/email.py similarity index 97% rename from src/agentpool_bot/channels/email.py rename to src/wolfharness_bot/channels/email.py index d33ddf507..60917fd52 100644 --- a/src/agentpool_bot/channels/email.py +++ b/src/wolfharness_bot/channels/email.py @@ -17,15 +17,15 @@ import ssl from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger -from agentpool_bot.channels.base import BaseChannel +from wolfharness.log import get_logger +from wolfharness_bot.channels.base import BaseChannel if TYPE_CHECKING: from datetime import date - from agentpool_bot.bus import MessageBus, OutboundMessage - from agentpool_bot.config import EmailConfig + from wolfharness_bot.bus import MessageBus, OutboundMessage + from wolfharness_bot.config import EmailConfig @dataclass(frozen=True, slots=True) @@ -155,7 +155,7 @@ async def send(self, msg: OutboundMessage) -> None: logger.warning("Email channel missing recipient address") return - base_subject = self._last_subject_by_chat.get(to_addr, "agentpool reply") + base_subject = self._last_subject_by_chat.get(to_addr, "wolfharness reply") subject = self._reply_subject(base_subject) if isinstance(msg.metadata.get("subject"), str) and ( override := msg.metadata["subject"].strip() @@ -405,7 +405,7 @@ def _html_to_text(raw_html: str) -> str: return html.unescape(text) def _reply_subject(self, base_subject: str) -> str: - subject = (base_subject or "").strip() or "agentpool reply" + subject = (base_subject or "").strip() or "wolfharness reply" prefix = self.config.subject_prefix or "Re: " if subject.lower().startswith("re:"): return subject diff --git a/src/agentpool_bot/channels/manager.py b/src/wolfharness_bot/channels/manager.py similarity index 95% rename from src/agentpool_bot/channels/manager.py rename to src/wolfharness_bot/channels/manager.py index 52425a751..9de4d990a 100644 --- a/src/agentpool_bot/channels/manager.py +++ b/src/wolfharness_bot/channels/manager.py @@ -6,13 +6,13 @@ import contextlib from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: - from agentpool_bot.bus import MessageBus - from agentpool_bot.channels.base import BaseChannel - from agentpool_bot.config import ChannelsConfig + from wolfharness_bot.bus import MessageBus + from wolfharness_bot.channels.base import BaseChannel + from wolfharness_bot.config import ChannelsConfig logger = get_logger(__name__) diff --git a/src/agentpool_bot/channels/slack.py b/src/wolfharness_bot/channels/slack.py similarity index 96% rename from src/agentpool_bot/channels/slack.py rename to src/wolfharness_bot/channels/slack.py index fd02a2eba..d3fcaabae 100644 --- a/src/agentpool_bot/channels/slack.py +++ b/src/wolfharness_bot/channels/slack.py @@ -11,16 +11,16 @@ from slack_sdk.web.async_client import AsyncWebClient from slackify_markdown import slackify_markdown -from agentpool.log import get_logger -from agentpool.utils.time_utils import get_now -from agentpool_bot.channels.base import BaseChannel +from wolfharness.log import get_logger +from wolfharness.utils.time_utils import get_now +from wolfharness_bot.channels.base import BaseChannel if TYPE_CHECKING: from slack_sdk.socket_mode.request import SocketModeRequest - from agentpool_bot.bus import MessageBus, OutboundMessage - from agentpool_bot.config import SlackConfig + from wolfharness_bot.bus import MessageBus, OutboundMessage + from wolfharness_bot.config import SlackConfig logger = get_logger(__name__) diff --git a/src/agentpool_bot/channels/telegram.py b/src/wolfharness_bot/channels/telegram.py similarity index 97% rename from src/agentpool_bot/channels/telegram.py rename to src/wolfharness_bot/channels/telegram.py index fc7b181f2..f83c89cc8 100644 --- a/src/agentpool_bot/channels/telegram.py +++ b/src/wolfharness_bot/channels/telegram.py @@ -11,8 +11,8 @@ from telegram.ext import Application, CommandHandler, MessageHandler, filters from telegram.request import HTTPXRequest -from agentpool.log import get_logger -from agentpool_bot.channels.base import BaseChannel +from wolfharness.log import get_logger +from wolfharness_bot.channels.base import BaseChannel if TYPE_CHECKING: @@ -20,8 +20,8 @@ from telegram._files._basemedium import _BaseMedium from telegram.ext import ContextTypes - from agentpool_bot.bus import MessageBus, OutboundMessage - from agentpool_bot.config import TelegramConfig + from wolfharness_bot.bus import MessageBus, OutboundMessage + from wolfharness_bot.config import TelegramConfig logger = get_logger(__name__) @@ -283,7 +283,7 @@ async def _on_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> user = update.effective_user await update.message.reply_text( - f"Hi {user.first_name}! I'm an agentpool bot.\n\n" + f"Hi {user.first_name}! I'm an wolfharness bot.\n\n" "Send me a message and I'll respond!\n" "Type /help to see available commands." ) @@ -351,7 +351,7 @@ async def _on_message( # noqa: PLR0915 getattr(media_file, "mime_type", None), ) - media_dir = Path.home() / ".agentpool" / "media" + media_dir = Path.home() / ".wolfharness" / "media" media_dir.mkdir(parents=True, exist_ok=True) file_path = media_dir / f"{media_file.file_id[:16]}{ext}" @@ -360,7 +360,7 @@ async def _on_message( # noqa: PLR0915 media_paths.append(str(file_path)) if media_type in ("voice", "audio"): - from agentpool_bot.transcription import GroqTranscriptionProvider + from wolfharness_bot.transcription import GroqTranscriptionProvider transcriber = GroqTranscriptionProvider(api_key=self.groq_api_key) transcription = await transcriber.transcribe(file_path) diff --git a/src/agentpool_bot/channels/whatsapp.py b/src/wolfharness_bot/channels/whatsapp.py similarity index 95% rename from src/agentpool_bot/channels/whatsapp.py rename to src/wolfharness_bot/channels/whatsapp.py index 188855201..836c5a4ea 100644 --- a/src/agentpool_bot/channels/whatsapp.py +++ b/src/wolfharness_bot/channels/whatsapp.py @@ -7,15 +7,15 @@ import anyenv -from agentpool.log import get_logger -from agentpool_bot.channels.base import BaseChannel +from wolfharness.log import get_logger +from wolfharness_bot.channels.base import BaseChannel if TYPE_CHECKING: from websockets import ClientConnection - from agentpool_bot.bus import MessageBus, OutboundMessage - from agentpool_bot.config import WhatsAppConfig + from wolfharness_bot.bus import MessageBus, OutboundMessage + from wolfharness_bot.config import WhatsAppConfig logger = get_logger(__name__) diff --git a/src/agentpool_bot/config.py b/src/wolfharness_bot/config.py similarity index 86% rename from src/agentpool_bot/config.py rename to src/wolfharness_bot/config.py index 1b31ba898..3b7d7500f 100644 --- a/src/agentpool_bot/config.py +++ b/src/wolfharness_bot/config.py @@ -1,4 +1,4 @@ -"""Configuration models for agentpool_bot channels.""" +"""Configuration models for wolfharness_bot channels.""" from __future__ import annotations @@ -9,12 +9,12 @@ if TYPE_CHECKING: - from agentpool_bot.bus import MessageBus - from agentpool_bot.channels.discord import DiscordChannel - from agentpool_bot.channels.email import EmailChannel - from agentpool_bot.channels.slack import SlackChannel - from agentpool_bot.channels.telegram import TelegramChannel - from agentpool_bot.channels.whatsapp import WhatsAppChannel + from wolfharness_bot.bus import MessageBus + from wolfharness_bot.channels.discord import DiscordChannel + from wolfharness_bot.channels.email import EmailChannel + from wolfharness_bot.channels.slack import SlackChannel + from wolfharness_bot.channels.telegram import TelegramChannel + from wolfharness_bot.channels.whatsapp import WhatsAppChannel class BaseChannelConfig(BaseModel): @@ -34,7 +34,7 @@ class WhatsAppConfig(BaseChannelConfig): allow_from: list[str] = Field(default_factory=list) def get_provider(self, bus: MessageBus) -> WhatsAppChannel: - from agentpool_bot.channels.whatsapp import WhatsAppChannel + from wolfharness_bot.channels.whatsapp import WhatsAppChannel return WhatsAppChannel(self, bus) @@ -49,7 +49,7 @@ class TelegramConfig(BaseChannelConfig): proxy: str | None = None def get_provider(self, bus: MessageBus) -> TelegramChannel: - from agentpool_bot.channels.telegram import TelegramChannel + from wolfharness_bot.channels.telegram import TelegramChannel return TelegramChannel(self, bus) @@ -65,7 +65,7 @@ class DiscordConfig(BaseChannelConfig): intents: int = 37377 # GUILDS + GUILD_MESSAGES + DIRECT_MESSAGES + MESSAGE_CONTENT def get_provider(self, bus: MessageBus) -> DiscordChannel: - from agentpool_bot.channels.discord import DiscordChannel + from wolfharness_bot.channels.discord import DiscordChannel return DiscordChannel(self, bus) @@ -121,7 +121,7 @@ def _check_credentials_when_enabled(self) -> EmailConfig: allow_from: list[str] = Field(default_factory=list) def get_provider(self, bus: MessageBus) -> EmailChannel: - from agentpool_bot.channels.email import EmailChannel + from wolfharness_bot.channels.email import EmailChannel return EmailChannel(self, bus) @@ -151,7 +151,7 @@ class SlackConfig(BaseChannelConfig): dm: SlackDMConfig = Field(default_factory=SlackDMConfig) def get_provider(self, bus: MessageBus) -> SlackChannel: - from agentpool_bot.channels.slack import SlackChannel + from wolfharness_bot.channels.slack import SlackChannel return SlackChannel(self, bus) diff --git a/src/agentpool_bot/cron/__init__.py b/src/wolfharness_bot/cron/__init__.py similarity index 76% rename from src/agentpool_bot/cron/__init__.py rename to src/wolfharness_bot/cron/__init__.py index 727452437..569999a0c 100644 --- a/src/agentpool_bot/cron/__init__.py +++ b/src/wolfharness_bot/cron/__init__.py @@ -2,8 +2,8 @@ from __future__ import annotations -from agentpool_bot.cron.service import CronService -from agentpool_bot.cron.cron_types import ( +from wolfharness_bot.cron.service import CronService +from wolfharness_bot.cron.cron_types import ( CronJob, CronJobState, CronPayload, diff --git a/src/agentpool_bot/cron/cron_types.py b/src/wolfharness_bot/cron/cron_types.py similarity index 100% rename from src/agentpool_bot/cron/cron_types.py rename to src/wolfharness_bot/cron/cron_types.py diff --git a/src/agentpool_bot/cron/service.py b/src/wolfharness_bot/cron/service.py similarity index 98% rename from src/agentpool_bot/cron/service.py rename to src/wolfharness_bot/cron/service.py index 7a98af2ec..4d6237b0b 100644 --- a/src/agentpool_bot/cron/service.py +++ b/src/wolfharness_bot/cron/service.py @@ -7,16 +7,16 @@ from typing import TYPE_CHECKING import uuid -from agentpool.log import get_logger -from agentpool.utils.time_utils import now_ms -from agentpool_bot.cron.cron_types import CronJob, CronJobState, CronPayload, CronStore +from wolfharness.log import get_logger +from wolfharness.utils.time_utils import now_ms +from wolfharness_bot.cron.cron_types import CronJob, CronJobState, CronPayload, CronStore if TYPE_CHECKING: from collections.abc import Awaitable, Callable from pathlib import Path - from agentpool_bot.cron.cron_types import CronSchedule + from wolfharness_bot.cron.cron_types import CronSchedule logger = get_logger(__name__) diff --git a/src/agentpool_bot/heartbeat.py b/src/wolfharness_bot/heartbeat.py similarity index 98% rename from src/agentpool_bot/heartbeat.py rename to src/wolfharness_bot/heartbeat.py index e56f1708e..0bd9d4a15 100644 --- a/src/agentpool_bot/heartbeat.py +++ b/src/wolfharness_bot/heartbeat.py @@ -2,7 +2,7 @@ The service reads ``HEARTBEAT.md`` from the workspace directory at a configurable interval. When the file contains actionable content the -``on_heartbeat`` callback is invoked (typically wired to an agentpool +``on_heartbeat`` callback is invoked (typically wired to an wolfharness agent) so the agent can process whatever tasks are listed. """ @@ -11,7 +11,7 @@ import asyncio from typing import TYPE_CHECKING -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: diff --git a/src/agentpool_bot/message_tools.py b/src/wolfharness_bot/message_tools.py similarity index 93% rename from src/agentpool_bot/message_tools.py rename to src/wolfharness_bot/message_tools.py index d7ffd78e6..892665edc 100644 --- a/src/agentpool_bot/message_tools.py +++ b/src/wolfharness_bot/message_tools.py @@ -4,13 +4,13 @@ from typing import TYPE_CHECKING -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger if TYPE_CHECKING: - from agentpool.tools.base import Tool - from agentpool_bot.bus import MessageBus + from wolfharness.tools.base import Tool + from wolfharness_bot.bus import MessageBus logger = get_logger(__name__) @@ -84,7 +84,7 @@ async def send_message( Returns: Confirmation string, or an error message. """ - from agentpool_bot.bus import OutboundMessage + from wolfharness_bot.bus import OutboundMessage resolved_channel = channel or self.default_channel resolved_chat_id = chat_id or self.default_chat_id diff --git a/src/agentpool_bot/transcription.py b/src/wolfharness_bot/transcription.py similarity index 98% rename from src/agentpool_bot/transcription.py rename to src/wolfharness_bot/transcription.py index 59a949e34..24b5923d9 100644 --- a/src/agentpool_bot/transcription.py +++ b/src/wolfharness_bot/transcription.py @@ -7,7 +7,7 @@ import httpx -from agentpool.log import get_logger +from wolfharness.log import get_logger logger = get_logger(__name__) diff --git a/src/wolfharness_cli/__init__.py b/src/wolfharness_cli/__init__.py new file mode 100644 index 000000000..ddaab3360 --- /dev/null +++ b/src/wolfharness_cli/__init__.py @@ -0,0 +1,34 @@ +"""CLI commands for wolfharness.""" + +from __future__ import annotations + +from wolfharness_cli.store import ConfigStore + + +agent_store = ConfigStore("agents.json") + + +def resolve_agent_config(config: str | None) -> str: + """Resolve agent configuration path from name or direct path. + + Args: + config: Configuration name or path. If None, uses active config. + + Returns: + Resolved configuration path + + Raises: + ValueError: If no configuration is found or no active config is set + """ + if not config: + if active := agent_store.get_active(): + return active.path + + raise ValueError("No active agent configuration set. Use 'agents set' to set one.") + + try: + # First try as stored config name + return agent_store.get_config(config) + except KeyError: + # If not found, treat as direct path + return config diff --git a/src/agentpool_cli/__main__.py b/src/wolfharness_cli/__main__.py similarity index 68% rename from src/agentpool_cli/__main__.py rename to src/wolfharness_cli/__main__.py index 13372ef32..cb49f1c88 100644 --- a/src/agentpool_cli/__main__.py +++ b/src/wolfharness_cli/__main__.py @@ -6,22 +6,22 @@ import typer as t -from agentpool_cli import log -from agentpool_cli.agent import add_agent_file, list_agents, list_configs, set_active_file -from agentpool_cli.cli_types import LogLevel # noqa: TC001 -from agentpool_cli.config_info import config_cli -from agentpool_cli.history import history_cli -from agentpool_cli.run import run_command -from agentpool_cli.serve_acp import acp_command -from agentpool_cli.serve_agui import agui_command -from agentpool_cli.serve_api import api_command -from agentpool_cli.serve_mcp import serve_command -from agentpool_cli.serve_opencode import opencode_command -from agentpool_cli.serve_vercel import vercel_command -from agentpool_cli.store import ConfigStore -from agentpool_cli.task import task_command -from agentpool_cli.ui import ui_app -from agentpool_cli.watch import watch_command +from wolfharness_cli import log +from wolfharness_cli.agent import add_agent_file, list_agents, list_configs, set_active_file +from wolfharness_cli.cli_types import LogLevel # noqa: TC001 +from wolfharness_cli.config_info import config_cli +from wolfharness_cli.history import history_cli +from wolfharness_cli.run import run_command +from wolfharness_cli.serve_acp import acp_command +from wolfharness_cli.serve_agui import agui_command +from wolfharness_cli.serve_api import api_command +from wolfharness_cli.serve_mcp import serve_command +from wolfharness_cli.serve_opencode import opencode_command +from wolfharness_cli.serve_vercel import vercel_command +from wolfharness_cli.store import ConfigStore +from wolfharness_cli.task import task_command +from wolfharness_cli.ui import ui_app +from wolfharness_cli.watch import watch_command agent_store = ConfigStore("agents.json") @@ -39,8 +39,8 @@ def get_command_help(base_help: str) -> str: def version_callback(value: bool) -> None: """Print version and exit.""" if value: - version = metadata.version("agentpool") - t.echo(f"agentpool version {version}") + version = metadata.version("wolfharness") + t.echo(f"wolfharness version {version}") raise t.Exit diff --git a/src/agentpool_cli/agent.py b/src/wolfharness_cli/agent.py similarity index 92% rename from src/agentpool_cli/agent.py rename to src/wolfharness_cli/agent.py index 1e3c8c710..9b55832a5 100644 --- a/src/agentpool_cli/agent.py +++ b/src/wolfharness_cli/agent.py @@ -7,8 +7,8 @@ import typer as t -from agentpool_cli import agent_store, resolve_agent_config -from agentpool_cli.common import verbose_opt +from wolfharness_cli import agent_store, resolve_agent_config +from wolfharness_cli.common import verbose_opt agent_cli = t.Typer(help="Agent management commands", no_args_is_help=True) @@ -33,18 +33,18 @@ def init_agent_config( from pathlib import Path if interactive: - from agentpool.utils.inspection import validate_import + from wolfharness.utils.inspection import validate_import validate_import("promptantic", "chat") from promptantic import ModelGenerator - from agentpool import AgentsManifest + from wolfharness import AgentsManifest generator = ModelGenerator() manifest = generator.populate(AgentsManifest) manifest.save(output) else: - from agentpool import config_resources + from wolfharness import config_resources shutil.copy2(config_resources.AGENTS_TEMPLATE, output) @@ -54,8 +54,8 @@ def init_agent_config( print(f"\nCreated and activated agent configuration {config_name!r}: {output}") print("\nTry these commands:") - print(" agentpool list") - print(" agentpool chat simple_agent") + print(" wolfharness list") + print(" wolfharness chat simple_agent") @agent_cli.command("add") @@ -97,7 +97,7 @@ def list_configs() -> None: active_name = active.name if active else None if not configs: - t.echo("No configurations stored. Use 'agentpool add' to add one.") + t.echo("No configurations stored. Use 'wolfharness add' to add one.") return table = Table(title="Stored Configurations") diff --git a/src/agentpool_cli/cli_types.py b/src/wolfharness_cli/cli_types.py similarity index 100% rename from src/agentpool_cli/cli_types.py rename to src/wolfharness_cli/cli_types.py diff --git a/src/agentpool_cli/common.py b/src/wolfharness_cli/common.py similarity index 95% rename from src/agentpool_cli/common.py rename to src/wolfharness_cli/common.py index 02463e9c4..7c30fd94a 100644 --- a/src/agentpool_cli/common.py +++ b/src/wolfharness_cli/common.py @@ -26,9 +26,9 @@ OUTPUT_FORMAT_CMDS = "-o", "--output-format" VERBOSE_CMDS = "-v", "--verbose" -LOG_DIR = Path(platformdirs.user_log_dir("agentpool", "agentpool")) +LOG_DIR = Path(platformdirs.user_log_dir("wolfharness", "wolfharness")) TIMESTAMP = datetime.now().strftime("%Y%m%d_%H%M%S_%f") -LOG_FILE = LOG_DIR / f"agentpool_{TIMESTAMP}.log" +LOG_FILE = LOG_DIR / f"wolfharness_{TIMESTAMP}.log" MAX_LOG_SIZE = 10 * 1024 * 1024 # (10MB) @@ -50,7 +50,7 @@ def setup_logging( format_string: Optional custom format string log_to_file: Whether to log to file in addition to stdout """ - logger = logging.getLogger("agentpool") + logger = logging.getLogger("wolfharness") logger.setLevel(logging.DEBUG) format_string = format_string or "%(asctime)s - %(name)s - %(levelname)s - %(message)s" formatter = logging.Formatter(format_string) @@ -91,7 +91,7 @@ def setup_logging( def complete_config_names() -> list[str]: """Complete stored config names.""" - from agentpool_cli import agent_store + from wolfharness_cli import agent_store return [name for name, _ in agent_store.list_configs()] diff --git a/src/agentpool_cli/config_info.py b/src/wolfharness_cli/config_info.py similarity index 92% rename from src/agentpool_cli/config_info.py rename to src/wolfharness_cli/config_info.py index 774bcf315..e415ef92e 100644 --- a/src/agentpool_cli/config_info.py +++ b/src/wolfharness_cli/config_info.py @@ -6,7 +6,7 @@ import typer as t -from agentpool_cli import log +from wolfharness_cli import log logger = log.get_logger(__name__) @@ -26,7 +26,7 @@ def show_config( ] = "text", ) -> None: """Show configuration resolution status.""" - from agentpool_config.resolution import get_config_search_paths, resolve_config + from wolfharness_config.resolution import get_config_search_paths, resolve_config search_paths = get_config_search_paths() @@ -82,7 +82,7 @@ def show_paths() -> None: import os from pathlib import Path - from agentpool_config.resolution import ( + from wolfharness_config.resolution import ( CONFIG_FILE_NAMES, ENV_CONFIG_PATH, find_project_config, @@ -123,12 +123,12 @@ def init_config( """Initialize a new configuration file.""" from pathlib import Path - from agentpool_config.resolution import ensure_global_config_dir + from wolfharness_config.resolution import ensure_global_config_dir if location == "global": - target = ensure_global_config_dir() / "agentpool.yml" + target = ensure_global_config_dir() / "wolfharness.yml" elif location == "project": - target = Path.cwd() / "agentpool.yml" + target = Path.cwd() / "wolfharness.yml" else: target = Path(location) diff --git a/src/agentpool_cli/history.py b/src/wolfharness_cli/history.py similarity index 84% rename from src/agentpool_cli/history.py rename to src/wolfharness_cli/history.py index 274f85c6c..405be7e31 100644 --- a/src/agentpool_cli/history.py +++ b/src/wolfharness_cli/history.py @@ -7,13 +7,13 @@ import typer as t -from agentpool_cli import log, resolve_agent_config -from agentpool_cli.cli_types import GroupBy -from agentpool_cli.common import OutputFormat, format_output, output_format_opt +from wolfharness_cli import log, resolve_agent_config +from wolfharness_cli.cli_types import GroupBy +from wolfharness_cli.common import OutputFormat, format_output, output_format_opt if TYPE_CHECKING: - from agentpool_storage.base import StorageProvider + from wolfharness_storage.base import StorageProvider logger = log.get_logger(__name__) @@ -38,8 +38,8 @@ def get_history_provider(config_path: str) -> StorageProvider: Returns: Storage provider configured for history operations """ - from agentpool import AgentsManifest - from agentpool.storage import StorageManager + from wolfharness import AgentsManifest + from wolfharness.storage import StorageManager manifest = AgentsManifest.from_file(config_path) storage = StorageManager(manifest.storage) @@ -68,22 +68,22 @@ def show_history( Examples: # Show last 5 conversations - agentpool history show -n 5 + wolfharness history show -n 5 # Show conversations from last 24 hours - agentpool history show --period 24h + wolfharness history show --period 24h # Show conversations since specific date - agentpool history show --since 2024-01-01 + wolfharness history show --since 2024-01-01 # Search for specific content - agentpool history show --query "database schema" + wolfharness history show --query "database schema" # Show GPT-5 conversations with token usage - agentpool history show --model gpt-5 --tokens + wolfharness history show --model gpt-5 --tokens # Compact view of recent conversations - agentpool history show --period 1d --compact + wolfharness history show --period 1d --compact """ import anyio @@ -127,19 +127,19 @@ def show_stats( Examples: # Show stats for all agents - agentpool history stats + wolfharness history stats # Show daily stats for specific agent - agentpool history stats myagent --group-by day + wolfharness history stats myagent --group-by day # Show model usage for last week - agentpool history stats --period 1w --group-by model + wolfharness history stats --period 1w --group-by model """ import anyio - from agentpool.utils.parse_time import parse_time_period - from agentpool_storage.formatters import format_stats - from agentpool_storage.models import StatsFilters + from wolfharness.utils.parse_time import parse_time_period + from wolfharness_storage.formatters import format_stats + from wolfharness_storage.models import StatsFilters try: # Resolve config and get provider @@ -178,16 +178,16 @@ def reset_history( Examples: # Clear all history (with confirmation) - agentpool history reset + wolfharness history reset # Clear without confirmation - agentpool history reset --confirm + wolfharness history reset --confirm # Clear history for specific agent - agentpool history reset --agent myagent + wolfharness history reset --agent myagent # Drop and recreate tables (for schema changes) - agentpool history reset --hard --confirm + wolfharness history reset --hard --confirm """ import anyio diff --git a/src/agentpool_cli/log.py b/src/wolfharness_cli/log.py similarity index 93% rename from src/agentpool_cli/log.py rename to src/wolfharness_cli/log.py index 64d453cd1..cbd0a88dc 100644 --- a/src/agentpool_cli/log.py +++ b/src/wolfharness_cli/log.py @@ -1,7 +1,7 @@ """Lightweight logging configuration for CLI startup. -This is a simplified copy of agentpool.log to avoid importing the full -agentpool package (which pulls in pydantic-ai, llmling-models, etc.) +This is a simplified copy of wolfharness.log to avoid importing the full +wolfharness package (which pulls in pydantic-ai, llmling-models, etc.) just for CLI help text. """ diff --git a/src/agentpool_commands/py.typed b/src/wolfharness_cli/py.typed similarity index 100% rename from src/agentpool_commands/py.typed rename to src/wolfharness_cli/py.typed diff --git a/src/agentpool_cli/run.py b/src/wolfharness_cli/run.py similarity index 92% rename from src/agentpool_cli/run.py rename to src/wolfharness_cli/run.py index 7251ad128..7db94709e 100644 --- a/src/agentpool_cli/run.py +++ b/src/wolfharness_cli/run.py @@ -11,10 +11,10 @@ from pydantic_ai import TextPartDelta import typer as t -from agentpool.agents.events import PartDeltaEvent, StreamCompleteEvent -from agentpool_cli import resolve_agent_config -from agentpool_cli.cli_types import DetailLevel # noqa: TC001 -from agentpool_cli.common import verbose_opt +from wolfharness.agents.events import PartDeltaEvent, StreamCompleteEvent +from wolfharness_cli import resolve_agent_config +from wolfharness_cli.cli_types import DetailLevel # noqa: TC001 +from wolfharness_cli.common import verbose_opt def run_command( @@ -43,7 +43,7 @@ def run_command( raise t.BadParameter(error_msg) from e async def run() -> None: - from agentpool import AgentPool + from wolfharness import AgentPool async with AgentPool(config_path) as pool: sp = pool.session_pool diff --git a/src/agentpool_cli/serve_acp.py b/src/wolfharness_cli/serve_acp.py similarity index 91% rename from src/agentpool_cli/serve_acp.py rename to src/wolfharness_cli/serve_acp.py index e6ecf14be..111e2b8de 100644 --- a/src/agentpool_cli/serve_acp.py +++ b/src/wolfharness_cli/serve_acp.py @@ -5,9 +5,9 @@ integration with file system access, permission handling, and terminal support. Configuration is resolved from multiple layers (in precedence order): -1. Global config (~/.config/agentpool/agentpool.yml) +1. Global config (~/.config/wolfharness/wolfharness.yml) 2. Custom config (AGENTPOOL_CONFIG env var) -3. Project config (agentpool.yml in project/git root) +3. Project config (wolfharness.yml in project/git root) 4. Explicit CLI argument (highest precedence) 5. Built-in fallback (only if no agents defined elsewhere) """ @@ -23,7 +23,7 @@ from platformdirs import user_log_path import typer as t -from agentpool_cli import log +from wolfharness_cli import log if TYPE_CHECKING: @@ -174,9 +174,9 @@ def acp_command( # noqa: PLR0915 Configuration Layers (merged in order, later overrides earlier): - 1. Global config - ~/.config/agentpool/agentpool.yml for user preferences + 1. Global config - ~/.config/wolfharness/wolfharness.yml for user preferences 2. Custom config - AGENTPOOL_CONFIG env var for CI/deployment overrides - 3. Project config - agentpool.yml in project/git root for project-specific settings + 3. Project config - wolfharness.yml in project/git root for project-specific settings 4. Explicit config - CLI argument (highest precedence) 5. Built-in fallback - Only used if no agents defined in any layer @@ -187,21 +187,21 @@ def acp_command( # noqa: PLR0915 Transport Options: # Stdio transport (default, for IDE integration) - agentpool serve-acp agents.yml + wolfharness serve-acp agents.yml # Streamable HTTP transport (recommended for Toad, web clients) - agentpool serve-acp agents.yml --transport streamable-http --port 8080 + wolfharness serve-acp agents.yml --transport streamable-http --port 8080 # Legacy WebSocket transport (deprecated) - agentpool serve-acp agents.yml --transport websocket --ws-port 8765 + wolfharness serve-acp agents.yml --transport websocket --ws-port 8765 """ from acp import ACPWebSocketTransport, StdioTransport, WebSocketTransport - from agentpool import log - from agentpool.config_resources import ACP_ASSISTANT - from agentpool.models.manifest import AgentsManifest - from agentpool_config.context import ConfigContextManager - from agentpool_config.resolution import resolve_config - from agentpool_server.acp_server import ACPServer + from wolfharness import log + from wolfharness.config_resources import ACP_ASSISTANT + from wolfharness.models.manifest import AgentsManifest + from wolfharness_config.context import ConfigContextManager + from wolfharness_config.resolution import resolve_config + from wolfharness_server.acp_server import ACPServer # Build transport config if transport == "streamable-http": @@ -229,7 +229,7 @@ def acp_command( # noqa: PLR0915 transport_config = StdioTransport() # Always log to file with rollover - log_dir = user_log_path("agentpool", appauthor=False) + log_dir = user_log_path("wolfharness", appauthor=False) log_dir.mkdir(parents=True, exist_ok=True) log_file = log_dir / "acp.log" log.configure_logging(force=True, log_file=str(log_file)) @@ -293,7 +293,7 @@ def update_with_path(nodes: dict[str, Any]) -> dict[str, Any]: # TODO: Consider adding to specific agent's MCP manager instead of pool-level # for better isolation (currently all agents in pool share these servers) if mcp_config: - from agentpool_config.mcp_server import parse_mcp_servers_json + from wolfharness_config.mcp_server import parse_mcp_servers_json try: mcp_data = anyenv.load_json(mcp_config) diff --git a/src/agentpool_cli/serve_agui.py b/src/wolfharness_cli/serve_agui.py similarity index 89% rename from src/agentpool_cli/serve_agui.py rename to src/wolfharness_cli/serve_agui.py index 7b07a2e4d..5818c4af1 100644 --- a/src/agentpool_cli/serve_agui.py +++ b/src/wolfharness_cli/serve_agui.py @@ -7,8 +7,8 @@ import typer as t -from agentpool_cli import resolve_agent_config -from agentpool_cli.log import get_logger +from wolfharness_cli import resolve_agent_config +from wolfharness_cli.log import get_logger logger = get_logger(__name__) @@ -32,9 +32,9 @@ def agui_command( """ import anyio - from agentpool import AgentPool, AgentsManifest - from agentpool_config.context import ConfigContextManager - from agentpool_server.agui_server import AGUIServer + from wolfharness import AgentPool, AgentsManifest + from wolfharness_config.context import ConfigContextManager + from wolfharness_server.agui_server import AGUIServer logger.info("Server PID", pid=os.getpid()) diff --git a/src/agentpool_cli/serve_api.py b/src/wolfharness_cli/serve_api.py similarity index 91% rename from src/agentpool_cli/serve_api.py rename to src/wolfharness_cli/serve_api.py index e69fd457c..d0380df36 100644 --- a/src/agentpool_cli/serve_api.py +++ b/src/wolfharness_cli/serve_api.py @@ -8,8 +8,8 @@ import typer as t -from agentpool_cli import resolve_agent_config -from agentpool_cli.log import get_logger +from wolfharness_cli import resolve_agent_config +from wolfharness_cli.log import get_logger logger = get_logger(__name__) @@ -33,9 +33,9 @@ def api_command( """ import uvicorn - from agentpool import AgentPool, AgentsManifest - from agentpool_config.context import ConfigContextManager - from agentpool_server.openai_api_server.server import OpenAIAPIServer + from wolfharness import AgentPool, AgentsManifest + from wolfharness_config.context import ConfigContextManager + from wolfharness_server.openai_api_server.server import OpenAIAPIServer logger.info("Server PID", pid=os.getpid()) diff --git a/src/agentpool_cli/serve_mcp.py b/src/wolfharness_cli/serve_mcp.py similarity index 85% rename from src/agentpool_cli/serve_mcp.py rename to src/wolfharness_cli/serve_mcp.py index 14b9c4cac..903c35098 100644 --- a/src/agentpool_cli/serve_mcp.py +++ b/src/wolfharness_cli/serve_mcp.py @@ -9,14 +9,14 @@ import typer as t -from agentpool_cli import log +from wolfharness_cli import log -# Duplicated from agentpool_config.pool_server to avoid heavy imports at CLI startup +# Duplicated from wolfharness_config.pool_server to avoid heavy imports at CLI startup TransportType = Literal["stdio", "sse", "streamable-http"] if TYPE_CHECKING: - from agentpool import ChatMessage + from wolfharness import ChatMessage logger = log.get_logger(__name__) @@ -45,10 +45,10 @@ def on_message(message: ChatMessage[Any]) -> None: async def run_server() -> None: - from agentpool import AgentPool, AgentsManifest - from agentpool_config.context import ConfigContextManager - from agentpool_config.pool_server import MCPPoolServerConfig - from agentpool_server.mcp_server.server import MCPServer + from wolfharness import AgentPool, AgentsManifest + from wolfharness_config.context import ConfigContextManager + from wolfharness_config.pool_server import MCPPoolServerConfig + from wolfharness_server.mcp_server.server import MCPServer logger.info("Server PID", pid=os.getpid()) # Load manifest and create pool (without server config) @@ -67,14 +67,14 @@ async def run_server() -> None: async with pool, server: _consumer_task: asyncio.Task[None] | None = None if show_messages: - from agentpool.agents.events import StreamCompleteEvent + from wolfharness.agents.events import StreamCompleteEvent _event_bus = pool.session_pool.event_bus if pool.session_pool is not None else None if _event_bus is not None: async def _consume_stream_complete() -> None: """Subscribe to EventBus and print completed messages.""" - from agentpool.orchestrator.core import drain_and_merge + from wolfharness.orchestrator.core import drain_and_merge stream: Any = None try: diff --git a/src/agentpool_cli/serve_opencode.py b/src/wolfharness_cli/serve_opencode.py similarity index 86% rename from src/agentpool_cli/serve_opencode.py rename to src/wolfharness_cli/serve_opencode.py index 610e4b41c..7281a0209 100644 --- a/src/agentpool_cli/serve_opencode.py +++ b/src/wolfharness_cli/serve_opencode.py @@ -4,9 +4,9 @@ allowing OpenCode TUI and SDK clients to interact with AgentPool agents. Configuration is resolved from multiple layers (in precedence order): -1. Global config (~/.config/agentpool/agentpool.yml) +1. Global config (~/.config/wolfharness/wolfharness.yml) 2. Custom config (AGENTPOOL_CONFIG env var) -3. Project config (agentpool.yml in project/git root) +3. Project config (wolfharness.yml in project/git root) 4. Explicit CLI argument (highest precedence) 5. Built-in fallback (only if no agents defined elsewhere) """ @@ -19,8 +19,8 @@ from platformdirs import user_log_path import typer as t -from agentpool_cli import log -from agentpool_cli.cli_types import LogLevel # noqa: TC001 +from wolfharness_cli import log +from wolfharness_cli.cli_types import LogLevel # noqa: TC001 logger = log.get_logger(__name__) @@ -48,12 +48,12 @@ def _configure_observability_and_logging( manifest: Any, host: str, port: int, resolved: Any, log_level: str = "info" ) -> None: """Initialize observability and configure file logging.""" - from agentpool import log as ap_log - from agentpool.observability import registry + from wolfharness import log as ap_log + from wolfharness.observability import registry registry.configure_observability(manifest.observability) - log_dir = user_log_path("agentpool", appauthor=False) + log_dir = user_log_path("wolfharness", appauthor=False) log_dir.mkdir(parents=True, exist_ok=True) log_file = log_dir / "opencode.log" ap_log.configure_logging(level=log_level.upper(), force=True, log_file=str(log_file)) @@ -104,9 +104,9 @@ def opencode_command( Configuration Layers (merged in order, later overrides earlier): - 1. Global config - ~/.config/agentpool/agentpool.yml for user preferences + 1. Global config - ~/.config/wolfharness/wolfharness.yml for user preferences 2. Custom config - AGENTPOOL_CONFIG env var for CI/deployment overrides - 3. Project config - agentpool.yml in project/git root for project-specific settings + 3. Project config - wolfharness.yml in project/git root for project-specific settings 4. Explicit config - CLI argument (highest precedence) 5. Built-in fallback - Only used if no agents defined in any layer @@ -115,12 +115,12 @@ def opencode_command( the pool's default agent is used (set via 'default_agent' in config, or falls back to the first agent). """ - from agentpool import AgentPool - from agentpool.config_resources import ACP_ASSISTANT - from agentpool.models.manifest import AgentsManifest - from agentpool_config.context import ConfigContextManager - from agentpool_config.resolution import resolve_config - from agentpool_server.opencode_server.server import OpenCodeServer + from wolfharness import AgentPool + from wolfharness.config_resources import ACP_ASSISTANT + from wolfharness.models.manifest import AgentsManifest + from wolfharness_config.context import ConfigContextManager + from wolfharness_config.resolution import resolve_config + from wolfharness_server.opencode_server.server import OpenCodeServer # Resolve configuration from all layers FIRST (before logging) # fallback_config is only used if no agents defined elsewhere diff --git a/src/agentpool_cli/serve_vercel.py b/src/wolfharness_cli/serve_vercel.py similarity index 95% rename from src/agentpool_cli/serve_vercel.py rename to src/wolfharness_cli/serve_vercel.py index faa9a608e..1d70dbf74 100644 --- a/src/agentpool_cli/serve_vercel.py +++ b/src/wolfharness_cli/serve_vercel.py @@ -9,13 +9,13 @@ import anyenv import typer as t -from agentpool_cli import log, resolve_agent_config +from wolfharness_cli import log, resolve_agent_config if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool import ChatMessage + from wolfharness import ChatMessage logger = log.get_logger(__name__) @@ -53,9 +53,9 @@ def vercel_command( # noqa: PLR0915 from starlette.responses import JSONResponse, Response, StreamingResponse import uvicorn - from agentpool import AgentPool, AgentsManifest - from agentpool.agents.events import StreamCompleteEvent, UserMessageInsertedEvent - from agentpool_config.context import ConfigContextManager + from wolfharness import AgentPool, AgentsManifest + from wolfharness.agents.events import StreamCompleteEvent, UserMessageInsertedEvent + from wolfharness_config.context import ConfigContextManager logger.info("Server PID", pid=os.getpid()) @@ -135,7 +135,7 @@ async def chat(request: Request) -> Response: # noqa: PLR0915 # Determine which agent to use and create a per-request session # Vercel protocol is stateless — new session per HTTP request effective_agent_name = agent_name or pool.main_agent_name - from agentpool.utils.identifiers import generate_session_id + from wolfharness.utils.identifiers import generate_session_id session_id = generate_session_id() session_pool = pool.session_pool diff --git a/src/agentpool_cli/store.py b/src/wolfharness_cli/store.py similarity index 97% rename from src/agentpool_cli/store.py rename to src/wolfharness_cli/store.py index bcc2fbec9..ab64cc3c4 100644 --- a/src/agentpool_cli/store.py +++ b/src/wolfharness_cli/store.py @@ -5,7 +5,7 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, TypedDict -from agentpool_cli.log import get_logger +from wolfharness_cli.log import get_logger if TYPE_CHECKING: @@ -48,7 +48,7 @@ def config_dir(self) -> UPath: import platformdirs from upathtools import to_upath - return to_upath(platformdirs.user_config_dir("agentpool")) + return to_upath(platformdirs.user_config_dir("wolfharness")) @property def config_file(self) -> UPath: diff --git a/src/agentpool_cli/task.py b/src/wolfharness_cli/task.py similarity index 87% rename from src/agentpool_cli/task.py rename to src/wolfharness_cli/task.py index c6fb3b446..04237d774 100644 --- a/src/agentpool_cli/task.py +++ b/src/wolfharness_cli/task.py @@ -9,20 +9,20 @@ import typer as t -from agentpool.agents.events import StreamCompleteEvent -from agentpool_cli import log, resolve_agent_config +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness_cli import log, resolve_agent_config if TYPE_CHECKING: - from agentpool import AgentsManifest + from wolfharness import AgentsManifest TASK_HELP = """ Execute a defined task with the specified agent. Example: - agentpool task docs write_api_docs --prompt "Include code examples" - agentpool task docs write_api_docs --log-level DEBUG + wolfharness task docs write_api_docs --prompt "Include code examples" + wolfharness task docs write_api_docs --log-level DEBUG """ @@ -34,7 +34,7 @@ async def execute_job( prompt: str | None = None, ) -> str: """Execute task with agent.""" - from agentpool import AgentPool + from wolfharness import AgentPool async with AgentPool(config) as pool: sp = pool.session_pool @@ -84,8 +84,8 @@ def task_command( prompt: Annotated[str | None, t.Option("--prompt", "-p", help="Additional prompt")] = None, ) -> None: """Execute a task with the specified agent.""" - from agentpool import AgentsManifest - from agentpool_config.context import ConfigContextManager + from wolfharness import AgentsManifest + from wolfharness_config.context import ConfigContextManager logger = log.get_logger(__name__) try: diff --git a/src/agentpool_cli/ui.py b/src/wolfharness_cli/ui.py similarity index 93% rename from src/agentpool_cli/ui.py rename to src/wolfharness_cli/ui.py index 32fa7468b..2e056fc62 100644 --- a/src/agentpool_cli/ui.py +++ b/src/wolfharness_cli/ui.py @@ -14,7 +14,7 @@ import typer as t -from agentpool_cli import log +from wolfharness_cli import log logger = log.get_logger(__name__) @@ -60,17 +60,17 @@ def opencode_ui_command( Examples: # Start server + TUI - agentpool ui opencode + wolfharness ui opencode # Use specific config and agent - agentpool ui opencode agents.yml --agent myagent + wolfharness ui opencode agents.yml --agent myagent # Custom port - agentpool ui opencode --port 8080 + wolfharness ui opencode --port 8080 # Attach to existing server (no server startup) - agentpool ui opencode --attach - agentpool ui opencode --attach --port 8080 + wolfharness ui opencode --attach + wolfharness ui opencode --attach --port 8080 """ url = f"http://{host}:{port}" # Attach-only mode: just launch TUI @@ -82,7 +82,7 @@ def opencode_ui_command( logger.warning("OpenCode TUI exited with non-zero status", code=result.returncode) return # Build server command - server_cmd = ["agentpool", "serve-opencode", "--host", host, "--port", str(port)] + server_cmd = ["wolfharness", "serve-opencode", "--host", host, "--port", str(port)] if config: server_cmd.append(config) if agent: @@ -148,21 +148,21 @@ def toad_ui_command( ) -> None: """Launch Toad TUI for ACP agents. - By default uses stdio transport where Toad spawns the agentpool server. + By default uses stdio transport where Toad spawns the wolfharness server. With --websocket, starts a WebSocket ACP server in the background first. Examples: # Direct stdio (Toad spawns server) - agentpool ui toad + wolfharness ui toad # Use specific config - agentpool ui toad agents.yml + wolfharness ui toad agents.yml # WebSocket transport - agentpool ui toad --websocket + wolfharness ui toad --websocket # WebSocket with custom port - agentpool ui toad --websocket --port 9000 + wolfharness ui toad --websocket --port 9000 """ if websocket: _run_toad_websocket(config, port) @@ -172,14 +172,14 @@ def toad_ui_command( def _run_toad_stdio(config: str | None) -> None: """Run Toad with stdio transport (Toad spawns server).""" - # Build agentpool command that Toad will spawn - agentpool_cmd = "agentpool serve-acp" + # Build wolfharness command that Toad will spawn + wolfharness_cmd = "wolfharness serve-acp" if config: - agentpool_cmd += f" {config}" + wolfharness_cmd += f" {config}" os.system("clear" if os.name != "nt" else "cls") - # Run toad with agentpool as subprocess + # Run toad with wolfharness as subprocess result = subprocess.run( - ["uvx", "--from", "batrachian-toad@latest", "toad", "acp", agentpool_cmd], + ["uvx", "--from", "batrachian-toad@latest", "toad", "acp", wolfharness_cmd], check=False, ) if result.returncode not in {0, 130}: # 130 = Ctrl+C @@ -192,7 +192,7 @@ def _run_toad_websocket(config: str | None, port: int) -> None: # Build server command server_cmd = [ - "agentpool", + "wolfharness", "serve-acp", "--transport", "streamable-http", @@ -274,20 +274,20 @@ def opencode_desktop_command( # noqa: PLR0915 Examples: # Start server, configure desktop app, and launch it - agentpool ui desktop + wolfharness ui desktop # Use specific config and agent - agentpool ui desktop agents.yml --agent myagent + wolfharness ui desktop agents.yml --agent myagent # Custom port - agentpool ui desktop --port 8080 + wolfharness ui desktop --port 8080 # Configure desktop to attach to existing server - agentpool ui desktop --attach - agentpool ui desktop --attach --port 8080 + wolfharness ui desktop --attach + wolfharness ui desktop --attach --port 8080 # After using --attach, reset to default (spawn local server) - agentpool ui desktop --attach --port 0 # port 0 clears the setting + wolfharness ui desktop --attach --port 0 # port 0 clears the setting """ url = f"http://{host}:{port}" # Determine config path based on platform @@ -388,7 +388,7 @@ def opencode_desktop_command( # noqa: PLR0915 # Default mode: Start server + launch desktop app # Build server command - server_cmd = ["agentpool", "serve-opencode", "--host", host, "--port", str(port)] + server_cmd = ["wolfharness", "serve-opencode", "--host", host, "--port", str(port)] if config: server_cmd.append(config) if agent: diff --git a/src/agentpool_cli/utils.py b/src/wolfharness_cli/utils.py similarity index 100% rename from src/agentpool_cli/utils.py rename to src/wolfharness_cli/utils.py diff --git a/src/agentpool_cli/watch.py b/src/wolfharness_cli/watch.py similarity index 89% rename from src/agentpool_cli/watch.py rename to src/wolfharness_cli/watch.py index e1f65a398..d5e8f1e6b 100644 --- a/src/agentpool_cli/watch.py +++ b/src/wolfharness_cli/watch.py @@ -7,7 +7,7 @@ import typer as t -from agentpool_cli import log +from wolfharness_cli import log logger = log.get_logger(__name__) @@ -31,8 +31,8 @@ def watch_command( """Run agents in event-watching mode.""" async def run_watch() -> None: - from agentpool import AgentPool, AgentsManifest - from agentpool_config.context import ConfigContextManager + from wolfharness import AgentPool, AgentsManifest + from wolfharness_config.context import ConfigContextManager with ConfigContextManager(config): manifest = AgentsManifest.from_file(config) diff --git a/src/wolfharness_commands/__init__.py b/src/wolfharness_commands/__init__.py new file mode 100644 index 000000000..3dcdf86a6 --- /dev/null +++ b/src/wolfharness_commands/__init__.py @@ -0,0 +1,192 @@ +"""Built-in commands for AgentPool.""" + +from __future__ import annotations + +from wolfharness_commands.agents import ( + CreateAgentCommand, + CreateTeamCommand, + ListAgentsCommand, + ShowAgentCommand, + # SwitchAgentCommand, +) +from wolfharness_commands.connections import ( + ConnectCommand, + DisconnectCommand, + ListConnectionsCommand, + DisconnectAllCommand, +) +from wolfharness_commands.history import SearchHistoryCommand +from wolfharness_commands.mcp import ( + AddMCPServerCommand, + AddRemoteMCPServerCommand, + ListMCPServersCommand, +) +from wolfharness_commands.models import SetModelCommand +from wolfharness_commands.prompts import ListPromptsCommand, ShowPromptCommand +from wolfharness_commands.resources import ( + ListResourcesCommand, + ShowResourceCommand, + AddResourceCommand, +) +from wolfharness_commands.session import ClearCommand, ResetCommand +from wolfharness_commands.read import ReadCommand +from wolfharness_commands.tools import ( + DisableToolCommand, + EnableToolCommand, + ListToolsCommand, + RegisterCodeToolCommand, + RegisterToolCommand, + ShowToolCommand, +) +from wolfharness_commands.workers import AddWorkerCommand, RemoveWorkerCommand, ListWorkersCommand +from wolfharness_commands.utils import ( + CopyClipboardCommand, + EditAgentFileCommand, + GetLogsCommand, + ShareHistoryCommand, +) +from wolfharness_commands.pool import ListPoolsCommand, SpawnCommand + +# CompactCommand is only for Native Agent (has its own history) +# Other agents (ClaudeCode, ACP, AGUI) don't control their own history +from wolfharness_commands.pool import CompactCommand # noqa: F401 +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from collections.abc import Sequence + + from slashed import BaseCommand + + +def get_agent_commands(**kwargs: Any) -> Sequence[BaseCommand]: + """Get commands that operate primarily on a single agent.""" + command_map = { + "enable_clear": ClearCommand(), + "enable_reset": ResetCommand(), + "enable_copy_clipboard": CopyClipboardCommand(), + "enable_share_history": ShareHistoryCommand(), + "enable_set_model": SetModelCommand(), + "enable_list_tools": ListToolsCommand(), + "enable_show_tool": ShowToolCommand(), + "enable_enable_tool": EnableToolCommand(), + "enable_disable_tool": DisableToolCommand(), + "enable_register_tool": RegisterToolCommand(), + "enable_register_code_tool": RegisterCodeToolCommand(), + "enable_list_resources": ListResourcesCommand(), + "enable_show_resource": ShowResourceCommand(), + "enable_add_resource": AddResourceCommand(), + "enable_list_prompts": ListPromptsCommand(), + "enable_show_prompt": ShowPromptCommand(), + "enable_add_worker": AddWorkerCommand(), + "enable_remove_worker": RemoveWorkerCommand(), + "enable_list_workers": ListWorkersCommand(), + "enable_connect": ConnectCommand(), + "enable_disconnect": DisconnectCommand(), + "enable_list_connections": ListConnectionsCommand(), + "enable_disconnect_all": DisconnectAllCommand(), + "enable_read": ReadCommand(), + "enable_add_mcp_server": AddMCPServerCommand(), + "enable_add_remote_mcp_server": AddRemoteMCPServerCommand(), + "enable_list_mcp_servers": ListMCPServersCommand(), + "enable_search_history": SearchHistoryCommand(), + "enable_get_logs": GetLogsCommand(), + } + return [command for flag, command in command_map.items() if kwargs.get(flag, True)] + + +def get_pool_commands(**kwargs: Any) -> Sequence[BaseCommand]: + """Get commands that operate on multiple agents or the pool itself.""" + command_map = { + "enable_create_agent": CreateAgentCommand(), + "enable_create_team": CreateTeamCommand(), + "enable_list_agents": ListAgentsCommand(), + "enable_show_agent": ShowAgentCommand(), + "enable_edit_agent_file": EditAgentFileCommand(), + "enable_list_pools": ListPoolsCommand(), + "enable_spawn": SpawnCommand(), + } + return [command for flag, command in command_map.items() if kwargs.get(flag, True)] + + +def get_commands( + *, + enable_clear: bool = True, + enable_reset: bool = True, + enable_copy_clipboard: bool = True, + enable_share_history: bool = True, + enable_set_model: bool = True, + enable_list_tools: bool = True, + enable_show_tool: bool = True, + enable_enable_tool: bool = True, + enable_disable_tool: bool = True, + enable_register_tool: bool = True, + enable_register_code_tool: bool = True, + enable_list_resources: bool = True, + enable_show_resource: bool = True, + enable_add_resource: bool = True, + enable_list_prompts: bool = True, + enable_show_prompt: bool = True, + enable_add_worker: bool = True, + enable_remove_worker: bool = True, + enable_list_workers: bool = True, + enable_connect: bool = True, + enable_disconnect: bool = True, + enable_list_connections: bool = True, + enable_disconnect_all: bool = True, + enable_read: bool = True, + enable_add_mcp_server: bool = True, + enable_add_remote_mcp_server: bool = True, + enable_list_mcp_servers: bool = True, + enable_search_history: bool = True, + enable_get_logs: bool = True, + enable_create_agent: bool = True, + enable_create_team: bool = True, + enable_list_agents: bool = True, + enable_show_agent: bool = True, + enable_edit_agent_file: bool = True, + enable_list_pools: bool = True, + enable_spawn: bool = True, +) -> list[BaseCommand]: + """Get all built-in commands.""" + agent_kwargs = { + "enable_clear": enable_clear, + "enable_reset": enable_reset, + "enable_copy_clipboard": enable_copy_clipboard, + "enable_share_history": enable_share_history, + "enable_set_model": enable_set_model, + "enable_list_tools": enable_list_tools, + "enable_show_tool": enable_show_tool, + "enable_enable_tool": enable_enable_tool, + "enable_disable_tool": enable_disable_tool, + "enable_register_tool": enable_register_tool, + "enable_register_code_tool": enable_register_code_tool, + "enable_list_resources": enable_list_resources, + "enable_show_resource": enable_show_resource, + "enable_add_resource": enable_add_resource, + "enable_list_prompts": enable_list_prompts, + "enable_show_prompt": enable_show_prompt, + "enable_add_worker": enable_add_worker, + "enable_remove_worker": enable_remove_worker, + "enable_list_workers": enable_list_workers, + "enable_connect": enable_connect, + "enable_disconnect": enable_disconnect, + "enable_list_connections": enable_list_connections, + "enable_disconnect_all": enable_disconnect_all, + "enable_read": enable_read, + "enable_add_mcp_server": enable_add_mcp_server, + "enable_add_remote_mcp_server": enable_add_remote_mcp_server, + "enable_list_mcp_servers": enable_list_mcp_servers, + "enable_search_history": enable_search_history, + "enable_get_logs": enable_get_logs, + } + pool_kwargs = { + "enable_create_agent": enable_create_agent, + "enable_create_team": enable_create_team, + "enable_list_agents": enable_list_agents, + "enable_show_agent": enable_show_agent, + "enable_edit_agent_file": enable_edit_agent_file, + "enable_list_pools": enable_list_pools, + "enable_spawn": enable_spawn, + } + + return [*get_agent_commands(**agent_kwargs), *get_pool_commands(**pool_kwargs)] diff --git a/src/agentpool_commands/agents.py b/src/wolfharness_commands/agents.py similarity index 94% rename from src/agentpool_commands/agents.py rename to src/wolfharness_commands/agents.py index ebc0b95a1..518f8e95a 100644 --- a/src/agentpool_commands/agents.py +++ b/src/wolfharness_commands/agents.py @@ -7,15 +7,15 @@ from slashed import CommandContext, CommandError from slashed.completers import CallbackCompleter -from agentpool.messaging.context import NodeContext # noqa: TC001 -from agentpool_commands.base import NodeCommand -from agentpool_commands.completers import get_available_agents, get_available_nodes -from agentpool_commands.markdown_utils import format_table +from wolfharness.messaging.context import NodeContext # noqa: TC001 +from wolfharness_commands.base import NodeCommand +from wolfharness_commands.completers import get_available_agents, get_available_nodes +from wolfharness_commands.markdown_utils import format_table if TYPE_CHECKING: - from agentpool.delegation import BaseTeam - from agentpool.messaging.messagenode import MessageNode + from wolfharness.delegation import BaseTeam + from wolfharness.messaging.messagenode import MessageNode class CreateAgentCommand(NodeCommand): @@ -242,7 +242,7 @@ async def execute_command( pool.agent_configs[name].get_agent(pool=pool) for name in node_names ] # Create the team - from agentpool.delegation.base_team import BaseTeam as TeamClass + from wolfharness.delegation.base_team import BaseTeam as TeamClass team: BaseTeam[Any, Any] = TeamClass( node_instances, diff --git a/src/wolfharness_commands/base.py b/src/wolfharness_commands/base.py new file mode 100644 index 000000000..79a25d72e --- /dev/null +++ b/src/wolfharness_commands/base.py @@ -0,0 +1,12 @@ +"""Base command class with node-type filtering support. + +Re-exports from ``wolfharness.commands.base`` for backward compatibility. +New code should import from ``wolfharness.commands.base`` directly. +""" + +from __future__ import annotations + +from wolfharness.commands.base import AgentCommand, NodeCommand + + +__all__ = ["AgentCommand", "NodeCommand"] diff --git a/src/agentpool_commands/commands.py b/src/wolfharness_commands/commands.py similarity index 83% rename from src/agentpool_commands/commands.py rename to src/wolfharness_commands/commands.py index 6cd02ee76..02b63b908 100644 --- a/src/agentpool_commands/commands.py +++ b/src/wolfharness_commands/commands.py @@ -4,10 +4,10 @@ from slashed import CommandContext # noqa: TC002 -from agentpool.log import get_logger -from agentpool.messaging.context import NodeContext # noqa: TC001 -from agentpool_commands.base import NodeCommand -from agentpool_commands.markdown_utils import format_table +from wolfharness.log import get_logger +from wolfharness.messaging.context import NodeContext # noqa: TC001 +from wolfharness_commands.base import NodeCommand +from wolfharness_commands.markdown_utils import format_table logger = get_logger(__name__) diff --git a/src/agentpool_commands/completers.py b/src/wolfharness_commands/completers.py similarity index 94% rename from src/agentpool_commands/completers.py rename to src/wolfharness_commands/completers.py index 4a47b5e5b..338254b86 100644 --- a/src/agentpool_commands/completers.py +++ b/src/wolfharness_commands/completers.py @@ -6,8 +6,8 @@ from slashed import CompletionItem, CompletionProvider -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.messaging.context import NodeContext # noqa: TC001 +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.messaging.context import NodeContext # noqa: TC001 if TYPE_CHECKING: @@ -15,7 +15,7 @@ from slashed import CompletionContext - from agentpool.agents.base_agent import AgentTypeLiteral + from wolfharness.agents.base_agent import AgentTypeLiteral def get_available_agents( diff --git a/src/agentpool_commands/connections.py b/src/wolfharness_commands/connections.py similarity index 95% rename from src/agentpool_commands/connections.py rename to src/wolfharness_commands/connections.py index d0ca5b005..af9cb5020 100644 --- a/src/agentpool_commands/connections.py +++ b/src/wolfharness_commands/connections.py @@ -8,11 +8,11 @@ from slashed import CommandContext, CommandError from slashed.completers import CallbackCompleter -from agentpool.log import get_logger -from agentpool.messaging import MessageNode -from agentpool.messaging.context import NodeContext # noqa: TC001 -from agentpool_commands.base import NodeCommand -from agentpool_commands.completers import get_available_nodes +from wolfharness.log import get_logger +from wolfharness.messaging import MessageNode +from wolfharness.messaging.context import NodeContext # noqa: TC001 +from wolfharness_commands.base import NodeCommand +from wolfharness_commands.completers import get_available_nodes logger = get_logger(__name__) diff --git a/src/agentpool_commands/history.py b/src/wolfharness_commands/history.py similarity index 89% rename from src/agentpool_commands/history.py rename to src/wolfharness_commands/history.py index 1e76f9406..0d8c54606 100644 --- a/src/agentpool_commands/history.py +++ b/src/wolfharness_commands/history.py @@ -4,8 +4,8 @@ from slashed import CommandContext, CommandError -from agentpool.messaging.context import NodeContext # noqa: TC001 -from agentpool_commands.base import NodeCommand +from wolfharness.messaging.context import NodeContext # noqa: TC001 +from wolfharness_commands.base import NodeCommand class SearchHistoryCommand(NodeCommand): @@ -46,7 +46,7 @@ async def execute_command( raise CommandError("No storage manager available for history search") try: - from agentpool_storage.formatters import format_output + from wolfharness_storage.formatters import format_output provider = ctx.context.agent.storage.get_history_provider() results = await provider.get_filtered_conversations( diff --git a/src/agentpool_commands/markdown_utils.py b/src/wolfharness_commands/markdown_utils.py similarity index 100% rename from src/agentpool_commands/markdown_utils.py rename to src/wolfharness_commands/markdown_utils.py diff --git a/src/agentpool_commands/mcp.py b/src/wolfharness_commands/mcp.py similarity index 89% rename from src/agentpool_commands/mcp.py rename to src/wolfharness_commands/mcp.py index 223e5afe5..7f3f17931 100644 --- a/src/agentpool_commands/mcp.py +++ b/src/wolfharness_commands/mcp.py @@ -7,13 +7,13 @@ from pydantic import HttpUrl from slashed import CommandContext, CommandError -from agentpool_commands.base import NodeCommand +from wolfharness_commands.base import NodeCommand if TYPE_CHECKING: - from agentpool.agents.context import AgentContext - from agentpool.messaging import MessageNode - from agentpool_config.mcp_server import MCPServerConfig + from wolfharness.agents.context import AgentContext + from wolfharness.messaging import MessageNode + from wolfharness_config.mcp_server import MCPServerConfig class AddMCPServerCommand(NodeCommand): @@ -35,7 +35,7 @@ class AddMCPServerCommand(NodeCommand): @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: - from agentpool import Agent + from wolfharness import Agent return isinstance(node, Agent) @@ -57,7 +57,7 @@ async def execute_command( args: Pipe-separated command arguments env: Pipe-separated environment variables (KEY=value format) """ - from agentpool_config.mcp_server import StdioMCPServerConfig + from wolfharness_config.mcp_server import StdioMCPServerConfig try: # Parse arguments @@ -96,7 +96,7 @@ class AddRemoteMCPServerCommand(NodeCommand): @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: - from agentpool import Agent + from wolfharness import Agent return isinstance(node, Agent) @@ -116,7 +116,7 @@ async def execute_command( url: Server URL endpoint transport: HTTP transport type (sse or streamable-http) """ - from agentpool_config.mcp_server import SSEMCPServerConfig, StreamableHTTPMCPServerConfig + from wolfharness_config.mcp_server import SSEMCPServerConfig, StreamableHTTPMCPServerConfig try: config: MCPServerConfig @@ -143,7 +143,7 @@ class ListMCPServersCommand(NodeCommand): @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: - from agentpool import Agent + from wolfharness import Agent return isinstance(node, Agent) @@ -153,7 +153,7 @@ async def execute_command(self, ctx: CommandContext[AgentContext]) -> None: Args: ctx: Command context """ - from agentpool_commands.markdown_utils import format_table + from wolfharness_commands.markdown_utils import format_table servers = ctx.context.agent.mcp.providers if not servers: diff --git a/src/agentpool_commands/models.py b/src/wolfharness_commands/models.py similarity index 90% rename from src/agentpool_commands/models.py rename to src/wolfharness_commands/models.py index eee6b6a02..2ab3bf5a7 100644 --- a/src/agentpool_commands/models.py +++ b/src/wolfharness_commands/models.py @@ -7,13 +7,13 @@ from slashed import CommandContext # noqa: TC002 from slashed.completers import CallbackCompleter -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool_commands.base import NodeCommand -from agentpool_commands.completers import get_model_names +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness_commands.base import NodeCommand +from wolfharness_commands.completers import get_model_names if TYPE_CHECKING: - from agentpool.messaging import MessageNode + from wolfharness.messaging import MessageNode class ListModelsCommand(NodeCommand): @@ -64,7 +64,7 @@ async def execute_command( @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: - from agentpool import ACPAgent, Agent + from wolfharness import ACPAgent, Agent return isinstance(node, Agent | ACPAgent) @@ -110,6 +110,6 @@ def get_completer(self) -> CallbackCompleter: @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: - from agentpool import ACPAgent, Agent + from wolfharness import ACPAgent, Agent return isinstance(node, Agent | ACPAgent) diff --git a/src/agentpool_commands/pool.py b/src/wolfharness_commands/pool.py similarity index 94% rename from src/agentpool_commands/pool.py rename to src/wolfharness_commands/pool.py index 4e023e6f4..12f797195 100644 --- a/src/agentpool_commands/pool.py +++ b/src/wolfharness_commands/pool.py @@ -4,14 +4,14 @@ from typing import TYPE_CHECKING, Any -from agentpool.agents.base_agent import BaseAgent -from agentpool_commands.base import NodeCommand +from wolfharness.agents.base_agent import BaseAgent +from wolfharness_commands.base import NodeCommand if TYPE_CHECKING: from slashed import CommandContext - from agentpool.messaging.context import NodeContext + from wolfharness.messaging.context import NodeContext class ListPoolsCommand(NodeCommand): @@ -30,7 +30,7 @@ async def execute_command(self, ctx: CommandContext[NodeContext[Any]]) -> None: Args: ctx: Command context with node context """ - from agentpool_cli import agent_store + from wolfharness_cli import agent_store pool = ctx.context.pool if pool is None: @@ -57,7 +57,7 @@ async def execute_command(self, ctx: CommandContext[NodeContext[Any]]) -> None: if not stored_configs: output_lines.append("*No stored configurations*") output_lines.append("") - output_lines.append("Use `agentpool add ` to add configurations.") + output_lines.append("Use `wolfharness add ` to add configurations.") else: # Build markdown table output_lines.append("| Name | Path |") @@ -111,7 +111,7 @@ async def execute_command( ctx: Command context with node context preset: Optional preset name (minimal, balanced, summarizing) """ - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent # Get agent from context agent = ctx.context.node @@ -128,7 +128,7 @@ async def execute_command( try: # Get compaction pipeline - from agentpool.messaging.compaction import ( + from wolfharness.messaging.compaction import ( balanced_context, minimal_context, summarizing_context, @@ -163,7 +163,7 @@ async def execute_command( await ctx.output.print("🔄 **Compacting conversation history...**") # Apply the pipeline using shared helper - from agentpool.messaging.compaction import compact_conversation + from wolfharness.messaging.compaction import compact_conversation original_count, compacted_count = await compact_conversation( pipeline, agent.conversation diff --git a/src/agentpool_commands/prompts.py b/src/wolfharness_commands/prompts.py similarity index 93% rename from src/agentpool_commands/prompts.py rename to src/wolfharness_commands/prompts.py index 8c3e3d692..346d93efb 100644 --- a/src/agentpool_commands/prompts.py +++ b/src/wolfharness_commands/prompts.py @@ -4,9 +4,9 @@ from slashed import CommandContext, CommandError -from agentpool.messaging.context import NodeContext # noqa: TC001 -from agentpool_commands.base import NodeCommand -from agentpool_commands.completers import PromptCompleter +from wolfharness.messaging.context import NodeContext # noqa: TC001 +from wolfharness_commands.base import NodeCommand +from wolfharness_commands.completers import PromptCompleter class ShowPromptCommand(NodeCommand): diff --git a/src/agentpool_config/py.typed b/src/wolfharness_commands/py.typed similarity index 100% rename from src/agentpool_config/py.typed rename to src/wolfharness_commands/py.typed diff --git a/src/agentpool_commands/read.py b/src/wolfharness_commands/read.py similarity index 89% rename from src/agentpool_commands/read.py rename to src/wolfharness_commands/read.py index 6cba70449..9cadcbaa4 100644 --- a/src/agentpool_commands/read.py +++ b/src/wolfharness_commands/read.py @@ -7,13 +7,13 @@ from slashed import CommandContext, CommandError from slashed.completers import PathCompleter -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.log import get_logger -from agentpool_commands.base import NodeCommand +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness_commands.base import NodeCommand if TYPE_CHECKING: - from agentpool.messaging import MessageNode + from wolfharness.messaging import MessageNode logger = get_logger(__name__) @@ -68,7 +68,7 @@ async def execute_command( @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: """Only available for Agent nodes.""" - from agentpool import Agent + from wolfharness import Agent return isinstance(node, Agent) diff --git a/src/agentpool_commands/resources.py b/src/wolfharness_commands/resources.py similarity index 96% rename from src/agentpool_commands/resources.py rename to src/wolfharness_commands/resources.py index 19c216d1d..2e715b468 100644 --- a/src/agentpool_commands/resources.py +++ b/src/wolfharness_commands/resources.py @@ -4,11 +4,11 @@ from slashed import CommandContext, CommandError -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.log import get_logger -from agentpool.messaging.context import NodeContext # noqa: TC001 -from agentpool_commands.base import AgentCommand, NodeCommand -from agentpool_commands.markdown_utils import format_table +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness.messaging.context import NodeContext # noqa: TC001 +from wolfharness_commands.base import AgentCommand, NodeCommand +from wolfharness_commands.markdown_utils import format_table logger = get_logger(__name__) diff --git a/src/agentpool_commands/session.py b/src/wolfharness_commands/session.py similarity index 90% rename from src/agentpool_commands/session.py rename to src/wolfharness_commands/session.py index 8186d0380..63b99be20 100644 --- a/src/agentpool_commands/session.py +++ b/src/wolfharness_commands/session.py @@ -4,8 +4,8 @@ from slashed import CommandContext # noqa: TC002 -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool_commands.base import AgentCommand +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness_commands.base import AgentCommand class ClearCommand(AgentCommand): diff --git a/src/agentpool_commands/text_sharing/__init__.py b/src/wolfharness_commands/text_sharing/__init__.py similarity index 85% rename from src/agentpool_commands/text_sharing/__init__.py rename to src/wolfharness_commands/text_sharing/__init__.py index 36d45413e..c309a067d 100644 --- a/src/agentpool_commands/text_sharing/__init__.py +++ b/src/wolfharness_commands/text_sharing/__init__.py @@ -4,12 +4,12 @@ from typing import Literal, assert_never, overload -from agentpool_commands.text_sharing.base import ShareResult, TextSharer, Visibility -from agentpool_commands.text_sharing.github_gist import GistSharer -from agentpool_commands.text_sharing.opencode import OpenCodeSharer -from agentpool_commands.text_sharing.paste_rs import PasteRsSharer -from agentpool_commands.text_sharing.pastebin import PastebinSharer -from agentpool_commands.text_sharing.shittycodingagent import ShittyCodingAgentSharer +from wolfharness_commands.text_sharing.base import ShareResult, TextSharer, Visibility +from wolfharness_commands.text_sharing.github_gist import GistSharer +from wolfharness_commands.text_sharing.opencode import OpenCodeSharer +from wolfharness_commands.text_sharing.paste_rs import PasteRsSharer +from wolfharness_commands.text_sharing.pastebin import PastebinSharer +from wolfharness_commands.text_sharing.shittycodingagent import ShittyCodingAgentSharer TextSharerStr = Literal["gist", "pastebin", "paste_rs", "opencode", "shittycodingagent"] diff --git a/src/agentpool_commands/text_sharing/base.py b/src/wolfharness_commands/text_sharing/base.py similarity index 98% rename from src/agentpool_commands/text_sharing/base.py rename to src/wolfharness_commands/text_sharing/base.py index c2a0fb1d9..cb76b54cb 100644 --- a/src/agentpool_commands/text_sharing/base.py +++ b/src/wolfharness_commands/text_sharing/base.py @@ -8,7 +8,7 @@ if TYPE_CHECKING: - from agentpool.messaging.message_history import MessageHistory + from wolfharness.messaging.message_history import MessageHistory Visibility = Literal["public", "unlisted", "private"] diff --git a/src/agentpool_commands/text_sharing/github_gist.py b/src/wolfharness_commands/text_sharing/github_gist.py similarity index 94% rename from src/agentpool_commands/text_sharing/github_gist.py rename to src/wolfharness_commands/text_sharing/github_gist.py index cefe52e33..762cb3d71 100644 --- a/src/agentpool_commands/text_sharing/github_gist.py +++ b/src/wolfharness_commands/text_sharing/github_gist.py @@ -5,11 +5,11 @@ import os from typing import TYPE_CHECKING, Any -from agentpool_commands.text_sharing.base import ShareResult, TextSharer +from wolfharness_commands.text_sharing.base import ShareResult, TextSharer if TYPE_CHECKING: - from agentpool_commands.text_sharing.base import Visibility + from wolfharness_commands.text_sharing.base import Visibility class GistSharer(TextSharer): diff --git a/src/agentpool_commands/text_sharing/opencode.py b/src/wolfharness_commands/text_sharing/opencode.py similarity index 97% rename from src/agentpool_commands/text_sharing/opencode.py rename to src/wolfharness_commands/text_sharing/opencode.py index 23f3d96e9..a0c2b0725 100644 --- a/src/agentpool_commands/text_sharing/opencode.py +++ b/src/wolfharness_commands/text_sharing/opencode.py @@ -29,15 +29,15 @@ import httpx -from agentpool.utils.time_utils import now_ms -from agentpool_commands.text_sharing.base import ShareResult, TextSharer +from wolfharness.utils.time_utils import now_ms +from wolfharness_commands.text_sharing.base import ShareResult, TextSharer if TYPE_CHECKING: from anyenv.text_sharing.base import Visibility - from agentpool.messaging.message_history import MessageHistory - from agentpool.messaging.messages import ChatMessage + from wolfharness.messaging.message_history import MessageHistory + from wolfharness.messaging.messages import ChatMessage class OpenCodeSharer(TextSharer): @@ -56,7 +56,7 @@ class OpenCodeSharer(TextSharer): Share a conversation: ```python - # Use share_conversation() with a Conversation object from agentpool + # Use share_conversation() with a Conversation object from wolfharness async with OpenCodeSharer() as sharer: result = await sharer.share_conversation( conversation, @@ -257,7 +257,7 @@ async def _share_messages( resp.raise_for_status() # Sync each message and its parts for chat_msg in messages: - from agentpool_server.opencode_server.converters import ( + from wolfharness_server.opencode_server.converters import ( chat_message_to_opencode, ) @@ -268,7 +268,7 @@ async def _share_messages( working_dir="/tmp", agent_name=chat_msg.name or "default", model_id=chat_msg.model_name or "unknown", - provider_id="agentpool", + provider_id="wolfharness", ) # Serialize to dicts with camelCase and no None values diff --git a/src/agentpool_commands/text_sharing/paste_rs.py b/src/wolfharness_commands/text_sharing/paste_rs.py similarity index 91% rename from src/agentpool_commands/text_sharing/paste_rs.py rename to src/wolfharness_commands/text_sharing/paste_rs.py index 8ed67ba3a..8a0477713 100644 --- a/src/agentpool_commands/text_sharing/paste_rs.py +++ b/src/wolfharness_commands/text_sharing/paste_rs.py @@ -4,11 +4,11 @@ from typing import TYPE_CHECKING -from agentpool_commands.text_sharing.base import ShareResult, TextSharer +from wolfharness_commands.text_sharing.base import ShareResult, TextSharer if TYPE_CHECKING: - from agentpool_commands.text_sharing.base import Visibility + from wolfharness_commands.text_sharing.base import Visibility class PasteRsSharer(TextSharer): diff --git a/src/agentpool_commands/text_sharing/pastebin.py b/src/wolfharness_commands/text_sharing/pastebin.py similarity index 96% rename from src/agentpool_commands/text_sharing/pastebin.py rename to src/wolfharness_commands/text_sharing/pastebin.py index 71d5ec858..dc2e686db 100644 --- a/src/agentpool_commands/text_sharing/pastebin.py +++ b/src/wolfharness_commands/text_sharing/pastebin.py @@ -5,11 +5,11 @@ import os from typing import TYPE_CHECKING, Any -from agentpool_commands.text_sharing.base import ShareResult, TextSharer +from wolfharness_commands.text_sharing.base import ShareResult, TextSharer if TYPE_CHECKING: - from agentpool_commands.text_sharing.base import Visibility + from wolfharness_commands.text_sharing.base import Visibility # Pastebin expiry values diff --git a/src/agentpool_commands/text_sharing/shittycodingagent.py b/src/wolfharness_commands/text_sharing/shittycodingagent.py similarity index 95% rename from src/agentpool_commands/text_sharing/shittycodingagent.py rename to src/wolfharness_commands/text_sharing/shittycodingagent.py index 2486cb85b..5edf43cb2 100644 --- a/src/agentpool_commands/text_sharing/shittycodingagent.py +++ b/src/wolfharness_commands/text_sharing/shittycodingagent.py @@ -8,11 +8,11 @@ import os from typing import TYPE_CHECKING, Any -from agentpool_commands.text_sharing.base import ShareResult, TextSharer +from wolfharness_commands.text_sharing.base import ShareResult, TextSharer if TYPE_CHECKING: - from agentpool_commands.text_sharing.base import Visibility + from wolfharness_commands.text_sharing.base import Visibility PREVIEW_BASE_URL = "https://shittycodingagent.ai/session" diff --git a/src/agentpool_commands/tools.py b/src/wolfharness_commands/tools.py similarity index 94% rename from src/agentpool_commands/tools.py rename to src/wolfharness_commands/tools.py index 34addae00..da2755c03 100644 --- a/src/agentpool_commands/tools.py +++ b/src/wolfharness_commands/tools.py @@ -7,15 +7,15 @@ from slashed import CommandContext, CommandError, CompletionContext from slashed.completers import CallbackCompleter -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.log import get_logger -from agentpool.utils.importing import import_callable -from agentpool_commands.base import NodeCommand -from agentpool_commands.markdown_utils import format_table +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness.utils.importing import import_callable +from wolfharness_commands.base import NodeCommand +from wolfharness_commands.markdown_utils import format_table if TYPE_CHECKING: - from agentpool.messaging import MessageNode + from wolfharness.messaging import MessageNode logger = get_logger(__name__) @@ -33,7 +33,7 @@ class ListToolsCommand(NodeCommand): @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: - from agentpool import Agent + from wolfharness import Agent return isinstance(node, Agent) @@ -82,7 +82,7 @@ class ShowToolCommand(NodeCommand): @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: - from agentpool import Agent + from wolfharness import Agent return isinstance(node, Agent) @@ -138,7 +138,7 @@ class EnableToolCommand(NodeCommand): @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: - from agentpool import Agent + from wolfharness import Agent return isinstance(node, Agent) @@ -177,7 +177,7 @@ class DisableToolCommand(NodeCommand): @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: - from agentpool import Agent + from wolfharness import Agent return isinstance(node, Agent) @@ -217,7 +217,7 @@ class RegisterToolCommand(NodeCommand): @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: - from agentpool import Agent + from wolfharness import Agent return isinstance(node, Agent) @@ -280,7 +280,7 @@ class RegisterCodeToolCommand(NodeCommand): @classmethod def supports_node(cls, node: MessageNode[Any, Any]) -> bool: - from agentpool import Agent + from wolfharness import Agent return isinstance(node, Agent) @@ -300,7 +300,7 @@ async def execute_command( name: Optional custom name for the tool description: Optional custom description """ - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool try: tool_obj = Tool.from_code(code, name=name, description=description) diff --git a/src/agentpool_commands/utils.py b/src/wolfharness_commands/utils.py similarity index 95% rename from src/agentpool_commands/utils.py rename to src/wolfharness_commands/utils.py index 698d7f286..59b1ea267 100644 --- a/src/agentpool_commands/utils.py +++ b/src/wolfharness_commands/utils.py @@ -8,12 +8,12 @@ from slashed import CommandContext, CommandError -from agentpool.messaging.context import NodeContext # noqa: TC001 -from agentpool_commands.base import NodeCommand +from wolfharness.messaging.context import NodeContext # noqa: TC001 +from wolfharness_commands.base import NodeCommand if TYPE_CHECKING: - from agentpool_commands.text_sharing import TextSharerStr, Visibility + from wolfharness_commands.text_sharing import TextSharerStr, Visibility LogLevel = Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] @@ -148,7 +148,7 @@ async def execute_command( syntax: Syntax highlighting (e.g., "python", "markdown") visibility: Visibility level """ - from agentpool_commands.text_sharing import get_sharer + from wolfharness_commands.text_sharing import get_sharer conversation = ctx.context.agent.conversation @@ -218,7 +218,7 @@ async def execute_command( logger_filter: Only show logs from loggers containing this string limit: Maximum number of log entries to return """ - from agentpool_toolsets.builtin.debug import get_memory_handler + from wolfharness_toolsets.builtin.debug import get_memory_handler # Convert limit to int (slashed passes args as strings) limit_int = int(limit) if isinstance(limit, str) else limit diff --git a/src/agentpool_commands/workers.py b/src/wolfharness_commands/workers.py similarity index 93% rename from src/agentpool_commands/workers.py rename to src/wolfharness_commands/workers.py index 8c7f24528..d336db01e 100644 --- a/src/agentpool_commands/workers.py +++ b/src/wolfharness_commands/workers.py @@ -7,12 +7,12 @@ from slashed import CommandContext, CommandError from slashed.completers import CallbackCompleter -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.log import get_logger -from agentpool.messaging.messagenode import MessageNode # noqa: TC001 -from agentpool_commands.base import AgentCommand -from agentpool_commands.completers import get_available_agents -from agentpool_commands.markdown_utils import format_table +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.log import get_logger +from wolfharness.messaging.messagenode import MessageNode # noqa: TC001 +from wolfharness_commands.base import AgentCommand +from wolfharness_commands.completers import get_available_agents +from wolfharness_commands.markdown_utils import format_table logger = get_logger(__name__) diff --git a/src/wolfharness_config/__init__.py b/src/wolfharness_config/__init__.py new file mode 100644 index 000000000..1f32e60be --- /dev/null +++ b/src/wolfharness_config/__init__.py @@ -0,0 +1,137 @@ +"""Core data models for AgentPool.""" + +from __future__ import annotations + + +from typing import Annotated +from pydantic import Field + +from wolfharness_config.tools import ImportToolConfig, BaseToolConfig +from wolfharness_config.wolfharness_tools import AgentpoolToolConfig +from wolfharness_config.builtin_tools import BuiltinToolConfig + +from wolfharness_config.capabilities import CapabilityConfig +from wolfharness_config.forward_targets import ForwardingTarget +from wolfharness_config.session import SessionQuery +from wolfharness_config.session_pool import ACPConfig, OpenCodeConfig, SessionPoolConfig +from wolfharness_config.teams import TeamConfig, TeamMemberConfig +from wolfharness_config.durable import CheckpointConfig, DeferredToolConfig +from wolfharness_config.mcp_server import ( + BaseMCPServerConfig, + StdioMCPServerConfig, + StreamableHTTPMCPServerConfig, + MCPServerConfig, + SSEMCPServerConfig, +) +from wolfharness_config.event_handlers import ( + BaseEventHandlerConfig, + StdoutEventHandlerConfig, + CallbackEventHandlerConfig, + EventHandlerConfig, + resolve_handler_configs, +) +from wolfharness_config.hooks import ( + BaseHookConfig, + CallableHookConfig, + CommandHookConfig, + HookConfig, + HooksConfig, + PromptHookConfig, +) +from wolfharness_config.graph_config import ( + GraphConfig, + GraphEdgeConfig, + GraphJoinConfig, + GraphStepConfig, +) +from wolfharness_config.graph_translation import ( + build_steps_from_agents, + translate_config_to_graph, + translate_connections_to_edges, + translate_team_to_graph, + translate_teams_to_graphs, +) +from wolfharness_config.toolsets import ToolsetConfig +from wolfharness_config.skills import SkillsConfig, DEFAULT_SKILLS_PATHS +from wolfharness_config.skill_commands import SkillSlashConfig, SkillCommandConfig +from wolfharness_config.resolution import ( + ConfigLayer, + ConfigSource, + ResolvedConfig, + find_project_config, + get_global_config_dir, + get_global_config_path, + resolve_config, + resolve_config_for_server, +) + + +ToolConfig = Annotated[ + ImportToolConfig | AgentpoolToolConfig, + Field(discriminator="type"), +] + +NativeAgentToolConfig = Annotated[ + ToolConfig | BuiltinToolConfig, + Field(discriminator="type"), +] + +# Unified type for all tool configurations (single tools + toolsets) +AnyToolConfig = Annotated[ + NativeAgentToolConfig | ToolsetConfig, + Field(discriminator="type"), +] +__all__ = [ + "DEFAULT_SKILLS_PATHS", + "ACPConfig", + "AnyToolConfig", + "BaseEventHandlerConfig", + "BaseHookConfig", + "BaseMCPServerConfig", + "BaseToolConfig", + "CallableHookConfig", + "CallbackEventHandlerConfig", + "CapabilityConfig", + "CheckpointConfig", + "CommandHookConfig", + "ConfigLayer", + "ConfigSource", + "DeferredToolConfig", + "EventHandlerConfig", + "ForwardingTarget", + "GraphConfig", + "GraphEdgeConfig", + "GraphJoinConfig", + "GraphStepConfig", + "HookConfig", + "HooksConfig", + "MCPServerConfig", + "NativeAgentToolConfig", + "OpenCodeConfig", + "PromptHookConfig", + "ResolvedConfig", + "SSEMCPServerConfig", + "SessionPoolConfig", + "SessionQuery", + "SkillCommandConfig", + "SkillSlashConfig", + "SkillsConfig", + "StdioMCPServerConfig", + "StdoutEventHandlerConfig", + "StreamableHTTPMCPServerConfig", + "TeamConfig", + "TeamMemberConfig", + "ToolConfig", + "ToolsetConfig", + "build_steps_from_agents", + "find_project_config", + "get_global_config_dir", + "get_global_config_path", + "resolve_config", + "resolve_config_for_server", + "resolve_handler_configs", + "translate_config_to_graph", + "translate_connections_to_edges", + "translate_team_to_graph", + "translate_teams_to_graphs", +] diff --git a/src/agentpool_config/builtin_tools.py b/src/wolfharness_config/builtin_tools.py similarity index 99% rename from src/agentpool_config/builtin_tools.py rename to src/wolfharness_config/builtin_tools.py index f731deba3..930734733 100644 --- a/src/agentpool_config/builtin_tools.py +++ b/src/wolfharness_config/builtin_tools.py @@ -16,7 +16,7 @@ ) from pydantic_ai.native_tools import ImageAspectRatio, WebSearchUserLocation # noqa: TC002 -from agentpool_config.tools import BaseToolConfig +from wolfharness_config.tools import BaseToolConfig if TYPE_CHECKING: diff --git a/src/agentpool_config/capabilities.py b/src/wolfharness_config/capabilities.py similarity index 94% rename from src/agentpool_config/capabilities.py rename to src/wolfharness_config/capabilities.py index cc23bfaae..f82ca43e4 100644 --- a/src/agentpool_config/capabilities.py +++ b/src/wolfharness_config/capabilities.py @@ -8,7 +8,7 @@ 1. **Built-in short names** (``loop_detection``, ``token_budget``, etc.) validated against typed config models. 2. **Entry-point names** (e.g. ``mermaid_lint``) resolved via the - ``agentpool.capabilities`` entry-point group using + ``wolfharness.capabilities`` entry-point group using :class:`EntryPointCapabilityConfig`. 3. **Python import paths** (e.g. ``pydantic_ai.capabilities.Instrumentation``) resolved via :class:`GenericCapabilityConfig` using ``__import__``. @@ -33,14 +33,16 @@ }) IMPORT_MAP: dict[str, str] = { - "loop_detection": "agentpool.capabilities.loop_detection.LoopDetectionCapability", - "token_budget": "agentpool.capabilities.token_budget.TokenBudgetCapability", - "tool_output_budget": ("agentpool.capabilities.tool_output_budget.ToolOutputBudgetCapability"), - "dcp": "agentpool.capabilities.dcp.DynamicContextPruningCapability", - "skill_activation": "agentpool.capabilities.skill_manager_cap:SkillManagerCap", - "memory": "agentpool.capabilities.memory.MemoryCapability", - "modality_filter": "agentpool.capabilities.modality_filter.ModalityFilterCapability", - "viking": "agentpool.capabilities.viking.VikingCapability", + "loop_detection": "wolfharness.capabilities.loop_detection.LoopDetectionCapability", + "token_budget": "wolfharness.capabilities.token_budget.TokenBudgetCapability", + "tool_output_budget": ( + "wolfharness.capabilities.tool_output_budget.ToolOutputBudgetCapability" + ), + "dcp": "wolfharness.capabilities.dcp.DynamicContextPruningCapability", + "skill_activation": "wolfharness.capabilities.skill_manager_cap:SkillManagerCap", + "memory": "wolfharness.capabilities.memory.MemoryCapability", + "modality_filter": "wolfharness.capabilities.modality_filter.ModalityFilterCapability", + "viking": "wolfharness.capabilities.viking.VikingCapability", } @@ -227,7 +229,7 @@ class VikingCapabilityConfig(BaseModel): auto_ingest_sanitize: bool = True """Strip ```` and ```` XML blocks from messages before ingestion to prevent feedback loops.""" - auto_ingest_source_type: str = "agentpool" + auto_ingest_source_type: str = "wolfharness" """Source type metadata for ingested sessions.""" auto_ingest_keep_recent_turns: int = 0 """Number of recent turns to retain in the session after commit. @@ -305,14 +307,14 @@ class EntryPointCapabilityConfig(BaseModel): """Configuration for a capability loaded via entry-point name. Used when ``type`` matches a name registered in the - ``agentpool.capabilities`` entry-point group (e.g. ``"mermaid_lint"``). + ``wolfharness.capabilities`` entry-point group (e.g. ``"mermaid_lint"``). The entry-point registry maps short names to capability classes, enabling external packages to register capabilities without requiring users to know the full Python import path. """ type: str - """Entry-point name registered under ``agentpool.capabilities``.""" + """Entry-point name registered under ``wolfharness.capabilities``.""" args: dict[str, Any] = Field(default_factory=dict) """Arguments to pass to the capability constructor.""" @@ -321,10 +323,10 @@ def build(self) -> Any: """Resolve the entry-point name and instantiate the capability. Uses :mod:`importlib.metadata` directly to discover entry points - in the ``agentpool.capabilities`` group, avoiding a dependency - on the :mod:`agentpool` package (which would violate the - import-linter contract that ``agentpool_config`` must not import - from ``agentpool``). + in the ``wolfharness.capabilities`` group, avoiding a dependency + on the :mod:`wolfharness` package (which would violate the + import-linter contract that ``wolfharness_config`` must not import + from ``wolfharness``). Returns: Instantiated capability object. @@ -335,7 +337,7 @@ def build(self) -> Any: """ from importlib.metadata import entry_points - eps = entry_points(group="agentpool.capabilities") + eps = entry_points(group="wolfharness.capabilities") for ep in eps: if ep.name == self.type: cls = ep.load() diff --git a/src/agentpool_config/commands.py b/src/wolfharness_config/commands.py similarity index 100% rename from src/agentpool_config/commands.py rename to src/wolfharness_config/commands.py diff --git a/src/agentpool_config/compaction.py b/src/wolfharness_config/compaction.py similarity index 86% rename from src/agentpool_config/compaction.py rename to src/wolfharness_config/compaction.py index 5ef4d4532..4839a9eba 100644 --- a/src/agentpool_config/compaction.py +++ b/src/wolfharness_config/compaction.py @@ -9,7 +9,7 @@ if TYPE_CHECKING: - from agentpool.messaging.compaction import CompactionPipeline, CompactionStep + from wolfharness.messaging.compaction import CompactionPipeline, CompactionStep class FilterThinkingConfig(Schema): @@ -18,7 +18,7 @@ class FilterThinkingConfig(Schema): type: Literal["filter_thinking"] = "filter_thinking" def build(self) -> CompactionStep: - from agentpool.messaging.compaction import FilterThinking + from wolfharness.messaging.compaction import FilterThinking return FilterThinking() @@ -29,7 +29,7 @@ class FilterRetryPromptsConfig(Schema): type: Literal["filter_retry_prompts"] = "filter_retry_prompts" def build(self) -> CompactionStep: - from agentpool.messaging.compaction import FilterRetryPrompts + from wolfharness.messaging.compaction import FilterRetryPrompts return FilterRetryPrompts() @@ -41,7 +41,7 @@ class FilterBinaryContentConfig(Schema): keep_references: bool = False def build(self) -> CompactionStep: - from agentpool.messaging.compaction import FilterBinaryContent + from wolfharness.messaging.compaction import FilterBinaryContent return FilterBinaryContent(keep_references=self.keep_references) @@ -54,7 +54,7 @@ class FilterToolCallsConfig(Schema): include_only: list[str] | None = None def build(self) -> CompactionStep: - from agentpool.messaging.compaction import FilterToolCalls + from wolfharness.messaging.compaction import FilterToolCalls return FilterToolCalls(exclude_tools=self.exclude_tools, include_only=self.include_only) @@ -65,7 +65,7 @@ class FilterEmptyMessagesConfig(Schema): type: Literal["filter_empty"] = "filter_empty" def build(self) -> CompactionStep: - from agentpool.messaging.compaction import FilterEmptyMessages + from wolfharness.messaging.compaction import FilterEmptyMessages return FilterEmptyMessages() @@ -78,7 +78,7 @@ class TruncateToolOutputsConfig(Schema): suffix: str = "\n... [truncated]" def build(self) -> CompactionStep: - from agentpool.messaging.compaction import TruncateToolOutputs + from wolfharness.messaging.compaction import TruncateToolOutputs return TruncateToolOutputs(max_length=self.max_length, suffix=self.suffix) @@ -91,7 +91,7 @@ class TruncateTextPartsConfig(Schema): suffix: str = "\n... [truncated]" def build(self) -> CompactionStep: - from agentpool.messaging.compaction import TruncateTextParts + from wolfharness.messaging.compaction import TruncateTextParts return TruncateTextParts(max_length=self.max_length, suffix=self.suffix) @@ -104,7 +104,7 @@ class KeepLastMessagesConfig(Schema): count_pairs: bool = True def build(self) -> CompactionStep: - from agentpool.messaging.compaction import KeepLastMessages + from wolfharness.messaging.compaction import KeepLastMessages return KeepLastMessages(count=self.count, count_pairs=self.count_pairs) @@ -116,7 +116,7 @@ class KeepFirstMessagesConfig(Schema): count: int = 2 def build(self) -> CompactionStep: - from agentpool.messaging.compaction import KeepFirstMessages + from wolfharness.messaging.compaction import KeepFirstMessages return KeepFirstMessages(count=self.count) @@ -129,7 +129,7 @@ class KeepFirstAndLastConfig(Schema): last_count: int = 5 def build(self) -> CompactionStep: - from agentpool.messaging.compaction import KeepFirstAndLast + from wolfharness.messaging.compaction import KeepFirstAndLast return KeepFirstAndLast(first_count=self.first_count, last_count=self.last_count) @@ -142,7 +142,7 @@ class TokenBudgetConfig(Schema): model: str = "gpt-4o" def build(self) -> CompactionStep: - from agentpool.messaging.compaction import TokenBudget + from wolfharness.messaging.compaction import TokenBudget return TokenBudget(max_tokens=self.max_tokens, model=self.model) @@ -157,7 +157,7 @@ class SummarizeConfig(Schema): summary_prompt: str | None = None def build(self) -> CompactionStep: - from agentpool.messaging.compaction import Summarize + from wolfharness.messaging.compaction import Summarize kwargs: dict[str, Any] = { "model": self.model, @@ -177,7 +177,7 @@ class WhenMessageCountExceedsConfig(Schema): step: "CompactionStepConfig" def build(self) -> CompactionStep: - from agentpool.messaging.compaction import WhenMessageCountExceeds + from wolfharness.messaging.compaction import WhenMessageCountExceeds return WhenMessageCountExceeds(step=self.step.build(), threshold=self.threshold) @@ -239,7 +239,7 @@ class CompactionConfig(Schema): def build(self) -> CompactionPipeline: """Build a CompactionPipeline from this configuration.""" - from agentpool.messaging.compaction import ( + from wolfharness.messaging.compaction import ( CompactionPipeline, balanced_context, minimal_context, diff --git a/src/agentpool_config/conditions.py b/src/wolfharness_config/conditions.py similarity index 97% rename from src/agentpool_config/conditions.py rename to src/wolfharness_config/conditions.py index a3a33b764..c0c371c27 100644 --- a/src/agentpool_config/conditions.py +++ b/src/wolfharness_config/conditions.py @@ -11,7 +11,7 @@ if TYPE_CHECKING: - from agentpool.talk.registry import EventContext + from wolfharness.talk.registry import EventContext class ConnectionCondition(Schema): @@ -55,7 +55,7 @@ class Jinja2Condition(ConnectionCondition): async def check(self, context: EventContext[Any]) -> bool: from jinjarope import Environment - from agentpool.utils.time_utils import get_now + from wolfharness.utils.time_utils import get_now env = Environment(trim_blocks=True, lstrip_blocks=True, enable_async=True) template = env.from_string(self.template) @@ -147,7 +147,7 @@ class TimeCondition(ConnectionCondition): async def check(self, context: EventContext[Any]) -> bool: """Check if time duration has elapsed.""" - from agentpool.utils.time_utils import get_now + from wolfharness.utils.time_utils import get_now elapsed = get_now() - context.stats.start_time return elapsed >= self.duration @@ -247,7 +247,7 @@ class CallableCondition(ConnectionCondition): async def check(self, context: EventContext[Any]) -> bool: """Execute predicate function.""" - from agentpool.utils.inspection import execute + from wolfharness.utils.inspection import execute val = await execute(self.predicate, context.message, context.stats) return bool(val) diff --git a/src/agentpool_config/context.py b/src/wolfharness_config/context.py similarity index 97% rename from src/agentpool_config/context.py rename to src/wolfharness_config/context.py index fcb3dd28e..cf493d7a9 100644 --- a/src/agentpool_config/context.py +++ b/src/wolfharness_config/context.py @@ -98,7 +98,7 @@ def __enter__(self) -> Self: self._token = CONFIG_DIR.set(self._config_dir) import logging - logging.getLogger("agentpool.config").debug( + logging.getLogger("wolfharness.config").debug( "ConfigContextManager.__enter__: set _config_dir_global=%s, previous=%s", _config_dir_global, self._previous_dir, @@ -120,7 +120,7 @@ def __exit__( _config_dir_global = self._previous_dir import logging - logging.getLogger("agentpool.config").debug( + logging.getLogger("wolfharness.config").debug( "ConfigContextManager.__exit__: restored _config_dir_global=%s (was %s)", _config_dir_global, old_value, diff --git a/src/agentpool_config/converters.py b/src/wolfharness_config/converters.py similarity index 100% rename from src/agentpool_config/converters.py rename to src/wolfharness_config/converters.py diff --git a/src/agentpool_config/durable.py b/src/wolfharness_config/durable.py similarity index 99% rename from src/agentpool_config/durable.py rename to src/wolfharness_config/durable.py index c696a2fb3..8a3a1a36d 100644 --- a/src/agentpool_config/durable.py +++ b/src/wolfharness_config/durable.py @@ -8,7 +8,7 @@ from pydantic import ConfigDict, Field, field_validator from schemez import Schema -from agentpool.utils.parse_time import parse_time_period +from wolfharness.utils.parse_time import parse_time_period class BaseDurableExecutionConfig(Schema): diff --git a/src/agentpool_config/event_handlers.py b/src/wolfharness_config/event_handlers.py similarity index 97% rename from src/agentpool_config/event_handlers.py rename to src/wolfharness_config/event_handlers.py index cd1b67238..9755c51b3 100644 --- a/src/agentpool_config/event_handlers.py +++ b/src/wolfharness_config/event_handlers.py @@ -12,7 +12,7 @@ if TYPE_CHECKING: from collections.abc import Sequence - from agentpool.common_types import IndividualEventHandler + from wolfharness.common_types import IndividualEventHandler StdOutStyle = Literal["simple", "detailed"] @@ -363,7 +363,7 @@ class StdoutEventHandlerConfig(BaseEventHandlerConfig): def get_handler(self) -> IndividualEventHandler: """Get the builtin event handler.""" - from agentpool.agents.events import detailed_print_handler, simple_print_handler + from wolfharness.agents.events import detailed_print_handler, simple_print_handler handlers = {"simple": simple_print_handler, "detailed": detailed_print_handler} return handlers[self.handler] @@ -387,7 +387,7 @@ class CallbackEventHandlerConfig(BaseEventHandlerConfig): def get_handler(self) -> IndividualEventHandler: """Import and return the callback handler.""" - from agentpool.utils.importing import import_callable + from wolfharness.utils.importing import import_callable return import_callable(self.import_path) @@ -423,7 +423,7 @@ class FileStreamEventHandlerConfig(BaseEventHandlerConfig): def get_handler(self) -> IndividualEventHandler: """Create and return the file stream handler.""" - from agentpool.agents.events.builtin_handlers import create_file_stream_handler + from wolfharness.agents.events.builtin_handlers import create_file_stream_handler return create_file_stream_handler( path=self.path, @@ -498,7 +498,7 @@ class TTSEventHandlerConfig(BaseEventHandlerConfig): def get_handler(self) -> IndividualEventHandler: """Get the TTS event handler.""" - from agentpool.agents.events.tts_handlers import OpenAITTSEventHandler + from wolfharness.agents.events.tts_handlers import OpenAITTSEventHandler key = self.api_key.get_secret_value() if self.api_key else None return OpenAITTSEventHandler( @@ -595,7 +595,7 @@ class EdgeTTSEventHandlerConfig(BaseEventHandlerConfig): def get_handler(self) -> IndividualEventHandler: """Get the Edge TTS event handler.""" - from agentpool.agents.events.tts_handlers import EdgeTTSEventHandler + from wolfharness.agents.events.tts_handlers import EdgeTTSEventHandler # Convert to Edge TTS string formats # speed: 1.0 -> "+0%", 1.5 -> "+50%", 0.5 -> "-50%" diff --git a/src/agentpool_config/events.py b/src/wolfharness_config/events.py similarity index 98% rename from src/agentpool_config/events.py rename to src/wolfharness_config/events.py index 741e36c4b..08d053814 100644 --- a/src/agentpool_config/events.py +++ b/src/wolfharness_config/events.py @@ -16,7 +16,7 @@ if TYPE_CHECKING: - from agentpool.messaging.events import ConnectionEventData + from wolfharness.messaging.events import ConnectionEventData ConnectionEventType = Literal[ diff --git a/src/agentpool_config/forward_targets.py b/src/wolfharness_config/forward_targets.py similarity index 95% rename from src/agentpool_config/forward_targets.py rename to src/wolfharness_config/forward_targets.py index 7e7df4f46..9350d9b2f 100644 --- a/src/agentpool_config/forward_targets.py +++ b/src/wolfharness_config/forward_targets.py @@ -11,7 +11,7 @@ from schemez import Schema from upathtools import to_upath -from agentpool_config.conditions import Condition +from wolfharness_config.conditions import Condition if TYPE_CHECKING: @@ -20,7 +20,7 @@ from pydantic_ai.models.function import FunctionModel from upathtools import UPath - from agentpool.messaging import ChatMessage, MessageNode + from wolfharness.messaging import ChatMessage, MessageNode ConnectionType = Literal["run", "context", "forward"] @@ -204,7 +204,7 @@ class FileConnectionConfig(ConnectionConfig): """File encoding to use.""" def get_node(self, nodes: Sequence[MessageNode[Any, Any]]) -> MessageNode[Any, Any]: - from agentpool import Agent + from wolfharness import Agent agent_name = f"file_writer_{Path(self.path).stem}" return Agent(model=self.get_model(), name=agent_name) @@ -218,7 +218,7 @@ def format_message(self, message: ChatMessage[Any]) -> str: def resolve_path(self, context: dict[str, str]) -> UPath: """Resolve path template with context variables.""" - from agentpool.utils.time_utils import get_now + from wolfharness.utils.time_utils import get_now now = get_now() date = now.strftime("%Y-%m-%d") @@ -230,7 +230,7 @@ def get_model(self) -> FunctionModel: """Get provider for file writing.""" from jinja2 import Template - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model path_obj = to_upath(self.path) template_obj = Template(self.template) @@ -270,8 +270,8 @@ def process_message(message: ChatMessage[Any], **kwargs) -> Any """Additional kwargs to pass to the callable.""" def get_node(self, nodes: Sequence[MessageNode[Any, Any]]) -> MessageNode[Any, Any]: - from agentpool import Agent - from agentpool.utils.inspection import get_fn_name + from wolfharness import Agent + from wolfharness.utils.inspection import get_fn_name return Agent(model=self.get_model(), name=get_fn_name(self.callable)) @@ -280,13 +280,13 @@ async def process_message(self, message: ChatMessage[Any]) -> Any: Handles both sync and async callables transparently. """ - from agentpool.utils.inspection import execute + from wolfharness.utils.inspection import execute return await execute(self.callable, message, **self.kw_args) def get_model(self) -> FunctionModel: """Get provider for callable.""" - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model return function_to_model(self.callable) diff --git a/src/agentpool_config/graph_config.py b/src/wolfharness_config/graph_config.py similarity index 98% rename from src/agentpool_config/graph_config.py rename to src/wolfharness_config/graph_config.py index 1ba6e7d5d..6508bc958 100644 --- a/src/agentpool_config/graph_config.py +++ b/src/wolfharness_config/graph_config.py @@ -14,8 +14,8 @@ from pydantic import ConfigDict, Field, ImportString, model_serializer from schemez import Schema -from agentpool_config.conditions import Condition -from agentpool_config.mcp_server import MCPServerConfig +from wolfharness_config.conditions import Condition +from wolfharness_config.mcp_server import MCPServerConfig class GraphStepConfig(Schema): diff --git a/src/agentpool_config/graph_translation.py b/src/wolfharness_config/graph_translation.py similarity index 97% rename from src/agentpool_config/graph_translation.py rename to src/wolfharness_config/graph_translation.py index a8e3f26a9..e30047ae8 100644 --- a/src/agentpool_config/graph_translation.py +++ b/src/wolfharness_config/graph_translation.py @@ -45,12 +45,12 @@ from typing import TYPE_CHECKING, Any -from agentpool_config.graph_config import GraphConfig, GraphEdgeConfig, GraphStepConfig +from wolfharness_config.graph_config import GraphConfig, GraphEdgeConfig, GraphStepConfig if TYPE_CHECKING: - from agentpool_config.nodes import NodeConfig - from agentpool_config.teams import TeamConfig + from wolfharness_config.nodes import NodeConfig + from wolfharness_config.teams import TeamConfig def translate_team_to_graph( diff --git a/src/agentpool_config/hook_conditions.py b/src/wolfharness_config/hook_conditions.py similarity index 100% rename from src/agentpool_config/hook_conditions.py rename to src/wolfharness_config/hook_conditions.py diff --git a/src/agentpool_config/hooks.py b/src/wolfharness_config/hooks.py similarity index 96% rename from src/agentpool_config/hooks.py rename to src/wolfharness_config/hooks.py index 48e271726..eaaeb8c98 100644 --- a/src/agentpool_config/hooks.py +++ b/src/wolfharness_config/hooks.py @@ -12,7 +12,7 @@ if TYPE_CHECKING: from exxec import ExecutionEnvironment - from agentpool.hooks.base import Hook, HookEvent + from wolfharness.hooks.base import Hook, HookEvent class BaseHookConfig(Schema): @@ -111,7 +111,7 @@ class CommandHookConfig(BaseHookConfig): def get_hook(self, event: HookEvent) -> Hook: """Create runtime command hook.""" - from agentpool.hooks import CommandHook + from wolfharness.hooks import CommandHook return CommandHook( event=event, @@ -172,7 +172,7 @@ class CallableHookConfig(BaseHookConfig): def get_hook(self, event: HookEvent) -> Hook: """Create runtime callable hook.""" - from agentpool.hooks import CallableHook + from wolfharness.hooks import CallableHook return CallableHook( event=event, @@ -215,7 +215,7 @@ class PromptHookConfig(BaseHookConfig): def get_hook(self, event: HookEvent) -> Hook: """Create runtime prompt hook.""" - from agentpool.hooks import PromptHook + from wolfharness.hooks import PromptHook return PromptHook( event=event, @@ -284,7 +284,7 @@ def get_agent_hooks(self) -> AgentHooks: Returns: AgentHooks instance with all hooks instantiated. """ - from agentpool.hooks import AgentHooks + from wolfharness.hooks import AgentHooks return AgentHooks( pre_turn=[cfg.get_hook("pre_turn") for cfg in self.pre_turn], @@ -297,4 +297,4 @@ def get_agent_hooks(self) -> AgentHooks: # Import for type checking only - avoid circular imports if TYPE_CHECKING: - from agentpool.hooks import AgentHooks + from wolfharness.hooks import AgentHooks diff --git a/src/agentpool_config/instructions.py b/src/wolfharness_config/instructions.py similarity index 100% rename from src/agentpool_config/instructions.py rename to src/wolfharness_config/instructions.py diff --git a/src/agentpool_config/jinja.py b/src/wolfharness_config/jinja.py similarity index 99% rename from src/agentpool_config/jinja.py rename to src/wolfharness_config/jinja.py index 5b07cce1c..b74c0134e 100644 --- a/src/agentpool_config/jinja.py +++ b/src/wolfharness_config/jinja.py @@ -7,7 +7,7 @@ from pydantic import BaseModel, ConfigDict, Field from schemez import Schema -from agentpool_config import ToolConfig +from wolfharness_config import ToolConfig if TYPE_CHECKING: diff --git a/src/agentpool_config/knowledge.py b/src/wolfharness_config/knowledge.py similarity index 87% rename from src/agentpool_config/knowledge.py rename to src/wolfharness_config/knowledge.py index a2cec2d7c..7c5762060 100644 --- a/src/agentpool_config/knowledge.py +++ b/src/wolfharness_config/knowledge.py @@ -7,13 +7,13 @@ from pydantic import ConfigDict, Field from schemez import Schema -from agentpool_config.paths import ConfigPath +from wolfharness_config.paths import ConfigPath if TYPE_CHECKING: from upathtools import UPath - from agentpool.prompts.prompts import PromptType # noqa: TC004 + from wolfharness.prompts.prompts import PromptType # noqa: TC004 class Knowledge(Schema): @@ -22,7 +22,7 @@ class Knowledge(Schema): Supports both simple paths and rich resource types for content loading, plus AgentPool's prompt system for dynamic content generation. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/knowledge_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/knowledge_configuration/ """ model_config = ConfigDict(json_schema_extra={"title": "Knowledge Configuration"}) diff --git a/src/agentpool_config/lifecycle.py b/src/wolfharness_config/lifecycle.py similarity index 100% rename from src/agentpool_config/lifecycle.py rename to src/wolfharness_config/lifecycle.py diff --git a/src/agentpool_config/loaders.py b/src/wolfharness_config/loaders.py similarity index 98% rename from src/agentpool_config/loaders.py rename to src/wolfharness_config/loaders.py index 0b3df7af3..2ff02f88d 100644 --- a/src/agentpool_config/loaders.py +++ b/src/wolfharness_config/loaders.py @@ -11,8 +11,8 @@ from schemez import Schema from upathtools import to_upath -from agentpool.common_types import JsonObject -from agentpool.utils.importing import import_callable +from wolfharness.common_types import JsonObject +from wolfharness.utils.importing import import_callable class BaseResourceLoaderConfig(Schema): @@ -120,7 +120,7 @@ def is_templated(self) -> bool: @property def mime_type(self) -> str: """Get MIME type based on file extension.""" - from agentpool.mime_utils import guess_type + from wolfharness.mime_utils import guess_type return guess_type(str(self.path)) or "application/octet-stream" diff --git a/src/agentpool_config/mcp_server.py b/src/wolfharness_config/mcp_server.py similarity index 100% rename from src/agentpool_config/mcp_server.py rename to src/wolfharness_config/mcp_server.py diff --git a/src/agentpool_config/model_capabilities.py b/src/wolfharness_config/model_capabilities.py similarity index 100% rename from src/agentpool_config/model_capabilities.py rename to src/wolfharness_config/model_capabilities.py diff --git a/src/agentpool_config/nodes.py b/src/wolfharness_config/nodes.py similarity index 94% rename from src/agentpool_config/nodes.py rename to src/wolfharness_config/nodes.py index 1f3299829..29458b9e1 100644 --- a/src/agentpool_config/nodes.py +++ b/src/wolfharness_config/nodes.py @@ -11,28 +11,28 @@ from pydantic import ConfigDict, Field, HttpUrl, ImportString, field_validator from schemez import Schema -from agentpool_config.capabilities import CapabilityConfig -from agentpool_config.event_handlers import EventHandlerConfig, StdoutEventHandlerConfig -from agentpool_config.forward_targets import ( +from wolfharness_config.capabilities import CapabilityConfig +from wolfharness_config.event_handlers import EventHandlerConfig, StdoutEventHandlerConfig +from wolfharness_config.forward_targets import ( FileConnectionConfig, ForwardingTarget, NodeConnectionConfig, ) -from agentpool_config.hooks import HooksConfig -from agentpool_config.lifecycle import LifecycleConfig -from agentpool_config.mcp_server import ( +from wolfharness_config.hooks import HooksConfig +from wolfharness_config.lifecycle import LifecycleConfig +from wolfharness_config.mcp_server import ( BaseMCPServerConfig, MCPServerConfig, StdioMCPServerConfig, StreamableHTTPMCPServerConfig, ) -from agentpool_config.team_mode import TeamModeConfig +from wolfharness_config.team_mode import TeamModeConfig if TYPE_CHECKING: from exxec import ExecutionEnvironment - from agentpool.common_types import IndividualEventHandler + from wolfharness.common_types import IndividualEventHandler ToolConfirmationMode = Literal["always", "never", "per_tool"] @@ -164,7 +164,7 @@ def get_event_handlers(self) -> list[IndividualEventHandler]: Returns: List of event handler callables. """ - from agentpool_config.event_handlers import resolve_handler_configs + from wolfharness_config.event_handlers import resolve_handler_configs return resolve_handler_configs(self.event_handlers) @@ -307,7 +307,7 @@ class BaseAgentConfig(NodeConfig): """Per-agent team mode overlay. When non-None, merges with the global ``team_mode`` from the manifest - via :func:`agentpool_config.team_mode.resolve_team_mode` to produce + via :func:`wolfharness_config.team_mode.resolve_team_mode` to produce the effective team mode config for this agent. """ @@ -392,7 +392,7 @@ def parse_elicitation_timeout(cls, v: str | timedelta | float | None) -> timedel if isinstance(v, int | float): return timedelta(seconds=v) # Parse string like "5m", "1h", "300s" — simple inline parser - # to avoid importing from agentpool (layer separation). + # to avoid importing from wolfharness (layer separation). import re pattern = re.compile( diff --git a/src/agentpool_config/observability.py b/src/wolfharness_config/observability.py similarity index 99% rename from src/agentpool_config/observability.py rename to src/wolfharness_config/observability.py index 06a2c5dd7..6f79bccef 100644 --- a/src/agentpool_config/observability.py +++ b/src/wolfharness_config/observability.py @@ -19,7 +19,7 @@ class BaseObservabilityConfig(Schema): service_name: str | None = Field( default=None, - examples=["agentpool", "my-ai-service", "production-bot"], + examples=["wolfharness", "my-ai-service", "production-bot"], title="Service name", ) environment: str | None = Field( diff --git a/src/agentpool_config/output_types.py b/src/wolfharness_config/output_types.py similarity index 94% rename from src/agentpool_config/output_types.py rename to src/wolfharness_config/output_types.py index 4c75d3c3b..3af7aad63 100644 --- a/src/agentpool_config/output_types.py +++ b/src/wolfharness_config/output_types.py @@ -9,7 +9,7 @@ class StructuredResponseConfig(Schema): """Base class for response definitions. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/response_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/response_configuration/ """ response_schema: SchemaDef = Field( diff --git a/src/agentpool_config/paths.py b/src/wolfharness_config/paths.py similarity index 97% rename from src/agentpool_config/paths.py rename to src/wolfharness_config/paths.py index 1953340a8..1b698185b 100644 --- a/src/agentpool_config/paths.py +++ b/src/wolfharness_config/paths.py @@ -52,7 +52,7 @@ def resolve_config_path(path: str | UPath) -> UPath: return UPath(config_dir_env) / upath # Priority 4 & 5: Use get_config_dir() which checks both global and ContextVar - from agentpool_config.context import get_config_dir + from wolfharness_config.context import get_config_dir config_dir_ctx = get_config_dir() if config_dir_ctx is not None: diff --git a/src/agentpool_config/pool_server.py b/src/wolfharness_config/pool_server.py similarity index 100% rename from src/agentpool_config/pool_server.py rename to src/wolfharness_config/pool_server.py diff --git a/src/agentpool_config/prompt_hubs.py b/src/wolfharness_config/prompt_hubs.py similarity index 86% rename from src/agentpool_config/prompt_hubs.py rename to src/wolfharness_config/prompt_hubs.py index 8893e5c6b..c28301660 100644 --- a/src/agentpool_config/prompt_hubs.py +++ b/src/wolfharness_config/prompt_hubs.py @@ -10,10 +10,10 @@ if TYPE_CHECKING: - from agentpool_prompts.braintrust_hub import BraintrustPromptHub - from agentpool_prompts.fabric import FabricPromptHub - from agentpool_prompts.langfuse_hub import LangfusePromptHub - from agentpool_prompts.promptlayer_provider import PromptLayerProvider + from wolfharness_prompts.braintrust_hub import BraintrustPromptHub + from wolfharness_prompts.fabric import FabricPromptHub + from wolfharness_prompts.langfuse_hub import LangfusePromptHub + from wolfharness_prompts.promptlayer_provider import PromptLayerProvider class BasePromptHubConfig(Schema): @@ -37,7 +37,7 @@ class PromptLayerConfig(BasePromptHubConfig): """API key for the PromptLayer API.""" def get_provider(self) -> PromptLayerProvider: - from agentpool_prompts.promptlayer_provider import PromptLayerProvider + from wolfharness_prompts.promptlayer_provider import PromptLayerProvider return PromptLayerProvider(self) @@ -83,7 +83,7 @@ class LangfuseConfig(BasePromptHubConfig): """Timeout for fetching responses in seconds.""" def get_provider(self) -> LangfusePromptHub: - from agentpool_prompts.langfuse_hub import LangfusePromptHub + from wolfharness_prompts.langfuse_hub import LangfusePromptHub return LangfusePromptHub(self) @@ -107,7 +107,7 @@ class BraintrustConfig(BasePromptHubConfig): """Braintrust Project name.""" def get_provider(self) -> BraintrustPromptHub: - from agentpool_prompts.braintrust_hub import BraintrustPromptHub + from wolfharness_prompts.braintrust_hub import BraintrustPromptHub return BraintrustPromptHub(self) @@ -121,7 +121,7 @@ class FabricConfig(BasePromptHubConfig): """Configuration for Fabric GitHub prompt provider.""" def get_provider(self) -> FabricPromptHub: - from agentpool_prompts.fabric import FabricPromptHub + from wolfharness_prompts.fabric import FabricPromptHub return FabricPromptHub(self) diff --git a/src/agentpool_config/prompts.py b/src/wolfharness_config/prompts.py similarity index 99% rename from src/agentpool_config/prompts.py rename to src/wolfharness_config/prompts.py index a69966b74..39e3c8321 100644 --- a/src/agentpool_config/prompts.py +++ b/src/wolfharness_config/prompts.py @@ -10,7 +10,7 @@ from schemez import Schema from upathtools import UPath -from agentpool.log import get_logger +from wolfharness.log import get_logger logger = get_logger(__name__) diff --git a/src/agentpool_prompts/py.typed b/src/wolfharness_config/py.typed similarity index 100% rename from src/agentpool_prompts/py.typed rename to src/wolfharness_config/py.typed diff --git a/src/agentpool_config/resolution.py b/src/wolfharness_config/resolution.py similarity index 97% rename from src/agentpool_config/resolution.py rename to src/wolfharness_config/resolution.py index 15f7accfa..899343d88 100644 --- a/src/agentpool_config/resolution.py +++ b/src/wolfharness_config/resolution.py @@ -4,9 +4,9 @@ supporting multiple config layers that are deep-merged together. Precedence order (later overrides earlier): -1. Global config - ~/.config/agentpool/agentpool.yml - user preferences +1. Global config - ~/.config/wolfharness/wolfharness.yml - user preferences 2. Custom config - AGENTPOOL_CONFIG env var path -3. Project config - agentpool.yml in project/git root +3. Project config - wolfharness.yml in project/git root 4. Explicit config - CLI argument (highest precedence) 5. Fallback config - Only used if no agents defined in any other layer @@ -69,10 +69,10 @@ def get_layer(self, source: ConfigSource) -> ConfigLayer | None: # Standard config file names to search for CONFIG_FILE_NAMES: tuple[str, ...] = ( - "agentpool.yml", - "agentpool.yaml", - "agentpool.json", - "agentpool.jsonc", + "wolfharness.yml", + "wolfharness.yaml", + "wolfharness.json", + "wolfharness.jsonc", ) # Environment variable names @@ -87,9 +87,9 @@ def get_global_config_dir() -> Path: """Get the global configuration directory. Returns: - Path to ~/.config/agentpool (or platform equivalent) + Path to ~/.config/wolfharness (or platform equivalent) """ - return Path(platformdirs.user_config_dir("agentpool", appauthor=False)) + return Path(platformdirs.user_config_dir("wolfharness", appauthor=False)) def get_global_config_path() -> Path | None: @@ -115,7 +115,7 @@ def get_global_config_path() -> Path | None: def find_project_config(start_dir: JoinablePathLike | None = None) -> Path | None: """Find project config by traversing up to git root or filesystem root. - Searches for agentpool.yml/yaml/json in the current directory and parent + Searches for wolfharness.yml/yaml/json in the current directory and parent directories up to the nearest git repository root or filesystem root. Args: diff --git a/src/agentpool_config/session.py b/src/wolfharness_config/session.py similarity index 98% rename from src/agentpool_config/session.py rename to src/wolfharness_config/session.py index 83d08fcde..db8ca245d 100644 --- a/src/agentpool_config/session.py +++ b/src/wolfharness_config/session.py @@ -169,8 +169,8 @@ class SessionQuery(Schema): def get_time_cutoff(self) -> datetime | None: """Get datetime from time period string.""" - from agentpool.utils.parse_time import parse_time_period - from agentpool.utils.time_utils import get_now + from wolfharness.utils.parse_time import parse_time_period + from wolfharness.utils.time_utils import get_now if not self.since: return None diff --git a/src/agentpool_config/session_pool.py b/src/wolfharness_config/session_pool.py similarity index 97% rename from src/agentpool_config/session_pool.py rename to src/wolfharness_config/session_pool.py index 40203b1d3..8560ecfae 100644 --- a/src/agentpool_config/session_pool.py +++ b/src/wolfharness_config/session_pool.py @@ -5,7 +5,7 @@ from pydantic import ConfigDict, Field from schemez import Schema -from agentpool_config.durable import CheckpointConfig +from wolfharness_config.durable import CheckpointConfig class SessionPoolConfig(Schema): diff --git a/src/agentpool_config/skill_commands.py b/src/wolfharness_config/skill_commands.py similarity index 100% rename from src/agentpool_config/skill_commands.py rename to src/wolfharness_config/skill_commands.py diff --git a/src/agentpool_config/skills.py b/src/wolfharness_config/skills.py similarity index 98% rename from src/agentpool_config/skills.py rename to src/wolfharness_config/skills.py index b532c3d21..c40a52933 100644 --- a/src/agentpool_config/skills.py +++ b/src/wolfharness_config/skills.py @@ -9,11 +9,11 @@ from schemez import Schema from upathtools import UPath -from agentpool_config.paths import ConfigPath +from wolfharness_config.paths import ConfigPath if TYPE_CHECKING: - from agentpool_config.mcp_server import MCPServerConfig + from wolfharness_config.mcp_server import MCPServerConfig DEFAULT_SKILLS_PATHS = [ @@ -250,7 +250,7 @@ def to_mcp_server_config(self, name: str) -> MCPServerConfig: Raises: ValueError: If neither ``command`` nor ``url`` is specified. """ - from agentpool_config.mcp_server import ( + from wolfharness_config.mcp_server import ( StdioMCPServerConfig, StreamableHTTPMCPServerConfig, ) diff --git a/src/agentpool_config/storage.py b/src/wolfharness_config/storage.py similarity index 94% rename from src/agentpool_config/storage.py rename to src/wolfharness_config/storage.py index 9da0ed9d6..bb10c8af4 100644 --- a/src/agentpool_config/storage.py +++ b/src/wolfharness_config/storage.py @@ -16,13 +16,13 @@ if TYPE_CHECKING: from sqlalchemy.ext.asyncio import AsyncEngine - from agentpool_storage.base import StorageProvider + from wolfharness_storage.base import StorageProvider FilterMode = Literal["and", "override"] -APP_NAME: Final = "agentpool" -APP_AUTHOR: Final = "agentpool" +APP_NAME: Final = "wolfharness" +APP_AUTHOR: Final = "wolfharness" DATA_DIR: Final = Path(user_data_dir(APP_NAME, APP_AUTHOR)) DEFAULT_DB_NAME: Final = "history.db" DEFAULT_TITLE_PROMPT: Final = """\ @@ -141,7 +141,7 @@ def get_engine(self) -> AsyncEngine: def get_provider(self) -> StorageProvider: """Create a SQL storage provider instance.""" - from agentpool_storage.sql_provider import SQLModelProvider + from wolfharness_storage.sql_provider import SQLModelProvider return SQLModelProvider(self) @@ -165,7 +165,7 @@ class FileStorageConfig(BaseStorageProviderConfig): def get_provider(self) -> StorageProvider: """Create a file storage provider instance.""" - from agentpool_storage.file_provider import FileProvider + from wolfharness_storage.file_provider import FileProvider return FileProvider(self) @@ -180,7 +180,7 @@ class MemoryStorageConfig(BaseStorageProviderConfig): def get_provider(self) -> StorageProvider: """Create a memory storage provider instance.""" - from agentpool_storage.memory_provider import MemoryStorageProvider + from wolfharness_storage.memory_provider import MemoryStorageProvider return MemoryStorageProvider(self) @@ -206,7 +206,7 @@ class OpenCodeStorageConfig(BaseStorageProviderConfig): def get_provider(self) -> StorageProvider: """Create an OpenCode SQLite storage provider instance.""" - from agentpool_storage.opencode_provider import OpenCodeStorageProvider + from wolfharness_storage.opencode_provider import OpenCodeStorageProvider return OpenCodeStorageProvider(self) @@ -234,7 +234,7 @@ class ZedStorageConfig(BaseStorageProviderConfig): def get_provider(self) -> StorageProvider: """Create a Zed storage provider instance.""" - from agentpool_storage.zed_provider import ZedStorageProvider + from wolfharness_storage.zed_provider import ZedStorageProvider return ZedStorageProvider(self) @@ -253,7 +253,7 @@ class ACPStorageConfig(BaseStorageProviderConfig): def get_provider(self) -> StorageProvider: """Create an ACP storage provider instance.""" - from agentpool_storage.acp_provider import ACPStorageProvider + from wolfharness_storage.acp_provider import ACPStorageProvider return ACPStorageProvider(self) @@ -272,7 +272,7 @@ def get_provider(self) -> StorageProvider: class StorageConfig(Schema): """Global storage configuration. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/storage_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/storage_configuration/ """ providers: list[StorageProviderConfig] | None = Field( diff --git a/src/agentpool_config/system_prompts.py b/src/wolfharness_config/system_prompts.py similarity index 97% rename from src/agentpool_config/system_prompts.py rename to src/wolfharness_config/system_prompts.py index a320cd594..5e888a854 100644 --- a/src/agentpool_config/system_prompts.py +++ b/src/wolfharness_config/system_prompts.py @@ -8,8 +8,8 @@ from pydantic import ConfigDict, Field, ImportString from schemez import Schema -from agentpool_config.paths import ConfigPath -from agentpool_config.prompt_hubs import PromptHubConfig +from wolfharness_config.paths import ConfigPath +from wolfharness_config.prompt_hubs import PromptHubConfig SystemPromptCategory = Literal["role", "methodology", "quality", "task"] @@ -167,7 +167,7 @@ class PackagePromptConfig(BaseSystemPrompt): class PromptLibraryConfig(Schema): """Complete prompt configuration. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/prompt_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/prompt_configuration/ """ system_prompts: dict[str, StaticPromptConfig] = Field( diff --git a/src/agentpool_config/task.py b/src/wolfharness_config/task.py similarity index 89% rename from src/agentpool_config/task.py rename to src/wolfharness_config/task.py index 604101662..b6af4304b 100644 --- a/src/agentpool_config/task.py +++ b/src/wolfharness_config/task.py @@ -9,14 +9,14 @@ from pydantic import ConfigDict, Field, ImportString from schemez import Schema -from agentpool.tools.base import Tool -from agentpool_config.knowledge import Knowledge -from agentpool_config.tools import ImportToolConfig +from wolfharness.tools.base import Tool +from wolfharness_config.knowledge import Knowledge +from wolfharness_config.tools import ImportToolConfig if TYPE_CHECKING: - from agentpool.agents import Agent - from agentpool.prompts.prompts import BasePrompt # noqa: TC004 + from wolfharness.agents import Agent + from wolfharness.prompts.prompts import BasePrompt # noqa: TC004 class Job[TDeps, TResult = str](Schema): @@ -50,7 +50,7 @@ class Job[TDeps, TResult = str](Schema): """Human-readable description of what this task does""" prompt: str | ImportString[str] | BasePrompt = Field( - examples=["Analyze the following code", "agentpool.prompts.prompts:BasePrompt"], + examples=["Analyze the following code", "wolfharness.prompts.prompts:BasePrompt"], title="Task prompt", ) """The task instruction/prompt.""" @@ -66,7 +66,7 @@ class Job[TDeps, TResult = str](Schema): required_dependency: ImportString[type[TDeps]] | None = Field( default=None, validate_default=True, - examples=["agentpool.agents.context:AgentContext"], + examples=["wolfharness.agents.context:AgentContext"], title="Required dependencies", ) """Dependencies or context data needed for task execution""" @@ -113,7 +113,7 @@ async def can_be_executed_by(self, agent: Agent[Any, Any]) -> bool: # Check vision capabilities if self.requires_vision: - from agentpool.utils.model_capabilities import supports_vision + from wolfharness.utils.model_capabilities import supports_vision if not await supports_vision(agent.model_name): return False @@ -129,7 +129,7 @@ def tool_configs(self) -> list[ImportToolConfig]: ] async def get_prompt(self) -> str: - from agentpool.prompts.prompts import BasePrompt + from wolfharness.prompts.prompts import BasePrompt if isinstance(self.prompt, BasePrompt): messages = await self.prompt.format() diff --git a/src/agentpool_config/team_mode.py b/src/wolfharness_config/team_mode.py similarity index 100% rename from src/agentpool_config/team_mode.py rename to src/wolfharness_config/team_mode.py diff --git a/src/agentpool_config/teams.py b/src/wolfharness_config/teams.py similarity index 95% rename from src/agentpool_config/teams.py rename to src/wolfharness_config/teams.py index e7830b375..5ae61a578 100644 --- a/src/agentpool_config/teams.py +++ b/src/wolfharness_config/teams.py @@ -6,7 +6,7 @@ from pydantic import BaseModel, ConfigDict, Field -from agentpool_config.nodes import NodeConfig +from wolfharness_config.nodes import NodeConfig ExecutionMode = Literal["parallel", "sequential"] @@ -41,7 +41,7 @@ class TeamConfig(NodeConfig): Teams can be either parallel execution groups or sequential chains. They can contain both agents and other teams as members. - Docs: https://phil65.github.io/agentpool/YAML%20Configuration/team_configuration/ + Docs: https://phil65.github.io/wolfharness/YAML%20Configuration/team_configuration/ """ model_config = ConfigDict( diff --git a/src/agentpool_config/tools.py b/src/wolfharness_config/tools.py similarity index 97% rename from src/agentpool_config/tools.py rename to src/wolfharness_config/tools.py index 44be596a7..a69b810ab 100644 --- a/src/agentpool_config/tools.py +++ b/src/wolfharness_config/tools.py @@ -9,11 +9,11 @@ from pydantic import ConfigDict, Field, ImportString, field_validator from schemez import Schema -from agentpool.utils.parse_time import parse_time_period +from wolfharness.utils.parse_time import parse_time_period if TYPE_CHECKING: - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool class ToolHints(Schema): @@ -156,7 +156,7 @@ class ImportToolConfig(BaseToolConfig): def get_tool(self) -> Tool: """Import and create tool from configuration.""" - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool # Load prepare callable from import string if provided prepare_callable = None diff --git a/src/agentpool_config/toolsets.py b/src/wolfharness_config/toolsets.py similarity index 91% rename from src/agentpool_config/toolsets.py rename to src/wolfharness_config/toolsets.py index 450443f75..4b545a054 100644 --- a/src/agentpool_config/toolsets.py +++ b/src/wolfharness_config/toolsets.py @@ -20,10 +20,10 @@ from upathtools_config import FilesystemConfigType from upathtools_config.base import FileSystemConfig -from agentpool.models.model_configs import AnyModelConfig -from agentpool_config.converters import ConversionConfig -from agentpool_config.tools import ImportToolConfig -from agentpool_config.workers import AgentWorkerConfig, WorkerConfig +from wolfharness.models.model_configs import AnyModelConfig +from wolfharness_config.converters import ConversionConfig +from wolfharness_config.tools import ImportToolConfig +from wolfharness_config.workers import AgentWorkerConfig, WorkerConfig if TYPE_CHECKING: @@ -32,7 +32,7 @@ from pydantic_ai.capabilities import AbstractCapability from pydantic_ai.tools import RunContext, ToolDefinition - from agentpool_toolsets.search_toolset import SearchTools + from wolfharness_toolsets.search_toolset import SearchTools def _make_tool_filter( @@ -116,7 +116,7 @@ class OpenAPIToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create OpenAPI tools provider from this config.""" - from agentpool_toolsets.openapi import OpenAPITools + from wolfharness_toolsets.openapi import OpenAPITools base_url = str(self.base_url) if self.base_url else "" return OpenAPITools(spec=self.spec, base_url=base_url) @@ -143,7 +143,7 @@ class EntryPointToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create provider from this config.""" - from agentpool_toolsets.entry_points import EntryPointTools + from wolfharness_toolsets.entry_points import EntryPointTools return EntryPointTools(module=self.module) @@ -180,7 +180,7 @@ class ComposioToolSetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create provider from this config.""" - from agentpool_toolsets.composio_toolset import ComposioTools + from wolfharness_toolsets.composio_toolset import ComposioTools key = self.api_key.get_secret_value() if self.api_key else os.getenv("COMPOSIO_API_KEY") return ComposioTools(user_id=self.user_id, toolsets=self.toolsets, api_key=key) @@ -207,13 +207,13 @@ class SubagentToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create subagent tools provider.""" - from agentpool_toolsets.builtin.subagent_tools import SubagentTools + from wolfharness_toolsets.builtin.subagent_tools import SubagentTools provider = SubagentTools( name="subagent_tools", ) if self.tools is not None: - from agentpool.capabilities.filtered_toolset import FilteredToolsetCapability + from wolfharness.capabilities.filtered_toolset import FilteredToolsetCapability return FilteredToolsetCapability( provider, _make_tool_filter(cast(dict[str, bool], self.tools)) @@ -253,7 +253,7 @@ def get_workers(self) -> list[WorkerConfig]: def get_provider(self) -> AbstractCapability: """Create workers tools provider.""" - from agentpool_toolsets.builtin.workers import WorkersTools + from wolfharness_toolsets.builtin.workers import WorkersTools return WorkersTools(workers=self.get_workers(), name="workers") @@ -285,12 +285,12 @@ class ProcessManagementToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create Process management tools provider.""" - from agentpool_toolsets.builtin import ProcessManagementTools + from wolfharness_toolsets.builtin import ProcessManagementTools env = self.environment.get_provider() if self.environment else None provider = ProcessManagementTools(env=env, name="process_management") if self.tools is not None: - from agentpool.capabilities.filtered_toolset import FilteredToolsetCapability + from wolfharness.capabilities.filtered_toolset import FilteredToolsetCapability return FilteredToolsetCapability( provider, _make_tool_filter(cast(dict[str, bool], self.tools)) @@ -302,7 +302,7 @@ class SkillsToolsetConfig(BaseToolsetConfig): """Configuration for the skills toolset (deprecated). Skills are now auto-provided by - :class:`~agentpool.capabilities.skill_manager_cap.SkillManagerCap`, which + :class:`~wolfharness.capabilities.skill_manager_cap.SkillManagerCap`, which the pool registers at every agent. An explicit ``type: skills`` toolset is therefore a no-op: ``get_provider()`` returns an empty capability so config-driven setups keep working without error, and the @@ -341,7 +341,7 @@ class SkillsToolsetConfig(BaseToolsetConfig): """(Unused) Maximum number of skills to inject. Skill injection is controlled by - :class:`~agentpool_config.skills.SkillsInstructionConfig.inject` and + :class:`~wolfharness_config.skills.SkillsInstructionConfig.inject` and ``max_skills``; this per-toolset override has no effect since ``SkillManagerCap`` owns injection. """ @@ -363,11 +363,11 @@ def get_provider(self) -> AbstractCapability: DeprecationWarning, stacklevel=2, ) - from agentpool.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability provider = FunctionToolsetCapability(name="skills") if self.tools is not None: - from agentpool.capabilities.filtered_toolset import FilteredToolsetCapability + from wolfharness.capabilities.filtered_toolset import FilteredToolsetCapability return FilteredToolsetCapability( provider, _make_tool_filter(cast(dict[str, bool], self.tools)) @@ -402,12 +402,12 @@ class CodeToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create code tools provider.""" - from agentpool_toolsets.builtin.code import CodeTools + from wolfharness_toolsets.builtin.code import CodeTools env = self.environment.get_provider() if self.environment else None provider = CodeTools(env=env, name="code") if self.tools is not None: - from agentpool.capabilities.filtered_toolset import FilteredToolsetCapability + from wolfharness.capabilities.filtered_toolset import FilteredToolsetCapability return FilteredToolsetCapability( provider, _make_tool_filter(cast(dict[str, bool], self.tools)) @@ -540,8 +540,8 @@ class FSSpecToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create FSSpec filesystem tools provider.""" - from agentpool.prompts.conversion_manager import ConversionManager - from agentpool_toolsets.fsspec_toolset import FSSpecTools + from wolfharness.prompts.conversion_manager import ConversionManager + from wolfharness_toolsets.fsspec_toolset import FSSpecTools model = ( self.model @@ -598,7 +598,7 @@ class VFSToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create VFS registry filesystem tools provider.""" - from agentpool_toolsets.vfs_toolset import VFSTools + from wolfharness_toolsets.vfs_toolset import VFSTools return VFSTools(name="vfs") @@ -630,7 +630,7 @@ def get_provider(self) -> SearchTools: """Create search tools provider.""" from searchly import BaseSearchProviderConfig, NewsSearchProvider, WebSearchProvider - from agentpool_toolsets.search_toolset import SearchTools + from wolfharness_toolsets.search_toolset import SearchTools match self.web_search: case str(): @@ -681,7 +681,7 @@ class NotificationsToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create notifications tools provider.""" - from agentpool_toolsets.notifications import NotificationsTools + from wolfharness_toolsets.notifications import NotificationsTools return NotificationsTools(channels=self.channels) @@ -716,7 +716,7 @@ def get_provider(self) -> AbstractCapability: """Create custom provider from import path.""" from pydantic_ai.capabilities import AbstractCapability - from agentpool.utils.importing import import_class + from wolfharness.utils.importing import import_class provider_cls = import_class(self.import_path) if not issubclass(provider_cls, AbstractCapability): @@ -755,7 +755,7 @@ class AggregatingToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create aggregating provider.""" - from agentpool.capabilities.combined_toolset import CombinedToolsetCapability + from wolfharness.capabilities.combined_toolset import CombinedToolsetCapability capabilities = [p.get_provider() for p in self.toolsets] return CombinedToolsetCapability(capabilities=capabilities, name="aggregating") @@ -785,7 +785,7 @@ def get_provider(self) -> AbstractCapability: NOTE: This now delegates to CombinedToolsetCapability. """ - from agentpool.capabilities.combined_toolset import CombinedToolsetCapability + from wolfharness.capabilities.combined_toolset import CombinedToolsetCapability capabilities = [p.get_provider() for p in self.toolsets] return CombinedToolsetCapability(capabilities=capabilities, name="codemode") @@ -812,7 +812,7 @@ class RemoteCodeModeToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create Codemode toolset.""" - from agentpool.capabilities.combined_toolset import CombinedToolsetCapability + from wolfharness.capabilities.combined_toolset import CombinedToolsetCapability capabilities = [p.get_provider() for p in self.toolsets] return CombinedToolsetCapability(capabilities=capabilities, name="remote_codemode") @@ -847,7 +847,7 @@ class ImportToolsToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create static provider with imported tools.""" - from agentpool.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability tools = [tool_config.get_tool() for tool_config in self.tools] name = self.namespace or "import_tools" @@ -878,7 +878,7 @@ class ConfigCreationToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create config creation toolset.""" - from agentpool_toolsets.config_creation import ConfigCreationTools + from wolfharness_toolsets.config_creation import ConfigCreationTools name = self.namespace or "config_creation" return ConfigCreationTools(schema_path=self.schema_path, markup=self.markup, name=name) @@ -923,11 +923,11 @@ def get_provider(self) -> AbstractCapability: # TODO: Migrate PlanProvider to capability-native architecture. # The old PlanProvider was removed during M3 migration; plan tools # need to be reimplemented as a FunctionToolsetCapability subclass. - from agentpool.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability provider = FunctionToolsetCapability(name="plan") if self.tools is not None: - from agentpool.capabilities.filtered_toolset import FilteredToolsetCapability + from wolfharness.capabilities.filtered_toolset import FilteredToolsetCapability return FilteredToolsetCapability( provider, _make_tool_filter(cast(dict[str, bool], self.tools)) @@ -957,7 +957,7 @@ class DebugToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create debug tools provider.""" - from agentpool_toolsets.builtin.debug import DebugTools + from wolfharness_toolsets.builtin.debug import DebugTools return DebugTools(name=self.namespace or "debug") @@ -968,7 +968,7 @@ class MCPDiscoveryToolsetConfig(BaseToolsetConfig): Enables dynamic discovery and use of MCP servers without preloading tools. Uses semantic search over 1000+ indexed servers for intelligent matching. - Requires the `mcp-discovery` extra: `pip install agentpool[mcp-discovery]` + Requires the `mcp-discovery` extra: `pip install wolfharness[mcp-discovery]` """ model_config = ConfigDict( @@ -1001,7 +1001,7 @@ class MCPDiscoveryToolsetConfig(BaseToolsetConfig): def get_provider(self) -> AbstractCapability: """Create MCP discovery tools provider.""" - from agentpool_toolsets.mcp_discovery.toolset import MCPDiscoveryToolset + from wolfharness_toolsets.mcp_discovery.toolset import MCPDiscoveryToolset return MCPDiscoveryToolset( name=self.namespace or "mcp_discovery", @@ -1017,7 +1017,7 @@ class CronToolsetConfig(BaseToolsetConfig): Gives agents the ability to schedule, list, and remove recurring or one-shot jobs at runtime. Jobs are persisted to a JSON file. - Requires the ``bot`` extra: ``pip install agentpool[bot]`` + Requires the ``bot`` extra: ``pip install wolfharness[bot]`` """ model_config = ConfigDict( @@ -1031,9 +1031,9 @@ class CronToolsetConfig(BaseToolsetConfig): """Cron scheduling toolset.""" store_path: str = Field( - default="~/.agentpool/cron_jobs.json", + default="~/.wolfharness/cron_jobs.json", title="Job store path", - examples=["~/.agentpool/cron_jobs.json", "/tmp/cron.json"], + examples=["~/.wolfharness/cron_jobs.json", "/tmp/cron.json"], ) """Path to the JSON file where scheduled jobs are persisted.""" @@ -1041,8 +1041,8 @@ def get_provider(self) -> AbstractCapability: """Create cron tools provider.""" from pathlib import Path - from agentpool_bot.cron.service import CronService - from agentpool_toolsets.cron import CronTools + from wolfharness_bot.cron.service import CronService + from wolfharness_toolsets.cron import CronTools resolved = Path(self.store_path).expanduser() service = CronService(store_path=resolved) diff --git a/src/agentpool_config/agentpool_tools.py b/src/wolfharness_config/wolfharness_tools.py similarity index 93% rename from src/agentpool_config/agentpool_tools.py rename to src/wolfharness_config/wolfharness_tools.py index 3f713c2ef..575c770d5 100644 --- a/src/agentpool_config/agentpool_tools.py +++ b/src/wolfharness_config/wolfharness_tools.py @@ -1,4 +1,4 @@ -"""Models for agentpool standalone tool configuration.""" +"""Models for wolfharness standalone tool configuration.""" from __future__ import annotations @@ -8,12 +8,12 @@ from exxec_config import ExecutionEnvironmentConfig # noqa: TC002 from pydantic import ConfigDict, Field -from agentpool_config.converters import ConversionConfig # noqa: TC001 -from agentpool_config.tools import BaseToolConfig +from wolfharness_config.converters import ConversionConfig # noqa: TC001 +from wolfharness_config.tools import BaseToolConfig if TYPE_CHECKING: - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool class BashToolConfig(BaseToolConfig): @@ -59,7 +59,7 @@ class BashToolConfig(BaseToolConfig): def get_tool(self) -> Tool: """Convert config to BashTool instance.""" - from agentpool.tool_impls.bash import create_bash_tool + from wolfharness.tool_impls.bash import create_bash_tool env = self.environment.get_provider() if self.environment else None return create_bash_tool( @@ -89,7 +89,7 @@ class AgentCliToolConfig(BaseToolConfig): def get_tool(self) -> Tool: """Convert config to AgentCliTool instance.""" - from agentpool.tool_impls.agent_cli import create_agent_cli_tool + from wolfharness.tool_impls.agent_cli import create_agent_cli_tool return create_agent_cli_tool( name=self.name or "run_agent_cli_command", @@ -131,7 +131,7 @@ def get_tool(self) -> Tool: DeprecationWarning, stacklevel=2, ) - from agentpool.tool_impls.question import create_question_tool + from wolfharness.tool_impls.question import create_question_tool return create_question_tool( name=self.name or "question", @@ -167,7 +167,7 @@ class ExecuteCodeToolConfig(BaseToolConfig): def get_tool(self) -> Tool: """Convert config to ExecuteCodeTool instance.""" - from agentpool.tool_impls.execute_code import create_execute_code_tool + from wolfharness.tool_impls.execute_code import create_execute_code_tool env = self.environment.get_provider() if self.environment else None return create_execute_code_tool( @@ -254,7 +254,7 @@ class ReadToolConfig(BaseToolConfig): def get_tool(self) -> Tool: """Convert config to ReadTool instance.""" - from agentpool.tool_impls.read import create_read_tool + from wolfharness.tool_impls.read import create_read_tool env = self.environment.get_provider() if self.environment else None @@ -262,7 +262,7 @@ def get_tool(self) -> Tool: converter = None if self.conversion is not None: try: - from agentpool.prompts.conversion_manager import ConversionManager + from wolfharness.prompts.conversion_manager import ConversionManager converter = ConversionManager(self.conversion) except Exception: # noqa: BLE001 @@ -323,7 +323,7 @@ class ListDirectoryToolConfig(BaseToolConfig): def get_tool(self) -> Tool: """Convert config to ListDirectoryTool instance.""" - from agentpool.tool_impls.list_directory import create_list_directory_tool + from wolfharness.tool_impls.list_directory import create_list_directory_tool env = self.environment.get_provider() if self.environment else None return create_list_directory_tool( @@ -382,7 +382,7 @@ class GrepToolConfig(BaseToolConfig): def get_tool(self) -> Tool: """Convert config to GrepTool instance.""" - from agentpool.tool_impls.grep import create_grep_tool + from wolfharness.tool_impls.grep import create_grep_tool env = self.environment.get_provider() if self.environment else None return create_grep_tool( @@ -428,7 +428,7 @@ class DeletePathToolConfig(BaseToolConfig): def get_tool(self) -> Tool: """Convert config to DeletePathTool instance.""" - from agentpool.tool_impls.delete_path import create_delete_path_tool + from wolfharness.tool_impls.delete_path import create_delete_path_tool env = self.environment.get_provider() if self.environment else None return create_delete_path_tool( @@ -487,7 +487,7 @@ class DownloadFileToolConfig(BaseToolConfig): def get_tool(self) -> Tool: """Convert config to DownloadFileTool instance.""" - from agentpool.tool_impls.download_file import create_download_file_tool + from wolfharness.tool_impls.download_file import create_download_file_tool env = self.environment.get_provider() if self.environment else None return create_download_file_tool( @@ -501,7 +501,7 @@ def get_tool(self) -> Tool: ) -# Union type for agentpool tool configs +# Union type for wolfharness tool configs AgentpoolToolConfig = ( AgentCliToolConfig | QuestionToolConfig diff --git a/src/agentpool_config/workers.py b/src/wolfharness_config/workers.py similarity index 100% rename from src/agentpool_config/workers.py rename to src/wolfharness_config/workers.py diff --git a/src/wolfharness_prompts/__init__.py b/src/wolfharness_prompts/__init__.py new file mode 100644 index 000000000..61cbd8fcf --- /dev/null +++ b/src/wolfharness_prompts/__init__.py @@ -0,0 +1 @@ +"""Prompts package.""" diff --git a/src/agentpool_prompts/braintrust_hub.py b/src/wolfharness_prompts/braintrust_hub.py similarity index 97% rename from src/agentpool_prompts/braintrust_hub.py rename to src/wolfharness_prompts/braintrust_hub.py index a85cd22c4..d45656378 100644 --- a/src/agentpool_prompts/braintrust_hub.py +++ b/src/wolfharness_prompts/braintrust_hub.py @@ -11,8 +11,8 @@ from braintrust import init_logger, load_prompt import httpx -from agentpool.prompts.base import BasePromptProvider -from agentpool_config.prompt_hubs import BraintrustConfig +from wolfharness.prompts.base import BasePromptProvider +from wolfharness_config.prompt_hubs import BraintrustConfig @dataclass @@ -214,7 +214,7 @@ def get_prompts_by_model(self, model: str) -> list[str]: if __name__ == "__main__": import anyio - from agentpool_config.prompt_hubs import BraintrustConfig + from wolfharness_config.prompt_hubs import BraintrustConfig config = BraintrustConfig(project="test") prompt_hub = BraintrustPromptHub(config) diff --git a/src/agentpool_prompts/fabric.py b/src/wolfharness_prompts/fabric.py similarity index 93% rename from src/agentpool_prompts/fabric.py rename to src/wolfharness_prompts/fabric.py index ab6764e5c..66310ca20 100644 --- a/src/agentpool_prompts/fabric.py +++ b/src/wolfharness_prompts/fabric.py @@ -6,11 +6,11 @@ import httpx -from agentpool.prompts.base import BasePromptProvider +from wolfharness.prompts.base import BasePromptProvider if TYPE_CHECKING: - from agentpool_config.prompt_hubs import FabricConfig + from wolfharness_config.prompt_hubs import FabricConfig class FabricPromptHub(BasePromptProvider): @@ -58,7 +58,7 @@ async def list_prompts(self) -> list[str]: if __name__ == "__main__": import anyio - from agentpool_config.prompt_hubs import FabricConfig + from wolfharness_config.prompt_hubs import FabricConfig async def main() -> None: hub = FabricPromptHub(FabricConfig()) diff --git a/src/agentpool_prompts/langfuse_hub.py b/src/wolfharness_prompts/langfuse_hub.py similarity index 92% rename from src/agentpool_prompts/langfuse_hub.py rename to src/wolfharness_prompts/langfuse_hub.py index 076afa740..26d87d689 100644 --- a/src/agentpool_prompts/langfuse_hub.py +++ b/src/wolfharness_prompts/langfuse_hub.py @@ -6,11 +6,11 @@ from langfuse import Langfuse # pyright: ignore -from agentpool.prompts.base import BasePromptProvider +from wolfharness.prompts.base import BasePromptProvider if TYPE_CHECKING: - from agentpool_config.prompt_hubs import LangfuseConfig + from wolfharness_config.prompt_hubs import LangfuseConfig class LangfusePromptHub(BasePromptProvider): @@ -68,7 +68,7 @@ async def list_prompts(self) -> list[str]: import anyio from pydantic import SecretStr - from agentpool_config.prompt_hubs import LangfuseConfig + from wolfharness_config.prompt_hubs import LangfuseConfig config = LangfuseConfig(secret_key=SecretStr("test"), public_key=SecretStr("")) prompt_hub = LangfusePromptHub(config) diff --git a/src/agentpool_prompts/promptlayer_provider.py b/src/wolfharness_prompts/promptlayer_provider.py similarity index 89% rename from src/agentpool_prompts/promptlayer_provider.py rename to src/wolfharness_prompts/promptlayer_provider.py index a03c1d16b..16de76b56 100644 --- a/src/agentpool_prompts/promptlayer_provider.py +++ b/src/wolfharness_prompts/promptlayer_provider.py @@ -6,11 +6,11 @@ from promptlayer import PromptLayer -from agentpool.prompts.base import BasePromptProvider +from wolfharness.prompts.base import BasePromptProvider if TYPE_CHECKING: - from agentpool_config.prompt_hubs import PromptLayerConfig + from wolfharness_config.prompt_hubs import PromptLayerConfig class PromptLayerProvider(BasePromptProvider): @@ -48,7 +48,7 @@ async def list_prompts(self) -> list[str]: import anyio from pydantic import SecretStr - from agentpool_config.prompt_hubs import PromptLayerConfig + from wolfharness_config.prompt_hubs import PromptLayerConfig async def main() -> None: config = PromptLayerConfig(api_key=SecretStr("pl_480ead79b098fc25c63cdb4c95115deb")) diff --git a/src/agentpool_server/py.typed b/src/wolfharness_prompts/py.typed similarity index 100% rename from src/agentpool_server/py.typed rename to src/wolfharness_prompts/py.typed diff --git a/src/agentpool_server/AGENTS.md b/src/wolfharness_server/AGENTS.md similarity index 97% rename from src/agentpool_server/AGENTS.md rename to src/wolfharness_server/AGENTS.md index b219ed181..a398f055e 100644 --- a/src/agentpool_server/AGENTS.md +++ b/src/wolfharness_server/AGENTS.md @@ -1,4 +1,4 @@ -# agentpool_server — Protocol Servers +# wolfharness_server — Protocol Servers ## Overview @@ -56,7 +56,7 @@ - **OpenCode `session_pool_integration.py`** is 1442 lines — the largest file. It's the central bridge between OpenCode HTTP routes and SessionPool orchestration. Touch with caution. - **OpenCode `.rules`** file in the `opencode_server/` directory documents SDK integration conventions, logging setup, and endpoint status. It's a reference doc, not a linter config. - **ACP `acp_agent.py`** (1111 lines) implements all ACP protocol methods (`sessions/*`, `providers/*`, `tools/*`, etc.) by delegating to the SessionPool and EventBus. It's the ACP entry point. -- **ACP `session.py`** (905 lines) manages `ACPSession` state including MCP server registration, provider config, mode toggles, and the `CommandStore` for slash commands. It bridges to `agentpool_commands.base.NodeCommand`. +- **ACP `session.py`** (905 lines) manages `ACPSession` state including MCP server registration, provider config, mode toggles, and the `CommandStore` for slash commands. It bridges to `wolfharness_commands.base.NodeCommand`. - **ACP `event_converter.py`** (755 lines) is pure conversion logic (no I/O) and is fully testable without mocks. It tracks tool call state internally. - **OpenCode `event_processor.py`** (798 lines) translates `RichAgentStreamEvent` → OpenCode SSE events with recursive subagent handling. Each level gets its own `EventProcessorContext`. - **ACP `provider_router.py`** derives provider metadata from `model_variants` in the manifest, not from runtime model discovery. This is a static snapshot at server start. @@ -72,7 +72,7 @@ ### UserMessageInsertedEvent — ACP Server -The `UserMessageInsertedEvent` (defined in `agentpool.agents.events.events`) carries inserted user message content through the EventBus. For ACP, this is handled in two places: +The `UserMessageInsertedEvent` (defined in `wolfharness.agents.events.events`) carries inserted user message content through the EventBus. For ACP, this is handled in two places: **1. `_meta.delivery` extraction at `acp_agent.py:prompt()`** diff --git a/src/wolfharness_server/__init__.py b/src/wolfharness_server/__init__.py new file mode 100644 index 000000000..efd71d353 --- /dev/null +++ b/src/wolfharness_server/__init__.py @@ -0,0 +1,9 @@ +"""AgentPool Server implementations.""" + +from wolfharness_server.a2a_server import A2AServer +from wolfharness_server.aggregating_server import AggregatingServer +from wolfharness_server.agui_server import AGUIServer +from wolfharness_server.base import BaseServer +from wolfharness_server.http_server import HTTPServer + +__all__ = ["A2AServer", "AGUIServer", "AggregatingServer", "BaseServer", "HTTPServer"] diff --git a/src/agentpool_server/a2a_server/__init__.py b/src/wolfharness_server/a2a_server/__init__.py similarity index 100% rename from src/agentpool_server/a2a_server/__init__.py rename to src/wolfharness_server/a2a_server/__init__.py diff --git a/src/agentpool_server/a2a_server/a2a_types.py b/src/wolfharness_server/a2a_server/a2a_types.py similarity index 100% rename from src/agentpool_server/a2a_server/a2a_types.py rename to src/wolfharness_server/a2a_server/a2a_types.py diff --git a/src/agentpool_server/a2a_server/agent_worker.py b/src/wolfharness_server/a2a_server/agent_worker.py similarity index 99% rename from src/agentpool_server/a2a_server/agent_worker.py rename to src/wolfharness_server/a2a_server/agent_worker.py index 4fcc93b76..650da18b6 100644 --- a/src/agentpool_server/a2a_server/agent_worker.py +++ b/src/wolfharness_server/a2a_server/agent_worker.py @@ -44,7 +44,7 @@ from starlette.routing import Route from starlette.types import ExceptionHandler, Lifespan - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent @asynccontextmanager diff --git a/src/agentpool_server/a2a_server/server.py b/src/wolfharness_server/a2a_server/server.py similarity index 94% rename from src/agentpool_server/a2a_server/server.py rename to src/wolfharness_server/a2a_server/server.py index 6d8451974..63c7cf9a5 100644 --- a/src/agentpool_server/a2a_server/server.py +++ b/src/wolfharness_server/a2a_server/server.py @@ -1,4 +1,4 @@ -"""A2A server implementation for agentpool pool. +"""A2A server implementation for wolfharness pool. This module provides a server that exposes all agents in an AgentPool via the A2A (Agent-to-Agent) protocol, with each agent accessible at its own route. @@ -9,8 +9,8 @@ from functools import partial from typing import TYPE_CHECKING -from agentpool.log import get_logger -from agentpool_server.http_server import HTTPServer +from wolfharness.log import get_logger +from wolfharness_server.http_server import HTTPServer if TYPE_CHECKING: @@ -18,7 +18,7 @@ from starlette.responses import Response from starlette.routing import Route - from agentpool import AgentPool + from wolfharness import AgentPool logger = get_logger(__name__) @@ -79,7 +79,7 @@ async def get_routes(self) -> list[Route]: from starlette.responses import JSONResponse, Response from starlette.routing import Route - from agentpool_server.a2a_server.agent_worker import AgentWorker, worker_lifespan + from wolfharness_server.a2a_server.agent_worker import AgentWorker, worker_lifespan routes: list[Route] = [] # Create route for each agent in the pool @@ -89,7 +89,7 @@ async def agent_handler(request: Request, agent_name: str = agent_name) -> Respo """Handle A2A requests for a specific agent.""" try: # Create a session via SessionPool (unified creation path) - from agentpool.utils.identifiers import generate_session_id + from wolfharness.utils.identifiers import generate_session_id sp = self.pool.session_pool agent = None @@ -138,7 +138,7 @@ async def list_agents(request: Request) -> Response: """List all available agents.""" from starlette.responses import JSONResponse - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig agent_list = [ { diff --git a/src/agentpool_server/a2a_server/storage.py b/src/wolfharness_server/a2a_server/storage.py similarity index 92% rename from src/agentpool_server/a2a_server/storage.py rename to src/wolfharness_server/a2a_server/storage.py index 7d21d5657..8d223c255 100644 --- a/src/agentpool_server/a2a_server/storage.py +++ b/src/wolfharness_server/a2a_server/storage.py @@ -5,12 +5,12 @@ from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any -from agentpool_server.a2a_server.a2a_types import TaskData +from wolfharness_server.a2a_server.a2a_types import TaskData if TYPE_CHECKING: - from agentpool.messaging.messages import ChatMessage - from agentpool_server.a2a_server.a2a_types import A2ARequest, TaskStatus + from wolfharness.messaging.messages import ChatMessage + from wolfharness_server.a2a_server.a2a_types import A2ARequest, TaskStatus @dataclass diff --git a/src/wolfharness_server/acp_server/__init__.py b/src/wolfharness_server/acp_server/__init__.py new file mode 100644 index 000000000..d9fe66b17 --- /dev/null +++ b/src/wolfharness_server/acp_server/__init__.py @@ -0,0 +1,24 @@ +"""ACP (Agent Client Protocol) integration for wolfharness.""" + +from __future__ import annotations + +from wolfharness_server.acp_server.handler import ACPProtocolHandler +from wolfharness_server.acp_server.server import ACPServer +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness_server.acp_server.session import ACPSession +from wolfharness_server.acp_server.session_manager import ACPSessionManager +from wolfharness_server.acp_server.converters import ( + convert_acp_mcp_server_to_config, + from_acp_content, +) + + +__all__ = [ + "ACPProtocolHandler", + "ACPServer", + "ACPSession", + "ACPSessionManager", + "AgentPoolACPAgent", + "convert_acp_mcp_server_to_config", + "from_acp_content", +] diff --git a/src/agentpool_server/acp_server/acp_agent.py b/src/wolfharness_server/acp_server/acp_agent.py similarity index 96% rename from src/agentpool_server/acp_server/acp_agent.py rename to src/wolfharness_server/acp_server/acp_agent.py index 65602f7c0..d211b0f24 100644 --- a/src/agentpool_server/acp_server/acp_agent.py +++ b/src/wolfharness_server/acp_server/acp_agent.py @@ -41,12 +41,12 @@ SetSessionModeRequest, SetSessionModeResponse, ) -from agentpool.log import get_logger -from agentpool.utils.task_group import ManagedTaskGroup -from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager -from agentpool_server.acp_server.converters import to_session_config_option, to_session_info -from agentpool_server.acp_server.provider_router import ProviderRouter -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness.log import get_logger +from wolfharness.utils.task_group import ManagedTaskGroup +from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager +from wolfharness_server.acp_server.converters import to_session_config_option, to_session_info +from wolfharness_server.acp_server.provider_router import ProviderRouter +from wolfharness_server.acp_server.session_manager import ACPSessionManager if TYPE_CHECKING: @@ -71,12 +71,12 @@ SetSessionModeRequest, ) from acp.schema.mcp import AcpMcpServer - from agentpool.agents.base_agent import BaseAgent - from agentpool.host.context import HostContext - from agentpool.models.agents import NativeAgentConfig - from agentpool.storage.manager import SessionMetadataGeneratedEvent - from agentpool_server.acp_server.handler import ACPProtocolHandler - from agentpool_server.acp_server.server import ACPServer + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.host.context import HostContext + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.storage.manager import SessionMetadataGeneratedEvent + from wolfharness_server.acp_server.handler import ACPProtocolHandler + from wolfharness_server.acp_server.server import ACPServer logger = get_logger(__name__) @@ -97,7 +97,7 @@ async def get_session_model_state( Returns: SessionModelState with all available models, None if no models available """ - from agentpool_server.shared.model_utils import build_model_state_for_acp + from wolfharness_server.shared.model_utils import build_model_state_for_acp try: state = await build_model_state_for_acp(agent, provider_router) @@ -121,7 +121,7 @@ async def get_session_model_state( async def get_session_mode_state(agent: BaseAgent) -> SessionModeState | None: """Get SessionModeState from an agent using its get_modes() method. - Converts agentpool ModeCategory to ACP SessionModeState format. + Converts wolfharness ModeCategory to ACP SessionModeState format. Uses the first category that looks like permissions (not model). Args: @@ -274,7 +274,7 @@ def __post_init__(self) -> None: # RFC-0034: Initialize provider router with None manifest (will be updated in initialize) self.provider_router = ProviderRouter(None) # NEW: Cache agent config for per-session creation (RFC-0031) - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig ctx = self.host_context if ctx is not None and ctx.main_agent_name and ctx.main_agent_name in ctx.manifest.agents: @@ -288,8 +288,8 @@ def __post_init__(self) -> None: if self.host_context and ( self.host_context.manifest.acp and self.host_context.manifest.acp.use_session_pool ): - from agentpool_server.acp_server.event_converter import ACPEventConverter - from agentpool_server.acp_server.handler import ACPProtocolHandler + from wolfharness_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.handler import ACPProtocolHandler self._protocol_handler = ACPProtocolHandler( host_context=self.host_context, @@ -381,8 +381,8 @@ async def initialize(self, params: InitializeRequest) -> InitializeResponse: # True (optimistic) to preserve backward-compatible behavior. audio_prompts = True image_prompts = True - from agentpool.agents.native_agent.agent import Agent - from agentpool.models.model_configs import BaseModelConfig + from wolfharness.agents.native_agent.agent import Agent + from wolfharness.models.model_configs import BaseModelConfig # Derive modality support from the default agent's model config. # When the agent or its config is unavailable (e.g. test mocks), @@ -399,9 +399,9 @@ async def initialize(self, params: InitializeRequest) -> InitializeResponse: image_prompts = caps.image_input if caps.image_input is not None else True return InitializeResponse.create( protocol_version=version, - name="agentpool", + name="wolfharness", title="AgentPool", - version=_version("agentpool"), + version=_version("wolfharness"), load_session=True, list_sessions=True, resume_session=True, @@ -419,7 +419,7 @@ async def initialize(self, params: InitializeRequest) -> InitializeResponse: async def new_session(self, params: NewSessionRequest) -> NewSessionResponse: """Create a new session.""" - from agentpool.agents.acp_agent import ACPAgent as ACPAgentClient + from wolfharness.agents.acp_agent import ACPAgent as ACPAgentClient if not self._initialized: raise RuntimeError("Agent not initialized") @@ -497,7 +497,7 @@ async def load_session(self, params: LoadSessionRequest) -> LoadSessionResponse: Delegates to the agent's load_session method, which populates agent.conversation. Then replays the conversation to the client via ACP notifications. """ - from agentpool.agents.acp_agent import ACPAgent as ACPAgentClient + from wolfharness.agents.acp_agent import ACPAgent as ACPAgentClient if not self._initialized: raise RuntimeError("Agent not initialized") @@ -645,7 +645,7 @@ async def resume_session(self, params: ResumeSessionRequest) -> ResumeSessionRes UNSTABLE: This feature is not part of the spec yet. """ - from agentpool.agents.acp_agent import ACPAgent as ACPAgentClient + from wolfharness.agents.acp_agent import ACPAgent as ACPAgentClient if not self._initialized: raise RuntimeError("Agent not initialized") @@ -940,7 +940,7 @@ async def set_session_mode( Calls set_mode directly on the agent with the mode_id, allowing the agent to handle mode-specific logic (e.g., acceptEdits auto-allowing edit tools). """ - from agentpool.agents.acp_agent import ACPAgent as ACPAgentClient + from wolfharness.agents.acp_agent import ACPAgent as ACPAgentClient session = self.session_manager.get_session(params.session_id) if not session: @@ -996,7 +996,7 @@ async def set_session_model( # Also include resolved identifiers from StringModelConfig variants, # since configOptions sends resolved identifiers (e.g., "openai-chat:svc/glm-4.7") # while model_variants.keys() are variant names (e.g., "glm47"). - from agentpool.models.model_configs import StringModelConfig + from wolfharness.models.model_configs import StringModelConfig for config in manifest.model_variants.values(): if isinstance(config, StringModelConfig): @@ -1187,7 +1187,7 @@ async def swap_pool(self, config_path: str, agent_name: str | None = None) -> li # Re-resolve _agent_config from the new pool's manifest if ctx.main_agent_name and ctx.main_agent_name in ctx.manifest.agents: cfg = ctx.manifest.agents[ctx.main_agent_name] - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig if isinstance(cfg, NativeAgentConfig): if cfg.name is None: @@ -1195,7 +1195,7 @@ async def swap_pool(self, config_path: str, agent_name: str | None = None) -> li self._agent_config = cfg elif ctx.manifest.agents: cfg = next(iter(ctx.manifest.agents.values())) - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig if isinstance(cfg, NativeAgentConfig): self._agent_config = cfg diff --git a/src/agentpool_server/acp_server/acp_mcp_manager.py b/src/wolfharness_server/acp_server/acp_mcp_manager.py similarity index 99% rename from src/agentpool_server/acp_server/acp_mcp_manager.py rename to src/wolfharness_server/acp_server/acp_mcp_manager.py index cfbc0f91f..ffb076361 100644 --- a/src/agentpool_server/acp_server/acp_mcp_manager.py +++ b/src/wolfharness_server/acp_server/acp_mcp_manager.py @@ -11,7 +11,7 @@ import anyio -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -25,7 +25,7 @@ from mcp.types import JSONRPCMessage from pydantic import ValidationError -from agentpool.mcp_server.session_stream_pair import SessionStreamPair +from wolfharness.mcp_server.session_stream_pair import SessionStreamPair logger = get_logger(__name__) diff --git a/src/agentpool_server/acp_server/acp_mcp_transport.py b/src/wolfharness_server/acp_server/acp_mcp_transport.py similarity index 96% rename from src/agentpool_server/acp_server/acp_mcp_transport.py rename to src/wolfharness_server/acp_server/acp_mcp_transport.py index 21dd217ac..b6b1a7c99 100644 --- a/src/agentpool_server/acp_server/acp_mcp_transport.py +++ b/src/wolfharness_server/acp_server/acp_mcp_transport.py @@ -14,13 +14,13 @@ from fastmcp.client.transports import ClientTransport from mcp import ClientSession -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: from collections.abc import AsyncIterator, Callable - from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnection + from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnection logger = get_logger(__name__) diff --git a/src/agentpool_server/acp_server/commands/__init__.py b/src/wolfharness_server/acp_server/commands/__init__.py similarity index 100% rename from src/agentpool_server/acp_server/commands/__init__.py rename to src/wolfharness_server/acp_server/commands/__init__.py diff --git a/src/agentpool_server/acp_server/commands/debug_commands.py b/src/wolfharness_server/acp_server/commands/debug_commands.py similarity index 97% rename from src/agentpool_server/acp_server/commands/debug_commands.py rename to src/wolfharness_server/acp_server/commands/debug_commands.py index ea6c0c8fc..6a4db0498 100644 --- a/src/agentpool_server/acp_server/commands/debug_commands.py +++ b/src/wolfharness_server/acp_server/commands/debug_commands.py @@ -22,10 +22,10 @@ ToolCallStart, UserMessageChunk, ) -from agentpool.commands.base import NodeCommand -from agentpool.log import get_logger -from agentpool.messaging.context import NodeContext # noqa: TC001 -from agentpool_server.acp_server.session import ACPSession # noqa: TC001 +from wolfharness.commands.base import NodeCommand +from wolfharness.log import get_logger +from wolfharness.messaging.context import NodeContext # noqa: TC001 +from wolfharness_server.acp_server.session import ACPSession # noqa: TC001 logger = get_logger(__name__) @@ -368,7 +368,7 @@ class DebugSetPoolCommand(NodeCommand): client displays and the actual server state. The configuration can be specified as: - - A stored config name (from `agentpool add`) + - A stored config name (from `wolfharness add`) - A direct path to a configuration file Options: @@ -400,7 +400,7 @@ async def execute_command( import importlib from pathlib import Path as FilePath - agent_store = importlib.import_module("agentpool_cli").agent_store + agent_store = importlib.import_module("wolfharness_cli").agent_store session = ctx.context.data if not session: diff --git a/src/agentpool_server/acp_server/commands/docs_commands/__init__.py b/src/wolfharness_server/acp_server/commands/docs_commands/__init__.py similarity index 100% rename from src/agentpool_server/acp_server/commands/docs_commands/__init__.py rename to src/wolfharness_server/acp_server/commands/docs_commands/__init__.py diff --git a/src/agentpool_server/acp_server/commands/docs_commands/fetch_repo.py b/src/wolfharness_server/acp_server/commands/docs_commands/fetch_repo.py similarity index 96% rename from src/agentpool_server/acp_server/commands/docs_commands/fetch_repo.py rename to src/wolfharness_server/acp_server/commands/docs_commands/fetch_repo.py index 05cf3c7a3..86f57bbf1 100644 --- a/src/agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +++ b/src/wolfharness_server/acp_server/commands/docs_commands/fetch_repo.py @@ -9,10 +9,10 @@ from pydantic_ai import UserPromptPart from slashed import CommandContext # noqa: TC002 -from agentpool.commands.base import NodeCommand -from agentpool.log import get_logger -from agentpool.messaging.context import NodeContext # noqa: TC001 -from agentpool_server.acp_server.session import ACPSession # noqa: TC001 +from wolfharness.commands.base import NodeCommand +from wolfharness.log import get_logger +from wolfharness.messaging.context import NodeContext # noqa: TC001 +from wolfharness_server.acp_server.session import ACPSession # noqa: TC001 logger = get_logger(__name__) diff --git a/src/agentpool_server/acp_server/commands/docs_commands/get_schema.py b/src/wolfharness_server/acp_server/commands/docs_commands/get_schema.py similarity index 96% rename from src/agentpool_server/acp_server/commands/docs_commands/get_schema.py rename to src/wolfharness_server/acp_server/commands/docs_commands/get_schema.py index b86ba464e..2e12a9b60 100644 --- a/src/agentpool_server/acp_server/commands/docs_commands/get_schema.py +++ b/src/wolfharness_server/acp_server/commands/docs_commands/get_schema.py @@ -9,10 +9,10 @@ from schemez import jsonschema_to_code, openapi_to_code from slashed import CommandContext # noqa: TC002 -from agentpool.commands.base import NodeCommand -from agentpool.log import get_logger -from agentpool.messaging.context import NodeContext # noqa: TC001 -from agentpool_server.acp_server.session import ACPSession # noqa: TC001 +from wolfharness.commands.base import NodeCommand +from wolfharness.log import get_logger +from wolfharness.messaging.context import NodeContext # noqa: TC001 +from wolfharness_server.acp_server.session import ACPSession # noqa: TC001 from .helpers import SCHEMA_EXTRACTION_SCRIPT diff --git a/src/agentpool_server/acp_server/commands/docs_commands/get_source.py b/src/wolfharness_server/acp_server/commands/docs_commands/get_source.py similarity index 91% rename from src/agentpool_server/acp_server/commands/docs_commands/get_source.py rename to src/wolfharness_server/acp_server/commands/docs_commands/get_source.py index 916bfebcd..ae5c6d028 100644 --- a/src/agentpool_server/acp_server/commands/docs_commands/get_source.py +++ b/src/wolfharness_server/acp_server/commands/docs_commands/get_source.py @@ -7,11 +7,11 @@ from pydantic_ai import UserPromptPart from slashed import CommandContext # noqa: TC002 -from agentpool.commands.base import NodeCommand -from agentpool.log import get_logger -from agentpool.messaging.context import NodeContext # noqa: TC001 -import agentpool.utils.importing -from agentpool_server.acp_server.session import ACPSession # noqa: TC001 +from wolfharness.commands.base import NodeCommand +from wolfharness.log import get_logger +from wolfharness.messaging.context import NodeContext # noqa: TC001 +import wolfharness.utils.importing +from wolfharness_server.acp_server.session import ACPSession # noqa: TC001 logger = get_logger(__name__) @@ -54,7 +54,7 @@ async def execute_command( await session.notifications.send_agent_text(msg) return - importing_py_path = agentpool.utils.importing.__file__ + importing_py_path = wolfharness.utils.importing.__file__ assert isinstance(importing_py_path, str) await session.notifications.tool_call_start( tool_call_id=tool_call_id, diff --git a/src/agentpool_server/acp_server/commands/docs_commands/git_diff.py b/src/wolfharness_server/acp_server/commands/docs_commands/git_diff.py similarity index 94% rename from src/agentpool_server/acp_server/commands/docs_commands/git_diff.py rename to src/wolfharness_server/acp_server/commands/docs_commands/git_diff.py index 3a17a6042..6b8c1f5e6 100644 --- a/src/agentpool_server/acp_server/commands/docs_commands/git_diff.py +++ b/src/wolfharness_server/acp_server/commands/docs_commands/git_diff.py @@ -7,10 +7,10 @@ from pydantic_ai import UserPromptPart from slashed import CommandContext # noqa: TC002 -from agentpool.commands.base import NodeCommand -from agentpool.log import get_logger -from agentpool.messaging.context import NodeContext # noqa: TC001 -from agentpool_server.acp_server.session import ACPSession # noqa: TC001 +from wolfharness.commands.base import NodeCommand +from wolfharness.log import get_logger +from wolfharness.messaging.context import NodeContext # noqa: TC001 +from wolfharness_server.acp_server.session import ACPSession # noqa: TC001 logger = get_logger(__name__) diff --git a/src/agentpool_server/acp_server/commands/docs_commands/helpers.py b/src/wolfharness_server/acp_server/commands/docs_commands/helpers.py similarity index 100% rename from src/agentpool_server/acp_server/commands/docs_commands/helpers.py rename to src/wolfharness_server/acp_server/commands/docs_commands/helpers.py diff --git a/src/agentpool_server/acp_server/commands/docs_commands/url_to_markdown.py b/src/wolfharness_server/acp_server/commands/docs_commands/url_to_markdown.py similarity index 92% rename from src/agentpool_server/acp_server/commands/docs_commands/url_to_markdown.py rename to src/wolfharness_server/acp_server/commands/docs_commands/url_to_markdown.py index 59da07646..504951fbf 100644 --- a/src/agentpool_server/acp_server/commands/docs_commands/url_to_markdown.py +++ b/src/wolfharness_server/acp_server/commands/docs_commands/url_to_markdown.py @@ -9,10 +9,10 @@ from pydantic_ai import UserPromptPart from slashed import CommandContext # noqa: TC002 -from agentpool.commands.base import NodeCommand -from agentpool.log import get_logger -from agentpool.messaging.context import NodeContext # noqa: TC001 -from agentpool_server.acp_server.session import ACPSession # noqa: TC001 +from wolfharness.commands.base import NodeCommand +from wolfharness.log import get_logger +from wolfharness.messaging.context import NodeContext # noqa: TC001 +from wolfharness_server.acp_server.session import ACPSession # noqa: TC001 logger = get_logger(__name__) diff --git a/src/agentpool_server/acp_server/commands/skill_commands.py b/src/wolfharness_server/acp_server/commands/skill_commands.py similarity index 93% rename from src/agentpool_server/acp_server/commands/skill_commands.py rename to src/wolfharness_server/acp_server/commands/skill_commands.py index a0d327434..c0c6a6fcd 100644 --- a/src/agentpool_server/acp_server/commands/skill_commands.py +++ b/src/wolfharness_server/acp_server/commands/skill_commands.py @@ -6,8 +6,8 @@ import logfire -from agentpool.log import get_logger -from agentpool_server.opencode_server.skill_bridge import create_skill_command +from wolfharness.log import get_logger +from wolfharness_server.opencode_server.skill_bridge import create_skill_command logger = get_logger(__name__) @@ -15,7 +15,7 @@ if TYPE_CHECKING: from slashed import Command as SlashedCommand - from agentpool.skills.command import SkillCommand + from wolfharness.skills.command import SkillCommand class ACPSkillBridge: diff --git a/src/agentpool_server/acp_server/converters.py b/src/wolfharness_server/acp_server/converters.py similarity index 94% rename from src/agentpool_server/acp_server/converters.py rename to src/wolfharness_server/acp_server/converters.py index 7338cb8b4..f6b12b166 100644 --- a/src/agentpool_server/acp_server/converters.py +++ b/src/wolfharness_server/acp_server/converters.py @@ -28,13 +28,13 @@ TextResourceContents, ) from acp.schema.mcp import AcpMcpServer -from agentpool.log import get_logger -from agentpool.utils.pydantic_ai_helpers import ( +from wolfharness.log import get_logger +from wolfharness.utils.pydantic_ai_helpers import ( format_uri_as_link, get_file_url_obj, uri_to_path_reference, ) -from agentpool_config.mcp_server import ( +from wolfharness_config.mcp_server import ( AcpMCPServerConfig, SSEMCPServerConfig, StdioMCPServerConfig, @@ -48,11 +48,11 @@ from acp.schema import ContentBlock, McpServer, SessionConfigOption from acp.schema.content_blocks import ResourceContents - from agentpool.agents.modes import ModeCategory, ModeInfo - from agentpool.common_types import PathReference - from agentpool.messaging import MessageNode - from agentpool.sessions import SessionData - from agentpool_config.mcp_server import MCPServerConfig + from wolfharness.agents.modes import ModeCategory, ModeInfo + from wolfharness.common_types import PathReference + from wolfharness.messaging import MessageNode + from wolfharness.sessions import SessionData + from wolfharness_config.mcp_server import MCPServerConfig logger = get_logger(__name__) diff --git a/src/agentpool_server/acp_server/event_converter.py b/src/wolfharness_server/acp_server/event_converter.py similarity index 99% rename from src/agentpool_server/acp_server/event_converter.py rename to src/wolfharness_server/acp_server/event_converter.py index 21403f86a..038f73939 100644 --- a/src/agentpool_server/acp_server/event_converter.py +++ b/src/wolfharness_server/acp_server/event_converter.py @@ -51,7 +51,7 @@ UserMessageChunk, ) from acp.utils import generate_tool_title, infer_tool_kind, to_acp_content_blocks -from agentpool.agents.events import ( +from wolfharness.agents.events import ( CompactionEvent, CustomEvent, DiffContentItem, @@ -78,8 +78,8 @@ ToolResultMetadataEvent, UserMessageInsertedEvent, ) -from agentpool.log import get_logger -from agentpool.utils.pydantic_ai_helpers import safe_args_as_dict +from wolfharness.log import get_logger +from wolfharness.utils.pydantic_ai_helpers import safe_args_as_dict if TYPE_CHECKING: @@ -89,7 +89,7 @@ from acp.schema import TextContentBlock from acp.schema.tool_call import ToolCallContent, ToolCallKind - from agentpool.agents.events import RichAgentStreamEvent + from wolfharness.agents.events import RichAgentStreamEvent logger = get_logger(__name__) @@ -549,7 +549,7 @@ async def convert( # noqa: PLR0915 PlanEntry as ACPPlanEntry, TerminalToolCallContent, ) - from agentpool_server.acp_server.syntax_detection import format_zed_code_block + from wolfharness_server.acp_server.syntax_detection import format_zed_code_block match event: # Text output diff --git a/src/agentpool_server/acp_server/handler.py b/src/wolfharness_server/acp_server/handler.py similarity index 97% rename from src/agentpool_server/acp_server/handler.py rename to src/wolfharness_server/acp_server/handler.py index fc7cb4960..962785e1a 100644 --- a/src/agentpool_server/acp_server/handler.py +++ b/src/wolfharness_server/acp_server/handler.py @@ -20,11 +20,11 @@ from acp.agent.acp_requests import ACPRequests from acp.schema.capabilities import ClientCapabilities -from agentpool.agents.events.events import ElicitationDeferredEvent, SpawnSessionStart -from agentpool.log import get_logger -from agentpool_server.acp_server.event_converter import ACPEventConverter, SubagentContext -from agentpool_server.acp_server.input_provider import ACPInputProvider -from agentpool_server.mixins import ConsumerShutdown, ProtocolEventConsumerMixin +from wolfharness.agents.events.events import ElicitationDeferredEvent, SpawnSessionStart +from wolfharness.log import get_logger +from wolfharness_server.acp_server.event_converter import ACPEventConverter, SubagentContext +from wolfharness_server.acp_server.input_provider import ACPInputProvider +from wolfharness_server.mixins import ConsumerShutdown, ProtocolEventConsumerMixin if TYPE_CHECKING: @@ -32,9 +32,9 @@ from acp import Client from acp.schema import ContentBlock, PromptResponse, StopReason - from agentpool.host.context import HostContext - from agentpool.orchestrator.core import EventBus, EventEnvelope - from agentpool_server.acp_server.session_manager import ACPSessionManager + from wolfharness.host.context import HostContext + from wolfharness.orchestrator.core import EventBus, EventEnvelope + from wolfharness_server.acp_server.session_manager import ACPSessionManager logger = get_logger(__name__) @@ -344,7 +344,7 @@ async def _handle_elicitation_deferred( session_id: The session that has a pending elicitation. event: The elicitation deferred event with params. """ - from agentpool.sessions.models import ElicitationResumePayload + from wolfharness.sessions.models import ElicitationResumePayload session_pool = self._host_context.session_pool if session_pool is None: @@ -391,7 +391,7 @@ async def _handle_elicitation_deferred( else: match response.action: case "accept": - from agentpool.ui.elicitation import normalize_elicit_content + from wolfharness.ui.elicitation import normalize_elicit_content payload = ElicitationResumePayload( deferred_handle=event.deferred_handle, @@ -524,8 +524,8 @@ async def handle_prompt( # noqa: PLR0915 Returns: A ``PromptResponse`` with the stop reason. """ - from agentpool.lifecycle.types import DeliveryMode - from agentpool_server.acp_server.converters import from_acp_content + from wolfharness.lifecycle.types import DeliveryMode + from wolfharness_server.acp_server.converters import from_acp_content session_pool = self._host_context.session_pool if session_pool is None: @@ -590,7 +590,7 @@ async def handle_prompt( # noqa: PLR0915 # Commands inject expanded prompts into the SessionPool per-session # agent's staged_content, which the agent run loop consumes automatically. if acp_session is not None: - from agentpool_server.acp_server.session import SLASH_PATTERN, split_commands + from wolfharness_server.acp_server.session import SLASH_PATTERN, split_commands commands, non_command_content = split_commands(contents, acp_session.command_store) if commands: @@ -653,7 +653,7 @@ async def handle_prompt( # noqa: PLR0915 message_id = str(uuid.uuid4()) # Build ACP meta from content blocks for the EventBus event. - from agentpool_server.acp_server.event_converter import ACPUserMessageMeta + from wolfharness_server.acp_server.event_converter import ACPUserMessageMeta content_block_dicts = [block.model_dump() for block in prompt] acp_meta = ACPUserMessageMeta(content_blocks=content_block_dicts) diff --git a/src/agentpool_server/acp_server/input_provider.py b/src/wolfharness_server/acp_server/input_provider.py similarity index 98% rename from src/agentpool_server/acp_server/input_provider.py rename to src/wolfharness_server/acp_server/input_provider.py index 147aa58d9..d8045c74c 100644 --- a/src/agentpool_server/acp_server/input_provider.py +++ b/src/wolfharness_server/acp_server/input_provider.py @@ -10,17 +10,17 @@ from acp import AllowedOutcome, DeniedOutcome, PermissionOption from acp.utils import DEFAULT_PERMISSION_OPTIONS -from agentpool.log import get_logger -from agentpool.ui.base import InputProvider -from agentpool.ui.elicitation import normalize_elicit_content +from wolfharness.log import get_logger +from wolfharness.ui.base import InputProvider +from wolfharness.ui.elicitation import normalize_elicit_content if TYPE_CHECKING: from acp import RequestPermissionResponse from acp.schema.elicitation import ElicitationCreateResponse - from agentpool import AgentContext - from agentpool.agents.context import ConfirmationResult - from agentpool_server.acp_server.session import ACPSession + from wolfharness import AgentContext + from wolfharness.agents.context import ConfirmationResult + from wolfharness_server.acp_server.session import ACPSession logger = get_logger(__name__) diff --git a/src/agentpool_server/acp_server/provider_router.py b/src/wolfharness_server/acp_server/provider_router.py similarity index 97% rename from src/agentpool_server/acp_server/provider_router.py rename to src/wolfharness_server/acp_server/provider_router.py index 6a1cdee3f..7f74ce782 100644 --- a/src/agentpool_server/acp_server/provider_router.py +++ b/src/wolfharness_server/acp_server/provider_router.py @@ -10,12 +10,12 @@ from typing import TYPE_CHECKING from acp.schema.providers import ProviderCurrentConfig, ProviderInfo -from agentpool.log import get_logger -from agentpool_server.shared.model_utils import _extract_provider +from wolfharness.log import get_logger +from wolfharness_server.shared.model_utils import _extract_provider if TYPE_CHECKING: - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.manifest import AgentsManifest logger = get_logger(__name__) diff --git a/src/agentpool_server/acp_server/server.py b/src/wolfharness_server/acp_server/server.py similarity index 95% rename from src/agentpool_server/acp_server/server.py rename to src/wolfharness_server/acp_server/server.py index 37c1f401e..a1d37036e 100644 --- a/src/agentpool_server/acp_server/server.py +++ b/src/wolfharness_server/acp_server/server.py @@ -1,4 +1,4 @@ -"""ACP (Agent Client Protocol) server implementation for agentpool. +"""ACP (Agent Client Protocol) server implementation for wolfharness. This module provides the main server class for exposing AgentPool via the Agent Client Protocol. @@ -12,14 +12,14 @@ from typing import TYPE_CHECKING, Any, Literal, Self from acp import ACPWebSocketTransport, StdioTransport, serve -from agentpool import AgentPool -from agentpool.log import get_logger -from agentpool.models.manifest import AgentsManifest -from agentpool_config.context import ConfigContextManager -from agentpool_config.pool_server import ACPPoolServerConfig -from agentpool_server import BaseServer -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness import AgentPool +from wolfharness.log import get_logger +from wolfharness.models.manifest import AgentsManifest +from wolfharness_config.context import ConfigContextManager +from wolfharness_config.pool_server import ACPPoolServerConfig +from wolfharness_server import BaseServer +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness_server.acp_server.session_manager import ACPSessionManager if TYPE_CHECKING: @@ -29,7 +29,7 @@ from acp import Transport from acp.agent.connection import AgentSideConnection - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent logger = get_logger(__name__) @@ -85,9 +85,9 @@ def observer(event: Any) -> None: class ACPServer(BaseServer): - """ACP (Agent Client Protocol) server for agentpool using external library. + """ACP (Agent Client Protocol) server for wolfharness using external library. - Provides a bridge between agentpool's Agent system and the standard ACP + Provides a bridge between wolfharness's Agent system and the standard ACP JSON-RPC protocol using the external acp library for robust communication. The actual client communication happens via the AgentSideConnection created diff --git a/src/agentpool_server/acp_server/session.py b/src/wolfharness_server/acp_server/session.py similarity index 91% rename from src/agentpool_server/acp_server/session.py rename to src/wolfharness_server/acp_server/session.py index 4e045276a..d4dc219c5 100644 --- a/src/agentpool_server/acp_server/session.py +++ b/src/wolfharness_server/acp_server/session.py @@ -1,4 +1,4 @@ -"""ACP (Agent Client Protocol) session management for agentpool. +"""ACP (Agent Client Protocol) session management for wolfharness. This module provides session lifecycle management, state tracking, and coordination between agents and ACP clients through the JSON-RPC protocol. @@ -24,14 +24,14 @@ from acp.agent.notifications import ACPNotifications from acp.filesystem import ACPFileSystem from acp.schema import AvailableCommand, ClientCapabilities -from agentpool import Agent -from agentpool.agents.acp_agent import ACPAgent -from agentpool.commands.base import NodeCommand -from agentpool.log import get_logger -from agentpool_server.acp_server.input_provider import ACPInputProvider -from agentpool_server.acp_server.session_agent_mgmt import ACPSessionAgentMgmtMixin -from agentpool_server.acp_server.session_events import ACPSessionEventsMixin -from agentpool_server.acp_server.session_lifecycle import ACPSessionLifecycleMixin +from wolfharness import Agent +from wolfharness.agents.acp_agent import ACPAgent +from wolfharness.commands.base import NodeCommand +from wolfharness.log import get_logger +from wolfharness_server.acp_server.input_provider import ACPInputProvider +from wolfharness_server.acp_server.session_agent_mgmt import ACPSessionAgentMgmtMixin +from wolfharness_server.acp_server.session_events import ACPSessionEventsMixin +from wolfharness_server.acp_server.session_lifecycle import ACPSessionLifecycleMixin if TYPE_CHECKING: @@ -47,12 +47,12 @@ StopReason, Usage, ) - from agentpool.agents.base_agent import BaseAgent - from agentpool.common_types import PathReference - from agentpool.host.context import HostContext - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent - from agentpool_server.acp_server.event_converter import ACPEventConverter - from agentpool_server.acp_server.session_manager import ACPSessionManager + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.common_types import PathReference + from wolfharness.host.context import HostContext + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.session_manager import ACPSessionManager logger = get_logger(__name__) @@ -94,7 +94,7 @@ def get_all_commands() -> Sequence[BaseCommand]: """Return empty command list to align with OpenCode behavior. All built-in framework commands are hidden to keep ACP consistent - with OpenCode, which does not register agentpool_commands at all. + with OpenCode, which does not register wolfharness_commands at all. """ return [] @@ -230,7 +230,7 @@ def __post_init__(self) -> None: self._remote_commands: list[AvailableCommand] = [] # Skill bridge: converts SkillCommand → SlashedCommand for command_store - from agentpool_server.acp_server.commands.skill_commands import ACPSkillBridge + from wolfharness_server.acp_server.commands.skill_commands import ACPSkillBridge self._skill_bridge: ACPSkillBridge = ACPSkillBridge() self._skill_change_task: asyncio.Task[None] | None = None diff --git a/src/agentpool_server/acp_server/session_agent_mgmt.py b/src/wolfharness_server/acp_server/session_agent_mgmt.py similarity index 97% rename from src/agentpool_server/acp_server/session_agent_mgmt.py rename to src/wolfharness_server/acp_server/session_agent_mgmt.py index e00355a2b..0335eebba 100644 --- a/src/agentpool_server/acp_server/session_agent_mgmt.py +++ b/src/wolfharness_server/acp_server/session_agent_mgmt.py @@ -14,10 +14,10 @@ import anyio import logfire -from agentpool import Agent -from agentpool.commands.base import NodeCommand -from agentpool.log import get_logger -from agentpool_config.commands import BaseCommandConfig +from wolfharness import Agent +from wolfharness.commands.base import NodeCommand +from wolfharness.log import get_logger +from wolfharness_config.commands import BaseCommandConfig if TYPE_CHECKING: @@ -126,7 +126,7 @@ def _register_skill_commands(self) -> None: objects in command_store with replace=True for idempotent updates. Also removes stale commands that are no longer present or invocable. """ - from agentpool.skills.command import SkillCommand + from wolfharness.skills.command import SkillCommand ctx = self.host_context skills_registry = ctx.skills_registry @@ -191,7 +191,7 @@ async def _watch_skill_changes(self) -> None: POOL scope. When a skills_changed event arrives, rebuilds skill commands and sends an update to the client. """ - from agentpool.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel ctx = self.host_context if ctx.extension_registry is None: @@ -323,7 +323,7 @@ async def execute_slash_command(self, command_text: str) -> None: command_text: Full command text (including slash) session: ACP session context """ - from agentpool_server.acp_server.session import SLASH_PATTERN + from wolfharness_server.acp_server.session import SLASH_PATTERN if match := SLASH_PATTERN.match(command_text.strip()): command_name = match.group(1) diff --git a/src/agentpool_server/acp_server/session_events.py b/src/wolfharness_server/acp_server/session_events.py similarity index 92% rename from src/agentpool_server/acp_server/session_events.py rename to src/wolfharness_server/acp_server/session_events.py index d87ab64d4..14979504e 100644 --- a/src/agentpool_server/acp_server/session_events.py +++ b/src/wolfharness_server/acp_server/session_events.py @@ -10,13 +10,13 @@ from tokonomics.model_discovery.model_info import ModelInfo -from agentpool.agents.events.events import ToastInfo -from agentpool.agents.modes import ConfigOptionChanged, ModeInfo -from agentpool.log import get_logger +from wolfharness.agents.events.events import ToastInfo +from wolfharness.agents.modes import ConfigOptionChanged, ModeInfo +from wolfharness.log import get_logger if TYPE_CHECKING: - from agentpool.agents.base_agent import StateUpdate + from wolfharness.agents.base_agent import StateUpdate logger = get_logger(__name__) @@ -52,7 +52,7 @@ async def _on_state_updated(self, state: StateUpdate) -> None: CurrentModelUpdate, CurrentModeUpdate, ) - from agentpool_server.acp_server.acp_agent import get_session_config_options + from wolfharness_server.acp_server.acp_agent import get_session_config_options update: CurrentModeUpdate | CurrentModelUpdate | ConfigOptionUpdate match state: diff --git a/src/agentpool_server/acp_server/session_lifecycle.py b/src/wolfharness_server/acp_server/session_lifecycle.py similarity index 95% rename from src/agentpool_server/acp_server/session_lifecycle.py rename to src/wolfharness_server/acp_server/session_lifecycle.py index 620b271fb..1d492db52 100644 --- a/src/agentpool_server/acp_server/session_lifecycle.py +++ b/src/wolfharness_server/acp_server/session_lifecycle.py @@ -14,17 +14,17 @@ import anyio from pydantic_ai import UsageLimitExceeded -from agentpool import Agent -from agentpool.log import get_logger -from agentpool_server.acp_server.converters import from_acp_content -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness import Agent +from wolfharness.log import get_logger +from wolfharness_server.acp_server.converters import from_acp_content +from wolfharness_server.acp_server.event_converter import ACPEventConverter if TYPE_CHECKING: from collections.abc import Sequence from acp.schema import ContentBlock, McpServer, StopReason - from agentpool.mcp_server.config_snapshot import McpConfigEntry + from wolfharness.mcp_server.config_snapshot import McpConfigEntry logger = get_logger(__name__) @@ -95,7 +95,7 @@ def _make_provider_name(self, display_name: str) -> str: """ import hashlib - from agentpool_server.acp_server.session import _MAX_PROVIDER_NAME_LENGTH + from wolfharness_server.acp_server.session import _MAX_PROVIDER_NAME_LENGTH prefix = "session_" suffix = f"_{display_name}" @@ -118,12 +118,12 @@ async def initialize_mcp_servers(self) -> None: capability building can reuse it. """ from acp.schema.mcp import AcpMcpServer - from agentpool import Agent - from agentpool.mcp_server.config_snapshot import ( + from wolfharness import Agent + from wolfharness.mcp_server.config_snapshot import ( McpConfigEntry, McpConfigSnapshot, ) - from agentpool_server.acp_server.converters import ( + from wolfharness_server.acp_server.converters import ( convert_acp_mcp_server_to_config, ) @@ -153,7 +153,7 @@ async def _init_server(server: McpServer) -> None: raise RuntimeError( # noqa: TRY301 f"AcpMcpConnection not found for {connection_id}" ) - from agentpool_server.acp_server.acp_mcp_transport import ( + from wolfharness_server.acp_server.acp_mcp_transport import ( AcpMcpTransport, ) @@ -256,7 +256,7 @@ async def process_prompt(self, content_blocks: Sequence[ContentBlock]) -> StopRe Returns: Stop reason """ - from agentpool_server.acp_server.session import infer_stop_reason, split_commands + from wolfharness_server.acp_server.session import infer_stop_reason, split_commands self._cancelled = False fs = self.agent.env.get_fs() @@ -376,7 +376,7 @@ async def _send_toast( ) -> None: """Send a toast notification via ExtNotification. - Uses _agentpool/toast ext notification instead of polluting chat + Uses _wolfharness/toast ext notification instead of polluting chat history with error messages disguised as agent text. Args: @@ -389,7 +389,7 @@ async def _send_toast( return try: await self.notifications.send_ext_notification( - method="_agentpool/toast", + method="_wolfharness/toast", params={ "message": message, "level": level, diff --git a/src/agentpool_server/acp_server/session_manager.py b/src/wolfharness_server/acp_server/session_manager.py similarity index 96% rename from src/agentpool_server/acp_server/session_manager.py rename to src/wolfharness_server/acp_server/session_manager.py index 3cff7b211..cbef4882f 100644 --- a/src/agentpool_server/acp_server/session_manager.py +++ b/src/wolfharness_server/acp_server/session_manager.py @@ -6,8 +6,8 @@ from typing import TYPE_CHECKING, Any, Literal, Self from acp.schema import ClientCapabilities -from agentpool.log import get_logger -from agentpool_server.acp_server.session import ACPSession +from wolfharness.log import get_logger +from wolfharness_server.acp_server.session import ACPSession if TYPE_CHECKING: @@ -15,11 +15,11 @@ from acp import Client from acp.schema import Implementation, McpServer - from agentpool import AgentPool - from agentpool.orchestrator import SessionController - from agentpool.storage.manager import StorageManager - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent - from agentpool_storage.protocols import SessionPersistence + from wolfharness import AgentPool + from wolfharness.orchestrator import SessionController + from wolfharness.storage.manager import StorageManager + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness_storage.protocols import SessionPersistence logger = get_logger(__name__) @@ -114,7 +114,7 @@ async def create_session( # noqa: PLR0915 if parent_session_id is not None and self._pool.session_pool is not None: # Child session path: delegate to SessionPool which # inherits project_id/cwd from the parent automatically. - from agentpool.utils.identifiers import generate_session_id + from wolfharness.utils.identifiers import generate_session_id child_session_id = session_id or generate_session_id() await self._pool.session_pool.create_session( @@ -144,14 +144,14 @@ async def create_session( # noqa: PLR0915 # Top-level session path: delegate to SessionPool.create_session() # which persists SessionData via SessionController.get_or_create_session(). if self._pool.session_pool is not None: - from agentpool.utils.identifiers import generate_session_id + from wolfharness.utils.identifiers import generate_session_id if session_id is None: session_id = generate_session_id() # Compute project_id from cwd so that ACP sessions are # correctly associated with the project in the TUI sidebar. - from agentpool_storage.opencode_provider.helpers import compute_project_id + from wolfharness_storage.opencode_provider.helpers import compute_project_id project_id = compute_project_id(cwd) @@ -164,8 +164,8 @@ async def create_session( # noqa: PLR0915 ) else: # Fallback: no SessionPool (tests only) — persist directly. - from agentpool.sessions import SessionData - from agentpool_storage.opencode_provider.helpers import compute_project_id + from wolfharness.sessions import SessionData + from wolfharness_storage.opencode_provider.helpers import compute_project_id # Use storage.generate_session_id for backward compat with # tests that mock it. @@ -199,7 +199,7 @@ async def create_session( # noqa: PLR0915 raise ValueError(msg) if cfg.name is None: cfg = cfg.model_copy(update={"name": agent_name}) - from agentpool_config.context import ConfigContextManager + from wolfharness_config.context import ConfigContextManager with ConfigContextManager(self._pool._config_file_path): session_agent = cfg.get_agent(pool=self._pool) diff --git a/src/agentpool_server/acp_server/syntax_detection.py b/src/wolfharness_server/acp_server/syntax_detection.py similarity index 100% rename from src/agentpool_server/acp_server/syntax_detection.py rename to src/wolfharness_server/acp_server/syntax_detection.py diff --git a/src/agentpool_server/acp_server/zed_tools.md b/src/wolfharness_server/acp_server/zed_tools.md similarity index 100% rename from src/agentpool_server/acp_server/zed_tools.md rename to src/wolfharness_server/acp_server/zed_tools.md diff --git a/src/agentpool_server/aggregating_server.py b/src/wolfharness_server/aggregating_server.py similarity index 98% rename from src/agentpool_server/aggregating_server.py rename to src/wolfharness_server/aggregating_server.py index 97a69febd..dbb3f56aa 100644 --- a/src/agentpool_server/aggregating_server.py +++ b/src/wolfharness_server/aggregating_server.py @@ -7,15 +7,15 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Any, Literal, Self -from agentpool.log import get_logger -from agentpool_server.base import BaseServer +from wolfharness.log import get_logger +from wolfharness_server.base import BaseServer if TYPE_CHECKING: from collections.abc import Sequence from types import TracebackType - from agentpool import AgentPool + from wolfharness import AgentPool # Type-safe server status literals ServerStatus = Literal["not_initialized", "initialized", "running", "failed", "stopped"] diff --git a/src/agentpool_server/agui_server/__init__.py b/src/wolfharness_server/agui_server/__init__.py similarity index 63% rename from src/agentpool_server/agui_server/__init__.py rename to src/wolfharness_server/agui_server/__init__.py index bf812f06f..184395793 100644 --- a/src/agentpool_server/agui_server/__init__.py +++ b/src/wolfharness_server/agui_server/__init__.py @@ -1,4 +1,4 @@ -"""AG-UI server module for agentpool. +"""AG-UI server module for wolfharness. This module provides server implementation for exposing AgentPool agents via the AG-UI protocol with each agent on its own route. @@ -9,7 +9,7 @@ from __future__ import annotations -from agentpool_server.agui_server.base_agent_adapter import BaseAgentAGUIAdapter -from agentpool_server.agui_server.server import AGUIServer +from wolfharness_server.agui_server.base_agent_adapter import BaseAgentAGUIAdapter +from wolfharness_server.agui_server.server import AGUIServer __all__ = ["AGUIServer", "BaseAgentAGUIAdapter"] diff --git a/src/agentpool_server/agui_server/base_agent_adapter.py b/src/wolfharness_server/agui_server/base_agent_adapter.py similarity index 98% rename from src/agentpool_server/agui_server/base_agent_adapter.py rename to src/wolfharness_server/agui_server/base_agent_adapter.py index 030c78c14..ad9915e8d 100644 --- a/src/agentpool_server/agui_server/base_agent_adapter.py +++ b/src/wolfharness_server/agui_server/base_agent_adapter.py @@ -14,7 +14,7 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Any -from agentpool.agents.events.events import StepUsageEvent +from wolfharness.agents.events.events import StepUsageEvent if TYPE_CHECKING: @@ -24,7 +24,7 @@ from starlette.requests import Request from starlette.responses import StreamingResponse - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent __all__ = ["BaseAgentAGUIAdapter"] diff --git a/src/agentpool_server/agui_server/server.py b/src/wolfharness_server/agui_server/server.py similarity index 92% rename from src/agentpool_server/agui_server/server.py rename to src/wolfharness_server/agui_server/server.py index d77db49cd..bf0d34c5f 100644 --- a/src/agentpool_server/agui_server/server.py +++ b/src/wolfharness_server/agui_server/server.py @@ -1,4 +1,4 @@ -"""AG-UI server implementation for agentpool pool. +"""AG-UI server implementation for wolfharness pool. This module provides a server that exposes all agents in an AgentPool via the AG-UI protocol, with each agent accessible at its own route. @@ -11,10 +11,10 @@ from typing import TYPE_CHECKING -from agentpool.log import get_logger -from agentpool_server.agui_server.base_agent_adapter import BaseAgentAGUIAdapter -from agentpool_server.http_server import HTTPServer -from agentpool_server.mixins import ProtocolEventConsumerMixin +from wolfharness.log import get_logger +from wolfharness_server.agui_server.base_agent_adapter import BaseAgentAGUIAdapter +from wolfharness_server.http_server import HTTPServer +from wolfharness_server.mixins import ProtocolEventConsumerMixin if TYPE_CHECKING: @@ -22,8 +22,8 @@ from starlette.responses import Response from starlette.routing import Route - from agentpool import AgentPool - from agentpool.orchestrator.core import EventBus, EventEnvelope + from wolfharness import AgentPool + from wolfharness.orchestrator.core import EventBus, EventEnvelope logger = get_logger(__name__) @@ -129,7 +129,7 @@ async def agent_handler(request: Request, agent_name: str = agent_name) -> Respo sp = self.pool.session_pool if sp is not None: - from agentpool.utils.identifiers import generate_session_id + from wolfharness.utils.identifiers import generate_session_id session_id = generate_session_id() await sp.create_session(session_id, agent_name=agent_name) diff --git a/src/agentpool_server/agui_server/skill_tools.py b/src/wolfharness_server/agui_server/skill_tools.py similarity index 97% rename from src/agentpool_server/agui_server/skill_tools.py rename to src/wolfharness_server/agui_server/skill_tools.py index df0086b7e..fdcb08bf4 100644 --- a/src/agentpool_server/agui_server/skill_tools.py +++ b/src/wolfharness_server/agui_server/skill_tools.py @@ -8,13 +8,13 @@ from ag_ui.core import Tool import logfire -from agentpool.log import get_logger +from wolfharness.log import get_logger logger = get_logger(__name__) if TYPE_CHECKING: - from agentpool.skills.command import SkillCommand + from wolfharness.skills.command import SkillCommand def _hash_args(args: str) -> str: diff --git a/src/agentpool_server/base.py b/src/wolfharness_server/base.py similarity index 98% rename from src/agentpool_server/base.py rename to src/wolfharness_server/base.py index e57f1d745..02030ac26 100644 --- a/src/agentpool_server/base.py +++ b/src/wolfharness_server/base.py @@ -6,15 +6,15 @@ from contextlib import asynccontextmanager from typing import TYPE_CHECKING, Any, Self -from agentpool.log import get_logger -from agentpool.utils.task_group import ManagedTaskGroup +from wolfharness.log import get_logger +from wolfharness.utils.task_group import ManagedTaskGroup if TYPE_CHECKING: from collections.abc import AsyncIterator from types import TracebackType - from agentpool import AgentPool + from wolfharness import AgentPool logger = get_logger(__name__) diff --git a/src/agentpool_server/http_server.py b/src/wolfharness_server/http_server.py similarity index 92% rename from src/agentpool_server/http_server.py rename to src/wolfharness_server/http_server.py index 52cce198f..9d4a6e698 100644 --- a/src/agentpool_server/http_server.py +++ b/src/wolfharness_server/http_server.py @@ -8,8 +8,8 @@ from abc import abstractmethod from typing import TYPE_CHECKING, Self -from agentpool.log import get_logger -from agentpool_server.base import BaseServer +from wolfharness.log import get_logger +from wolfharness_server.base import BaseServer if TYPE_CHECKING: @@ -17,7 +17,7 @@ from starlette.routing import Route from upathtools import JoinablePathLike - from agentpool import AgentPool + from wolfharness import AgentPool logger = get_logger(__name__) @@ -139,7 +139,7 @@ def from_config( """Create HTTP server from configuration file. Args: - config_path: Path to agentpool YAML config file + config_path: Path to wolfharness YAML config file host: Host to bind server to port: Port to bind server to raise_exceptions: Whether to raise exceptions during server start @@ -147,9 +147,9 @@ def from_config( Returns: Configured server instance with agent pool from config """ - from agentpool import AgentPool - from agentpool.models.manifest import AgentsManifest - from agentpool_config.context import ConfigContextManager + from wolfharness import AgentPool + from wolfharness.models.manifest import AgentsManifest + from wolfharness_config.context import ConfigContextManager with ConfigContextManager(config_path): manifest = AgentsManifest.from_file(config_path) diff --git a/src/agentpool_server/mcp_server/__init__.py b/src/wolfharness_server/mcp_server/__init__.py similarity index 58% rename from src/agentpool_server/mcp_server/__init__.py rename to src/wolfharness_server/mcp_server/__init__.py index c9d903539..1efae72ec 100644 --- a/src/agentpool_server/mcp_server/__init__.py +++ b/src/wolfharness_server/mcp_server/__init__.py @@ -1,6 +1,6 @@ """MCP protocol server implementation for AgentPool.""" -from agentpool_server.mcp_server.server import MCPServer +from wolfharness_server.mcp_server.server import MCPServer __all__ = ["MCPServer"] diff --git a/src/agentpool_server/mcp_server/server.py b/src/wolfharness_server/mcp_server/server.py similarity index 93% rename from src/agentpool_server/mcp_server/server.py rename to src/wolfharness_server/mcp_server/server.py index 316be7601..0e31438be 100644 --- a/src/agentpool_server/mcp_server/server.py +++ b/src/wolfharness_server/mcp_server/server.py @@ -11,11 +11,11 @@ from mcp import types import platformdirs -import agentpool -from agentpool.capabilities.subagent_capability import SubagentCapability -from agentpool.log import get_logger -from agentpool.mcp_server import constants -from agentpool_server import BaseServer +import wolfharness +from wolfharness.capabilities.subagent_capability import SubagentCapability +from wolfharness.log import get_logger +from wolfharness.mcp_server import constants +from wolfharness_server import BaseServer if TYPE_CHECKING: @@ -26,9 +26,9 @@ from mcp.server.lowlevel.server import LifespanResultT from pydantic import AnyUrl - from agentpool import AgentPool - from agentpool.prompts.prompts import BasePrompt - from agentpool_config.pool_server import MCPPoolServerConfig + from wolfharness import AgentPool + from wolfharness.prompts.prompts import BasePrompt + from wolfharness_config.pool_server import MCPPoolServerConfig LifespanHandler = Callable[ [FastMCP[LifespanResultT]], @@ -38,9 +38,9 @@ logger = get_logger(__name__) -agentpool_dir = platformdirs.user_config_dir("agentpool") +wolfharness_dir = platformdirs.user_config_dir("wolfharness") -store = DiskStore(directory=agentpool_dir) +store = DiskStore(directory=wolfharness_dir) middleware = ResponseCachingMiddleware(cache_storage=store) @@ -58,7 +58,7 @@ def __init__( config: MCPPoolServerConfig, lifespan: LifespanHandler | None = None, instructions: str | None = None, - name: str = "agentpool-server", + name: str = "wolfharness-server", raise_exceptions: bool = False, ) -> None: """Initialize server with agent pool. @@ -85,7 +85,7 @@ def __init__( self.fastmcp = FastMCP( instructions=instructions, lifespan=lifespan, - version=agentpool.__version__, + version=wolfharness.__version__, middleware=[middleware], ) self.server = self.fastmcp._mcp_server diff --git a/src/agentpool_server/mcp_server/zed_wrapper.py b/src/wolfharness_server/mcp_server/zed_wrapper.py similarity index 94% rename from src/agentpool_server/mcp_server/zed_wrapper.py rename to src/wolfharness_server/mcp_server/zed_wrapper.py index 6ca6db299..5d5997cc9 100644 --- a/src/agentpool_server/mcp_server/zed_wrapper.py +++ b/src/wolfharness_server/mcp_server/zed_wrapper.py @@ -5,15 +5,15 @@ from functools import wraps from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger -from agentpool.prompts.prompts import DynamicPrompt -from agentpool.utils.importing import import_callable +from wolfharness.log import get_logger +from wolfharness.prompts.prompts import DynamicPrompt +from wolfharness.utils.importing import import_callable if TYPE_CHECKING: from collections.abc import Sequence - from agentpool.prompts.prompts import BasePrompt + from wolfharness.prompts.prompts import BasePrompt logger = get_logger(__name__) diff --git a/src/agentpool_server/mixins.py b/src/wolfharness_server/mixins.py similarity index 97% rename from src/agentpool_server/mixins.py rename to src/wolfharness_server/mixins.py index 6d0e4050d..826c20431 100644 --- a/src/agentpool_server/mixins.py +++ b/src/wolfharness_server/mixins.py @@ -12,11 +12,11 @@ import anyio -from agentpool.agents.events.events import SpawnSessionStart +from wolfharness.agents.events.events import SpawnSessionStart if TYPE_CHECKING: - from agentpool.orchestrator.core import EventBus, EventEnvelope + from wolfharness.orchestrator.core import EventBus, EventEnvelope class ConsumerShutdown(Exception): # noqa: N818 @@ -248,8 +248,8 @@ async def _event_consumer_loop(self, session_id: str) -> None: started = True # Deferred import to avoid circular dependency: - # agentpool.orchestrator.core -> agentpool_server.* -> mixins.py - from agentpool.orchestrator.core import drain_and_merge + # wolfharness.orchestrator.core -> wolfharness_server.* -> mixins.py + from wolfharness.orchestrator.core import drain_and_merge async for envelope in drain_and_merge(stream): if isinstance(envelope.event, SpawnSessionStart): diff --git a/src/agentpool_server/openai_api_server/__init__.py b/src/wolfharness_server/openai_api_server/__init__.py similarity index 100% rename from src/agentpool_server/openai_api_server/__init__.py rename to src/wolfharness_server/openai_api_server/__init__.py diff --git a/src/agentpool_server/openai_api_server/completions/__init__.py b/src/wolfharness_server/openai_api_server/completions/__init__.py similarity index 100% rename from src/agentpool_server/openai_api_server/completions/__init__.py rename to src/wolfharness_server/openai_api_server/completions/__init__.py diff --git a/src/agentpool_server/openai_api_server/completions/helpers.py b/src/wolfharness_server/openai_api_server/completions/helpers.py similarity index 93% rename from src/agentpool_server/openai_api_server/completions/helpers.py rename to src/wolfharness_server/openai_api_server/completions/helpers.py index 55fe45603..e90dd9621 100644 --- a/src/agentpool_server/openai_api_server/completions/helpers.py +++ b/src/wolfharness_server/openai_api_server/completions/helpers.py @@ -7,16 +7,16 @@ import anyenv from pydantic_ai import PartDeltaEvent, TextPartDelta, ThinkingPartDelta -from agentpool.agents.events import UserMessageInsertedEvent -from agentpool.agents.events.events import StepUsageEvent -from agentpool.log import get_logger -from agentpool.utils.time_utils import now_ms +from wolfharness.agents.events import UserMessageInsertedEvent +from wolfharness.agents.events.events import StepUsageEvent +from wolfharness.log import get_logger +from wolfharness.utils.time_utils import now_ms if TYPE_CHECKING: from collections.abc import AsyncGenerator, AsyncIterator - from agentpool_server.openai_api_server.completions.models import ChatCompletionRequest + from wolfharness_server.openai_api_server.completions.models import ChatCompletionRequest logger = get_logger(__name__) diff --git a/src/agentpool_server/openai_api_server/completions/models.py b/src/wolfharness_server/openai_api_server/completions/models.py similarity index 96% rename from src/agentpool_server/openai_api_server/completions/models.py rename to src/wolfharness_server/openai_api_server/completions/models.py index 4f7e21151..5aacb867e 100644 --- a/src/agentpool_server/openai_api_server/completions/models.py +++ b/src/wolfharness_server/openai_api_server/completions/models.py @@ -7,7 +7,7 @@ from pydantic import Field from schemez import Schema -from agentpool.log import get_logger +from wolfharness.log import get_logger logger = get_logger(__name__) @@ -26,7 +26,7 @@ class OpenAIModelInfo(Schema): id: str object: str = "model" - owned_by: str = "agentpool" + owned_by: str = "wolfharness" created: int description: str | None = None permissions: list[str] = Field(default_factory=list) diff --git a/src/agentpool_server/openai_api_server/responses/__init__.py b/src/wolfharness_server/openai_api_server/responses/__init__.py similarity index 100% rename from src/agentpool_server/openai_api_server/responses/__init__.py rename to src/wolfharness_server/openai_api_server/responses/__init__.py diff --git a/src/agentpool_server/openai_api_server/responses/helpers.py b/src/wolfharness_server/openai_api_server/responses/helpers.py similarity index 93% rename from src/agentpool_server/openai_api_server/responses/helpers.py rename to src/wolfharness_server/openai_api_server/responses/helpers.py index 4a57a1a80..4c4298412 100644 --- a/src/agentpool_server/openai_api_server/responses/helpers.py +++ b/src/wolfharness_server/openai_api_server/responses/helpers.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any from uuid import uuid4 -from agentpool_server.openai_api_server.responses.models import ( +from wolfharness_server.openai_api_server.responses.models import ( Response, ResponseMessage, ResponseOutputReasoning, @@ -16,8 +16,8 @@ if TYPE_CHECKING: - from agentpool.messaging.messages import ChatMessage - from agentpool_server.openai_api_server.responses.models import ResponseRequest + from wolfharness.messaging.messages import ChatMessage + from wolfharness_server.openai_api_server.responses.models import ResponseRequest async def handle_request(request: ResponseRequest, message: ChatMessage[Any]) -> Response: diff --git a/src/agentpool_server/openai_api_server/responses/models.py b/src/wolfharness_server/openai_api_server/responses/models.py similarity index 100% rename from src/agentpool_server/openai_api_server/responses/models.py rename to src/wolfharness_server/openai_api_server/responses/models.py diff --git a/src/agentpool_server/openai_api_server/server.py b/src/wolfharness_server/openai_api_server/server.py similarity index 94% rename from src/agentpool_server/openai_api_server/server.py rename to src/wolfharness_server/openai_api_server/server.py index 421e96b39..45893c0fa 100644 --- a/src/agentpool_server/openai_api_server/server.py +++ b/src/wolfharness_server/openai_api_server/server.py @@ -8,13 +8,13 @@ import anyenv from fastapi import Header -from agentpool.agents.events import StreamCompleteEvent -from agentpool.log import get_logger -from agentpool.utils.identifiers import generate_session_id -from agentpool_server import BaseServer -from agentpool_server.mixins import ProtocolEventConsumerMixin -from agentpool_server.openai_api_server.completions.helpers import stream_response -from agentpool_server.openai_api_server.completions.models import ( +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.log import get_logger +from wolfharness.utils.identifiers import generate_session_id +from wolfharness_server import BaseServer +from wolfharness_server.mixins import ProtocolEventConsumerMixin +from wolfharness_server.openai_api_server.completions.helpers import stream_response +from wolfharness_server.openai_api_server.completions.models import ( ChatCompletionRequest, ChatCompletionResponse, Choice, @@ -22,8 +22,8 @@ OpenAIMessage, OpenAIModelInfo, ) -from agentpool_server.openai_api_server.responses.helpers import handle_request -from agentpool_server.openai_api_server.responses.models import ( # noqa: TC001 +from wolfharness_server.openai_api_server.responses.helpers import handle_request +from wolfharness_server.openai_api_server.responses.models import ( # noqa: TC001 Response as ResponsesResponse, ResponseRequest, ) @@ -32,8 +32,8 @@ if TYPE_CHECKING: from fastapi import Response - from agentpool import AgentPool - from agentpool.orchestrator.core import EventBus, EventEnvelope + from wolfharness import AgentPool + from wolfharness.orchestrator.core import EventBus, EventEnvelope logger = get_logger(__name__) @@ -290,7 +290,7 @@ async def create_response(self, req_body: ResponseRequest) -> ResponsesResponse: session_id = generate_session_id() await session_pool.create_session(session_id, agent_name=req_body.model) - from agentpool.agents.events import StreamCompleteEvent + from wolfharness.agents.events import StreamCompleteEvent message = None try: @@ -332,7 +332,7 @@ async def _start_async(self) -> None: import anyio import httpx - from agentpool import AgentPool + from wolfharness import AgentPool async def test_completions() -> None: """Test the chat completions API.""" @@ -381,7 +381,7 @@ async def test_responses() -> None: async def main() -> None: """Run server and test both endpoints.""" - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig pool = AgentPool() pool.manifest.agents["gpt-5-mini"] = NativeAgentConfig( diff --git a/src/agentpool_server/opencode_server/.rules b/src/wolfharness_server/opencode_server/.rules similarity index 93% rename from src/agentpool_server/opencode_server/.rules rename to src/wolfharness_server/opencode_server/.rules index c7047e302..239b6b5c5 100644 --- a/src/agentpool_server/opencode_server/.rules +++ b/src/wolfharness_server/opencode_server/.rules @@ -73,16 +73,16 @@ See `ENDPOINTS.md` for the full checklist of endpoints and their implementation ## Logging -Log file location: `~/.local/state/agentpool/log/opencode.log` +Log file location: `~/.local/state/wolfharness/log/opencode.log` To tail the logs: ```bash -tail -f ~/.local/state/agentpool/log/opencode.log +tail -f ~/.local/state/wolfharness/log/opencode.log ``` To filter for SSE events: ```bash -tail -f ~/.local/state/agentpool/log/opencode.log | grep -i sse +tail -f ~/.local/state/wolfharness/log/opencode.log | grep -i sse ``` ## Testing with the SDK diff --git a/src/agentpool_server/opencode_server/ENDPOINTS.md b/src/wolfharness_server/opencode_server/ENDPOINTS.md similarity index 100% rename from src/agentpool_server/opencode_server/ENDPOINTS.md rename to src/wolfharness_server/opencode_server/ENDPOINTS.md diff --git a/src/agentpool_server/opencode_server/OPENCODE_UI_TOOLS_COMPLETE.md b/src/wolfharness_server/opencode_server/OPENCODE_UI_TOOLS_COMPLETE.md similarity index 100% rename from src/agentpool_server/opencode_server/OPENCODE_UI_TOOLS_COMPLETE.md rename to src/wolfharness_server/opencode_server/OPENCODE_UI_TOOLS_COMPLETE.md diff --git a/src/agentpool_server/opencode_server/__init__.py b/src/wolfharness_server/opencode_server/__init__.py similarity index 80% rename from src/agentpool_server/opencode_server/__init__.py rename to src/wolfharness_server/opencode_server/__init__.py index f7ce5ed9c..5f6c6ace0 100644 --- a/src/agentpool_server/opencode_server/__init__.py +++ b/src/wolfharness_server/opencode_server/__init__.py @@ -5,8 +5,8 @@ Example usage: - from agentpool import AgentPool - from agentpool_server.opencode_server import OpenCodeServer + from wolfharness import AgentPool + from wolfharness_server.opencode_server import OpenCodeServer async with AgentPool("config.yml") as pool: assert pool.session_pool is not None @@ -18,7 +18,7 @@ Or programmatically: - from agentpool_server.opencode_server import create_app + from wolfharness_server.opencode_server import create_app app = create_app(agent=my_agent, working_dir="/path/to/project") # Use with uvicorn or other ASGI server diff --git a/src/agentpool_server/opencode_server/command_validation.py b/src/wolfharness_server/opencode_server/command_validation.py similarity index 100% rename from src/agentpool_server/opencode_server/command_validation.py rename to src/wolfharness_server/opencode_server/command_validation.py diff --git a/src/agentpool_server/opencode_server/converters.py b/src/wolfharness_server/opencode_server/converters.py similarity index 94% rename from src/agentpool_server/opencode_server/converters.py rename to src/wolfharness_server/opencode_server/converters.py index db9d979c1..7899d0ee9 100644 --- a/src/agentpool_server/opencode_server/converters.py +++ b/src/wolfharness_server/opencode_server/converters.py @@ -17,13 +17,13 @@ UserPromptPart, ) -from agentpool import log -from agentpool.messaging.messages import ChatMessage -from agentpool.sessions.models import SessionData -from agentpool.utils import identifiers as identifier -from agentpool.utils.pydantic_ai_helpers import safe_args_as_dict, to_user_content_or_path_ref -from agentpool.utils.time_utils import datetime_to_ms, ms_to_datetime -from agentpool_server.opencode_server.models import ( +from wolfharness import log +from wolfharness.messaging.messages import ChatMessage +from wolfharness.sessions.models import SessionData +from wolfharness.utils import identifiers as identifier +from wolfharness.utils.pydantic_ai_helpers import safe_args_as_dict, to_user_content_or_path_ref +from wolfharness.utils.time_utils import datetime_to_ms, ms_to_datetime +from wolfharness_server.opencode_server.models import ( AgentPartInput, FilePart, FilePartInput, @@ -60,15 +60,15 @@ from fsspec.asyn import AsyncFileSystem from pydantic_ai import UserContent - from agentpool.agents.base_agent import BaseAgent - from agentpool.common_types import MCPConnectionStatus, MCPServerStatus, PathReference - from agentpool.models.model_configs import AnyModelConfig - from agentpool_server.opencode_server.models import ToolState - from agentpool_server.opencode_server.models.mcp import ( + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.common_types import MCPConnectionStatus, MCPServerStatus, PathReference + from wolfharness.models.model_configs import AnyModelConfig + from wolfharness_server.opencode_server.models import ToolState + from wolfharness_server.opencode_server.models.mcp import ( MCPConnectionStatus as OpenCodeMCPConnectionStatus, ) - from agentpool_server.opencode_server.models.message import PartInput - from agentpool_server.opencode_server.models.parts import ResourceSource + from wolfharness_server.opencode_server.models.message import PartInput + from wolfharness_server.opencode_server.models.parts import ResourceSource logger = log.get_logger(__name__) @@ -141,8 +141,8 @@ async def _resolve_resource( Returns None if the resource is not found. """ - from agentpool.capabilities.extension_registry import Scope, ScopeLevel - from agentpool.capabilities.resource_resolver import resolve_resource_content + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.resource_resolver import resolve_resource_content scope = Scope( level=ScopeLevel.SESSION, @@ -192,7 +192,7 @@ async def extract_user_prompt_from_parts( Returns: Either a simple string (text-only) or a list of UserContent/PathReference items """ - from agentpool_server.opencode_server.models.parts import ResourceSource + from wolfharness_server.opencode_server.models.parts import ResourceSource result: list[UserContent | PathReference] = [] for part in parts: @@ -242,7 +242,7 @@ def chat_message_to_opencode( # noqa: PLR0915 working_dir: str = "", agent_name: str = "default", model_id: str = "unknown", - provider_id: str = "agentpool", + provider_id: str = "wolfharness", model_variants: dict[str, AnyModelConfig] | None = None, ) -> MessageWithParts: """Convert a ChatMessage to OpenCode MessageWithParts. @@ -284,7 +284,7 @@ def chat_message_to_opencode( # noqa: PLR0915 if isinstance(content, str): text = content else: - from agentpool.agents.native_agent.helpers import _summarize_content_block + from wolfharness.agents.native_agent.helpers import _summarize_content_block text = " ".join(_summarize_content_block(c) for c in content) if text: @@ -298,7 +298,7 @@ def chat_message_to_opencode( # noqa: PLR0915 tokens = Tokens.from_pydantic_ai(msg.usage) if model_variants: - from agentpool_server.shared.model_utils import resolve_model_info_from_response + from wolfharness_server.shared.model_utils import resolve_model_info_from_response resolved_id, resolved_provider = resolve_model_info_from_response( msg.model_name, msg.provider_name, model_variants @@ -618,7 +618,7 @@ def session_data_to_opencode(data: SessionData) -> Session: # sync fix have stored created_at from get_now() (a separate wall- # clock call), which can differ from the session ID's timestamp by # milliseconds — enough to cause sort mismatches in the TUI. - from agentpool.utils.identifiers import extract_timestamp_ms + from wolfharness.utils.identifiers import extract_timestamp_ms id_ts = extract_timestamp_ms(data.session_id) if id_ts is not None: @@ -637,7 +637,7 @@ def session_data_to_opencode(data: SessionData) -> Session: project_id = data.project_id if not project_id or project_id == "default": if data.cwd: - from agentpool_storage.opencode_provider import helpers + from wolfharness_storage.opencode_provider import helpers project_id = helpers.compute_project_id(data.cwd) else: diff --git a/src/agentpool_server/opencode_server/dependencies.py b/src/wolfharness_server/opencode_server/dependencies.py similarity index 77% rename from src/agentpool_server/opencode_server/dependencies.py rename to src/wolfharness_server/opencode_server/dependencies.py index 09207bcda..99730bf30 100644 --- a/src/agentpool_server/opencode_server/dependencies.py +++ b/src/wolfharness_server/opencode_server/dependencies.py @@ -8,7 +8,7 @@ if TYPE_CHECKING: - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState def get_state(request: Request) -> ServerState: @@ -16,7 +16,7 @@ def get_state(request: Request) -> ServerState: The state is stored on app.state.server_state during app creation. """ - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState return cast(ServerState, request.app.state.server_state) diff --git a/src/agentpool_server/opencode_server/event_adapter.py b/src/wolfharness_server/opencode_server/event_adapter.py similarity index 93% rename from src/agentpool_server/opencode_server/event_adapter.py rename to src/wolfharness_server/opencode_server/event_adapter.py index 422545b55..e33a026b5 100644 --- a/src/agentpool_server/opencode_server/event_adapter.py +++ b/src/wolfharness_server/opencode_server/event_adapter.py @@ -33,7 +33,7 @@ Usage:: - from agentpool_server.opencode_server.event_adapter import OpenCodeEventAdapter + from wolfharness_server.opencode_server.event_adapter import OpenCodeEventAdapter adapter = OpenCodeEventAdapter.from_stream_adapter(stream_adapter) async for oc_event in adapter.convert_stream(agent_stream): @@ -49,11 +49,11 @@ from typing import TYPE_CHECKING, Any -from agentpool_server.opencode_server.event_processor import EventProcessor -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness_server.opencode_server.event_processor import EventProcessor +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, # noqa: TC001 ) -from agentpool_server.opencode_server.stream_adapter import ( # noqa: TC001 +from wolfharness_server.opencode_server.stream_adapter import ( # noqa: TC001 OpenCodeStreamAdapter, ) @@ -61,8 +61,8 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool.agents.events.events import RichAgentStreamEvent - from agentpool_server.opencode_server.models.events import Event + from wolfharness.agents.events.events import RichAgentStreamEvent + from wolfharness_server.opencode_server.models.events import Event class OpenCodeEventAdapter: diff --git a/src/agentpool_server/opencode_server/event_bridge.py b/src/wolfharness_server/opencode_server/event_bridge.py similarity index 94% rename from src/agentpool_server/opencode_server/event_bridge.py rename to src/wolfharness_server/opencode_server/event_bridge.py index d79252d8b..bf30c93af 100644 --- a/src/agentpool_server/opencode_server/event_bridge.py +++ b/src/wolfharness_server/opencode_server/event_bridge.py @@ -18,14 +18,14 @@ from typing import TYPE_CHECKING, Any -from agentpool.agents.events.events import CustomEvent -from agentpool.log import get_logger +from wolfharness.agents.events.events import CustomEvent +from wolfharness.log import get_logger if TYPE_CHECKING: - from agentpool.orchestrator.core import EventBus - from agentpool_server.opencode_server.models.events import Event - from agentpool_server.opencode_server.state import ServerState + from wolfharness.orchestrator.core import EventBus + from wolfharness_server.opencode_server.models.events import Event + from wolfharness_server.opencode_server.state import ServerState logger = get_logger(__name__) diff --git a/src/agentpool_server/opencode_server/event_processor.py b/src/wolfharness_server/opencode_server/event_processor.py similarity index 97% rename from src/agentpool_server/opencode_server/event_processor.py rename to src/wolfharness_server/opencode_server/event_processor.py index 270f2684a..953aac6f8 100644 --- a/src/agentpool_server/opencode_server/event_processor.py +++ b/src/wolfharness_server/opencode_server/event_processor.py @@ -22,7 +22,7 @@ ToolCallPart as PydanticToolCallPart, ) -from agentpool.agents.events import ( +from wolfharness.agents.events import ( DiffContentItem, ElicitationDeferredEvent, FileContentItem, @@ -37,13 +37,13 @@ ToolCallStartEvent, UserMessageInsertedEvent, ) -from agentpool.agents.events.infer_info import derive_rich_tool_info -from agentpool.log import get_logger -from agentpool.utils import identifiers as identifier -from agentpool.utils.pydantic_ai_helpers import safe_args_as_dict -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.converters import _convert_params_for_ui -from agentpool_server.opencode_server.models import ( +from wolfharness.agents.events.infer_info import derive_rich_tool_info +from wolfharness.log import get_logger +from wolfharness.utils import identifiers as identifier +from wolfharness.utils.pydantic_ai_helpers import safe_args_as_dict +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.converters import _convert_params_for_ui +from wolfharness_server.opencode_server.models import ( MessageUpdatedEvent, Part, PartDeltaEvent, @@ -57,13 +57,13 @@ # Cross-layer import: McpToolsChangedEvent is an OpenCode SSE event that # EventProcessor creates from core-layer ChangeEvent(kind="tools_changed"). -from agentpool_server.opencode_server.models.events import McpToolsChangedEvent -from agentpool_server.opencode_server.models.message import ( +from wolfharness_server.opencode_server.models.events import McpToolsChangedEvent +from wolfharness_server.opencode_server.models.message import ( AssistantMessage, MessageWithParts, UserMessage, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( FilePart, ReasoningPart, StepFinishPart, @@ -83,15 +83,15 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator, Iterator, Sequence - from agentpool.agents.events import ToolCallContentItem - from agentpool.agents.events.events import RichAgentStreamEvent - from agentpool.messaging import ChatMessage - from agentpool_server.opencode_server.event_processor_context import ( + from wolfharness.agents.events import ToolCallContentItem + from wolfharness.agents.events.events import RichAgentStreamEvent + from wolfharness.messaging import ChatMessage + from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) - from agentpool_server.opencode_server.models.events import Event - from agentpool_server.opencode_server.models.parts import ToolState - from agentpool_server.opencode_server.models.session import SessionStatusType + from wolfharness_server.opencode_server.models.events import Event + from wolfharness_server.opencode_server.models.parts import ToolState + from wolfharness_server.opencode_server.models.session import SessionStatusType logger = get_logger(__name__) @@ -1011,7 +1011,7 @@ def _process_stream_complete( # model), emit a MessageUpdatedEvent so the TUI receives the correction. model_changed = False if isinstance(ctx.assistant_msg.info, AssistantMessage): - from agentpool_server.shared.model_utils import resolve_model_info_from_response + from wolfharness_server.shared.model_utils import resolve_model_info_from_response resolved_model_id, resolved_provider_id = resolve_model_info_from_response( msg.model_name, msg.provider_name, ctx.state.model_variants @@ -1167,7 +1167,7 @@ async def _process_user_message_inserted( user_msg_with_parts.add_text_part(item.content) # Append to session state - from agentpool_server.opencode_server.opencode_message_bridge import ( + from wolfharness_server.opencode_server.opencode_message_bridge import ( append_message_to_session, ) @@ -1276,9 +1276,9 @@ def _message_content_to_text(content: Any) -> str: if content is None: return "" if isinstance(content, list): - from agentpool.agents.native_agent.helpers import _summarize_content_block + from wolfharness.agents.native_agent.helpers import _summarize_content_block return " ".join(_summarize_content_block(c) for c in content) - from agentpool.agents.native_agent.helpers import _summarize_content_block + from wolfharness.agents.native_agent.helpers import _summarize_content_block return _summarize_content_block(content) diff --git a/src/agentpool_server/opencode_server/event_processor_context.py b/src/wolfharness_server/opencode_server/event_processor_context.py similarity index 96% rename from src/agentpool_server/opencode_server/event_processor_context.py rename to src/wolfharness_server/opencode_server/event_processor_context.py index d1a561a90..3310556c9 100644 --- a/src/agentpool_server/opencode_server/event_processor_context.py +++ b/src/wolfharness_server/opencode_server/event_processor_context.py @@ -14,13 +14,13 @@ if TYPE_CHECKING: - from agentpool_server.opencode_server.models import MessageWithParts - from agentpool_server.opencode_server.models.parts import ( + from wolfharness_server.opencode_server.models import MessageWithParts + from wolfharness_server.opencode_server.models.parts import ( ReasoningPart, TextPart, ToolPart, ) - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState def _model_validate_or_none(model_cls: type[Any], data: Any) -> Any | None: @@ -98,7 +98,7 @@ class EventProcessorContext: is_errored: bool = field(default=False, init=False) def __post_init__(self) -> None: - from agentpool.utils.time_utils import now_ms + from wolfharness.utils.time_utils import now_ms self.stream_start_ms = now_ms() @@ -160,8 +160,12 @@ def deserialize( Raises: ValueError: If required fields are missing from ``data``. """ - from agentpool_server.opencode_server.models import MessageWithParts - from agentpool_server.opencode_server.models.parts import ReasoningPart, TextPart, ToolPart + from wolfharness_server.opencode_server.models import MessageWithParts + from wolfharness_server.opencode_server.models.parts import ( + ReasoningPart, + TextPart, + ToolPart, + ) # --- reconstruct assistant message --- assistant_msg_raw: dict[str, Any] = data.get("assistant_msg", {}) diff --git a/src/agentpool_server/opencode_server/input_provider.py b/src/wolfharness_server/opencode_server/input_provider.py similarity index 96% rename from src/agentpool_server/opencode_server/input_provider.py rename to src/wolfharness_server/opencode_server/input_provider.py index 09e420602..847325bd7 100644 --- a/src/agentpool_server/opencode_server/input_provider.py +++ b/src/wolfharness_server/opencode_server/input_provider.py @@ -8,9 +8,9 @@ from mcp import types -from agentpool.log import get_logger -from agentpool.ui.base import InputProvider -from agentpool_server.opencode_server.models import ( +from wolfharness.log import get_logger +from wolfharness.ui.base import InputProvider +from wolfharness_server.opencode_server.models import ( PermissionAskedProperties, PermissionRequestEvent, PermissionToolInfo, @@ -18,10 +18,10 @@ if TYPE_CHECKING: - from agentpool.agents.context import AgentContext, ConfirmationResult - from agentpool_server.opencode_server.models import PermissionReply - from agentpool_server.opencode_server.models.question import QuestionInfo, QuestionRequest - from agentpool_server.opencode_server.state import ServerState + from wolfharness.agents.context import AgentContext, ConfirmationResult + from wolfharness_server.opencode_server.models import PermissionReply + from wolfharness_server.opencode_server.models.question import QuestionInfo, QuestionRequest + from wolfharness_server.opencode_server.state import ServerState logger = get_logger(__name__) @@ -273,7 +273,7 @@ def get_pending_questions(self) -> list[QuestionRequest]: Returns: List of pending question requests. """ - from agentpool_server.opencode_server.models.question import QuestionRequest + from wolfharness_server.opencode_server.models.question import QuestionRequest result: list[QuestionRequest] = [] for question_id, pending in self._pending_questions_dict.items(): @@ -351,9 +351,9 @@ async def _handle_single_enum( Returns: Elicit result with user's answer """ - from agentpool_server.opencode_server.models.events import QuestionAskedEvent - from agentpool_server.opencode_server.models.question import QuestionInfo, QuestionOption - from agentpool_server.opencode_server.state import PendingQuestion + from wolfharness_server.opencode_server.models.events import QuestionAskedEvent + from wolfharness_server.opencode_server.models.question import QuestionInfo, QuestionOption + from wolfharness_server.opencode_server.state import PendingQuestion # Extract enum values match schema: @@ -436,7 +436,7 @@ def _property_to_question(self, key: str, prop_schema: dict[str, Any]) -> Questi Returns: QuestionInfo configured for the property type """ - from agentpool_server.opencode_server.models.question import ( + from wolfharness_server.opencode_server.models.question import ( QuestionInfo, QuestionOption, ) @@ -524,8 +524,8 @@ async def _handle_multi_question( Returns: Elicit result with dict of property names to answers """ - from agentpool_server.opencode_server.models.events import QuestionAskedEvent - from agentpool_server.opencode_server.state import PendingQuestion + from wolfharness_server.opencode_server.models.events import QuestionAskedEvent + from wolfharness_server.opencode_server.state import PendingQuestion max_questions = 10 @@ -638,8 +638,8 @@ async def broadcast_elicitation_question( True if the question was broadcast successfully, False if the schema type is not supported. """ - from agentpool_server.opencode_server.models.events import QuestionAskedEvent - from agentpool_server.opencode_server.state import PendingQuestion + from wolfharness_server.opencode_server.models.events import QuestionAskedEvent + from wolfharness_server.opencode_server.state import PendingQuestion match params: case types.ElicitRequestFormParams( diff --git a/src/agentpool_server/opencode_server/models/__init__.py b/src/wolfharness_server/opencode_server/models/__init__.py similarity index 87% rename from src/agentpool_server/opencode_server/models/__init__.py rename to src/wolfharness_server/opencode_server/models/__init__.py index 69370923e..b8d9800be 100644 --- a/src/agentpool_server/opencode_server/models/__init__.py +++ b/src/wolfharness_server/opencode_server/models/__init__.py @@ -5,8 +5,8 @@ - by_alias=True serialization by default """ -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel -from agentpool_server.opencode_server.models.common import ( +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.common import ( FileDiff, FileDiffStatus, ModelRef, @@ -15,7 +15,7 @@ TokenCache, Tokens, ) -from agentpool_server.opencode_server.models.app import ( +from wolfharness_server.opencode_server.models.app import ( App, AppTimeInfo, DiagnosticResponse, @@ -30,7 +30,7 @@ UpgradeResponse, VcsInfo, ) -from agentpool_server.opencode_server.models.provider import ( +from wolfharness_server.opencode_server.models.provider import ( CostCache, Model, ModelCost, @@ -43,7 +43,7 @@ ProviderListResponse, ProvidersResponse, ) -from agentpool_server.opencode_server.models.session import ( +from wolfharness_server.opencode_server.models.session import ( Session, SessionCreateRequest, SessionForkRequest, @@ -57,7 +57,7 @@ SummarizeRequest, Todo, ) -from agentpool_server.opencode_server.models.message import ( +from wolfharness_server.opencode_server.models.message import ( APIError, APIErrorData, AssistantMessage, @@ -92,7 +92,7 @@ UnknownErrorData, UserMessage, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( AgentPart, APIErrorInfo, CompactionPart, @@ -118,7 +118,7 @@ ToolStatePending, ToolStateRunning, ) -from agentpool_server.opencode_server.models.file import ( +from wolfharness_server.opencode_server.models.file import ( FileContent, FileNode, FileStatus, @@ -126,10 +126,11 @@ Symbol, SubmatchInfo, ) -from agentpool_server.opencode_server.models.agent import ( +from wolfharness_server.opencode_server.models.agent import ( Agent, AuthInfo, Command, + OpenCodeCapabilities, ProviderAuthAuthorization, ProviderAuthMethod, SkillInfo, @@ -138,21 +139,22 @@ WorktreeRemoveRequest, WorktreeResetRequest, WorkspaceCreateRequest, + WorkspaceEventConnectionStatus, WorkspaceInfo, ) -from agentpool_server.opencode_server.models.diagnostics import ( +from wolfharness_server.opencode_server.models.diagnostics import ( FormatterStatus, Diagnostic, DiagnosticRange, ) -from agentpool_server.opencode_server.models.pty import ( +from wolfharness_server.opencode_server.models.pty import ( PtyCreateRequest, PtyInfo, PtySize, PtyUpdateRequest, ) -from agentpool_server.opencode_server.models.events import ( +from wolfharness_server.opencode_server.models.events import ( CommandExecutedEvent, Event, FileEditedEvent, @@ -204,25 +206,25 @@ SessionUpdatedEvent, TuiSessionSelectEvent, ) -from agentpool_server.opencode_server.models.mcp import ( +from wolfharness_server.opencode_server.models.mcp import ( LogRequest, McpAuthorizationResponse, MCPStatus, McpResource, ) -from agentpool_server.opencode_server.models.config import Config -from agentpool_server.opencode_server.models.question_permission import ( +from wolfharness_server.opencode_server.models.config import Config +from wolfharness_server.opencode_server.models.question_permission import ( OpenCodePendingPermission, OpenCodePendingQuestion, ) -from agentpool_server.opencode_server.models.question import ( +from wolfharness_server.opencode_server.models.question import ( QuestionInfo, QuestionOption, QuestionReply, QuestionRequest, QuestionToolInfo, ) -from agentpool_server.opencode_server.models.session_info import SessionInfo +from wolfharness_server.opencode_server.models.session_info import SessionInfo __all__ = [ "APIError", @@ -289,6 +291,7 @@ "ModelLimit", "ModelRef", "OpenCodeBaseModel", + "OpenCodeCapabilities", "OpenCodePendingPermission", "OpenCodePendingQuestion", "OutputFormat", @@ -409,6 +412,7 @@ "VcsBranchUpdatedEvent", "VcsInfo", "WorkspaceCreateRequest", + "WorkspaceEventConnectionStatus", "WorkspaceInfo", "WorktreeCreateRequest", "WorktreeInfo", diff --git a/src/agentpool_server/opencode_server/models/agent.py b/src/wolfharness_server/opencode_server/models/agent.py similarity index 85% rename from src/agentpool_server/opencode_server/models/agent.py rename to src/wolfharness_server/opencode_server/models/agent.py index 17ddfdb75..ab3dd7524 100644 --- a/src/agentpool_server/opencode_server/models/agent.py +++ b/src/wolfharness_server/opencode_server/models/agent.py @@ -6,8 +6,8 @@ from pydantic import Field -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel -from agentpool_server.opencode_server.models.common import ModelRef # noqa: TC001 +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.common import ModelRef # noqa: TC001 PermissionBehavior = Literal["ask", "allow", "deny"] @@ -181,6 +181,30 @@ class WorkspaceCreateRequest(OpenCodeBaseModel): """Backend-specific metadata.""" +class WorkspaceEventConnectionStatus(OpenCodeBaseModel): + """Connection status for a workspace. + + Matches OpenCode SDK's ``WorkspaceEventConnectionStatus`` type used by + ``/experimental/workspace/status``. + """ + + workspace_id: str + """Workspace identifier (serialized as ``workspaceID``).""" + + status: Literal["connected", "connecting", "disconnected", "error"] + """Connection status of the workspace event stream.""" + + +class OpenCodeCapabilities(OpenCodeBaseModel): + """Experimental server capabilities for OpenCode TUI. + + Matches the body OpenCode expects from ``/experimental/capabilities``. + """ + + background_subagents: bool + """Whether the server supports background subagents.""" + + class AuthInfo(OpenCodeBaseModel): """Authentication credential info.""" diff --git a/src/agentpool_server/opencode_server/models/app.py b/src/wolfharness_server/opencode_server/models/app.py similarity index 98% rename from src/agentpool_server/opencode_server/models/app.py rename to src/wolfharness_server/opencode_server/models/app.py index bdd06a78c..dfbb3aa6b 100644 --- a/src/agentpool_server/opencode_server/models/app.py +++ b/src/wolfharness_server/opencode_server/models/app.py @@ -6,7 +6,7 @@ from pathlib import Path from typing import Any, Self -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel _APP_NAME = "opencode" diff --git a/src/agentpool_server/opencode_server/models/base.py b/src/wolfharness_server/opencode_server/models/base.py similarity index 100% rename from src/agentpool_server/opencode_server/models/base.py rename to src/wolfharness_server/opencode_server/models/base.py diff --git a/src/agentpool_server/opencode_server/models/common.py b/src/wolfharness_server/opencode_server/models/common.py similarity index 95% rename from src/agentpool_server/opencode_server/models/common.py rename to src/wolfharness_server/opencode_server/models/common.py index ff56ac14e..af24c4aa3 100644 --- a/src/agentpool_server/opencode_server/models/common.py +++ b/src/wolfharness_server/opencode_server/models/common.py @@ -6,14 +6,14 @@ from pydantic import Field -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel if TYPE_CHECKING: from pydantic_ai.usage import UsageBase - from agentpool.utils.streams import FileChange + from wolfharness.utils.streams import FileChange FileDiffStatus = Literal["added", "deleted", "modified"] diff --git a/src/agentpool_server/opencode_server/models/config.py b/src/wolfharness_server/opencode_server/models/config.py similarity index 97% rename from src/agentpool_server/opencode_server/models/config.py rename to src/wolfharness_server/opencode_server/models/config.py index 06bf6cdde..9a29f30a4 100644 --- a/src/agentpool_server/opencode_server/models/config.py +++ b/src/wolfharness_server/opencode_server/models/config.py @@ -6,7 +6,7 @@ from pydantic import BaseModel, Field -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel DEFAULT_IGNORE = ["node_modules/**", "__pycache__/**", ".venv/**", "*.pyc", ".mypy_cache/**"] @@ -109,7 +109,7 @@ class Config(OpenCodeBaseModel): watcher: WatcherConfig = Field(default_factory=lambda: WatcherConfig(ignore=DEFAULT_IGNORE)) """File watcher configuration for ignore patterns.""" - # Additional fields OpenCode supports (not typically needed for agentpool): + # Additional fields OpenCode supports (not typically needed for wolfharness): # - $schema: JSON schema reference # - logLevel: Server-side log level # - tui: TUI-specific settings (scrollbar, sidebar width, etc.) diff --git a/src/agentpool_server/opencode_server/models/diagnostics.py b/src/wolfharness_server/opencode_server/models/diagnostics.py similarity index 100% rename from src/agentpool_server/opencode_server/models/diagnostics.py rename to src/wolfharness_server/opencode_server/models/diagnostics.py diff --git a/src/agentpool_server/opencode_server/models/events.py b/src/wolfharness_server/opencode_server/models/events.py similarity index 97% rename from src/agentpool_server/opencode_server/models/events.py rename to src/wolfharness_server/opencode_server/models/events.py index 23c54d6b1..3ce652280 100644 --- a/src/agentpool_server/opencode_server/models/events.py +++ b/src/wolfharness_server/opencode_server/models/events.py @@ -6,17 +6,17 @@ from pydantic import Field -from agentpool_server.opencode_server.models.app import Project # noqa: TC001 -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel -from agentpool_server.opencode_server.models.common import FileDiff # noqa: TC001 -from agentpool_server.opencode_server.models.message import MessageInfo # noqa: TC001 -from agentpool_server.opencode_server.models.parts import Part # noqa: TC001 -from agentpool_server.opencode_server.models.pty import PtyInfo # noqa: TC001 -from agentpool_server.opencode_server.models.question import ( # noqa: TC001 +from wolfharness_server.opencode_server.models.app import Project # noqa: TC001 +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.common import FileDiff # noqa: TC001 +from wolfharness_server.opencode_server.models.message import MessageInfo # noqa: TC001 +from wolfharness_server.opencode_server.models.parts import Part # noqa: TC001 +from wolfharness_server.opencode_server.models.pty import PtyInfo # noqa: TC001 +from wolfharness_server.opencode_server.models.question import ( # noqa: TC001 QuestionInfo, QuestionToolInfo, ) -from agentpool_server.opencode_server.models.session import ( +from wolfharness_server.opencode_server.models.session import ( Session, SessionStatus, SessionStatusType, diff --git a/src/agentpool_server/opencode_server/models/file.py b/src/wolfharness_server/opencode_server/models/file.py similarity index 91% rename from src/agentpool_server/opencode_server/models/file.py rename to src/wolfharness_server/opencode_server/models/file.py index 3d8d309f6..8c935946d 100644 --- a/src/agentpool_server/opencode_server/models/file.py +++ b/src/wolfharness_server/opencode_server/models/file.py @@ -6,8 +6,8 @@ from pydantic import BaseModel, Field -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel -from agentpool_server.opencode_server.models.common import FileDiffStatus # noqa: TC001 +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.common import FileDiffStatus # noqa: TC001 class FileNode(OpenCodeBaseModel): diff --git a/src/agentpool_server/opencode_server/models/mcp.py b/src/wolfharness_server/opencode_server/models/mcp.py similarity index 94% rename from src/agentpool_server/opencode_server/models/mcp.py rename to src/wolfharness_server/opencode_server/models/mcp.py index d8e85f7a4..995de18f2 100644 --- a/src/agentpool_server/opencode_server/models/mcp.py +++ b/src/wolfharness_server/opencode_server/models/mcp.py @@ -4,7 +4,7 @@ from pydantic import Field -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel MCPConnectionStatus = Literal["connected", "disconnected", "error"] diff --git a/src/agentpool_server/opencode_server/models/message.py b/src/wolfharness_server/opencode_server/models/message.py similarity index 98% rename from src/agentpool_server/opencode_server/models/message.py rename to src/wolfharness_server/opencode_server/models/message.py index ab6d86250..995302c28 100644 --- a/src/agentpool_server/opencode_server/models/message.py +++ b/src/wolfharness_server/opencode_server/models/message.py @@ -6,16 +6,16 @@ from pydantic import Field, model_validator -from agentpool.utils import identifiers as identifier -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel -from agentpool_server.opencode_server.models.common import ( +from wolfharness.utils import identifiers as identifier +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.common import ( FileDiff, ModelRef, TextSpan, TimeCreated, Tokens, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( AgentPart, APIErrorInfo, FilePart, diff --git a/src/agentpool_server/opencode_server/models/parts.py b/src/wolfharness_server/opencode_server/models/parts.py similarity index 97% rename from src/agentpool_server/opencode_server/models/parts.py rename to src/wolfharness_server/opencode_server/models/parts.py index 923827c40..2bdcacb4d 100644 --- a/src/agentpool_server/opencode_server/models/parts.py +++ b/src/wolfharness_server/opencode_server/models/parts.py @@ -6,9 +6,9 @@ from pydantic import Field -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel -from agentpool_server.opencode_server.models.common import ( +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.common import ( ModelRef, TextSpan, TimeCreated, diff --git a/src/agentpool_server/opencode_server/models/provider.py b/src/wolfharness_server/opencode_server/models/provider.py similarity index 96% rename from src/agentpool_server/opencode_server/models/provider.py rename to src/wolfharness_server/opencode_server/models/provider.py index 540ae5bfd..835dd81d5 100644 --- a/src/agentpool_server/opencode_server/models/provider.py +++ b/src/wolfharness_server/opencode_server/models/provider.py @@ -7,14 +7,14 @@ from pydantic import Field, model_validator -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel -from agentpool_server.opencode_server.models.common import ModelRef # noqa: TC001 +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.common import ModelRef # noqa: TC001 if TYPE_CHECKING: from tokonomics.model_discovery.model_info import ModelInfo as TokoModelInfo - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities logger = logging.getLogger(__name__) @@ -187,7 +187,7 @@ def from_tokonomics( # Passively populate the CapabilityCache from this ModelInfo. # Zero additional network requests — data is already available. try: - from agentpool.host.stubs import _get_default_cache + from wolfharness.host.stubs import _get_default_cache _get_default_cache().populate_cache_from_model_info(model) except Exception: # noqa: BLE001 diff --git a/src/agentpool_server/opencode_server/models/pty.py b/src/wolfharness_server/opencode_server/models/pty.py similarity index 94% rename from src/agentpool_server/opencode_server/models/pty.py rename to src/wolfharness_server/opencode_server/models/pty.py index 619820654..f326f0e13 100644 --- a/src/agentpool_server/opencode_server/models/pty.py +++ b/src/wolfharness_server/opencode_server/models/pty.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Literal -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel if TYPE_CHECKING: diff --git a/src/agentpool_server/opencode_server/models/question.py b/src/wolfharness_server/opencode_server/models/question.py similarity index 94% rename from src/agentpool_server/opencode_server/models/question.py rename to src/wolfharness_server/opencode_server/models/question.py index 121bd9c09..132460574 100644 --- a/src/agentpool_server/opencode_server/models/question.py +++ b/src/wolfharness_server/opencode_server/models/question.py @@ -4,7 +4,7 @@ from pydantic import Field -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel class QuestionOption(OpenCodeBaseModel): diff --git a/src/agentpool_server/opencode_server/models/question_permission.py b/src/wolfharness_server/opencode_server/models/question_permission.py similarity index 100% rename from src/agentpool_server/opencode_server/models/question_permission.py rename to src/wolfharness_server/opencode_server/models/question_permission.py diff --git a/src/agentpool_server/opencode_server/models/session.py b/src/wolfharness_server/opencode_server/models/session.py similarity index 95% rename from src/agentpool_server/opencode_server/models/session.py rename to src/wolfharness_server/opencode_server/models/session.py index f2084f72d..b779d7d0c 100644 --- a/src/agentpool_server/opencode_server/models/session.py +++ b/src/wolfharness_server/opencode_server/models/session.py @@ -6,8 +6,8 @@ from pydantic import Field -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel -from agentpool_server.opencode_server.models.common import ( # noqa: TC001 +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.common import ( # noqa: TC001 FileDiff, TimeCreatedUpdated, ) diff --git a/src/agentpool_server/opencode_server/models/session_info.py b/src/wolfharness_server/opencode_server/models/session_info.py similarity index 100% rename from src/agentpool_server/opencode_server/models/session_info.py rename to src/wolfharness_server/opencode_server/models/session_info.py diff --git a/src/agentpool_server/opencode_server/models/tool_metadata.py b/src/wolfharness_server/opencode_server/models/tool_metadata.py similarity index 99% rename from src/agentpool_server/opencode_server/models/tool_metadata.py rename to src/wolfharness_server/opencode_server/models/tool_metadata.py index 0f5b07e83..bacfedc0c 100644 --- a/src/agentpool_server/opencode_server/models/tool_metadata.py +++ b/src/wolfharness_server/opencode_server/models/tool_metadata.py @@ -19,7 +19,7 @@ from typing import Any, Literal, NotRequired, TypedDict -from agentpool_server.opencode_server.models.common import FileDiffStatus # noqa: TC001 +from wolfharness_server.opencode_server.models.common import FileDiffStatus # noqa: TC001 ChangeType = Literal["add", "update", "delete", "move"] diff --git a/src/agentpool_server/opencode_server/opencode_event_bridge.py b/src/wolfharness_server/opencode_server/opencode_event_bridge.py similarity index 97% rename from src/agentpool_server/opencode_server/opencode_event_bridge.py rename to src/wolfharness_server/opencode_server/opencode_event_bridge.py index 42620dcd0..578f30e30 100644 --- a/src/agentpool_server/opencode_server/opencode_event_bridge.py +++ b/src/wolfharness_server/opencode_server/opencode_event_bridge.py @@ -12,7 +12,7 @@ import asyncio from typing import TYPE_CHECKING, Any, cast -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( CustomEvent, RunErrorEvent, RunFailedEvent, @@ -21,14 +21,14 @@ StreamCompleteEvent, UserMessageInsertedEvent, ) -from agentpool.log import get_logger -from agentpool.utils import identifiers as identifier -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.event_adapter import OpenCodeEventAdapter -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.log import get_logger +from wolfharness.utils import identifiers as identifier +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.event_adapter import OpenCodeEventAdapter +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessageAbortedError, MessageAbortedErrorData, @@ -45,10 +45,10 @@ Tokens, UserMessage, ) -from agentpool_server.opencode_server.opencode_message_bridge import ( +from wolfharness_server.opencode_server.opencode_message_bridge import ( append_message_to_session, ) -from agentpool_server.opencode_server.opencode_session_routes import ( +from wolfharness_server.opencode_server.opencode_session_routes import ( ensure_session, set_session_status, ) @@ -57,9 +57,9 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool.agents.base_agent import BaseAgent - from agentpool.orchestrator.core import EventBus, EventEnvelope - from agentpool_server.opencode_server.state import ServerState + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.orchestrator.core import EventBus, EventEnvelope + from wolfharness_server.opencode_server.state import ServerState logger = get_logger(__name__) @@ -167,7 +167,7 @@ def _create_assistant_message(self, session_id: str) -> tuple[str, MessageWithPa if assistant_msg_id is None: assistant_msg_id = identifier.ascending("message") - agent_name = "agentpool" + agent_name = "wolfharness" model_id, provider_id = self.server_state.resolve_default_model_info() session_state = self.session_pool.sessions.get_session(session_id) if session_state is not None: @@ -186,7 +186,7 @@ def _create_assistant_message(self, session_id: str) -> tuple[str, MessageWithPa if session_state.agent is not None: agent_model_name = cast("BaseAgent[Any, Any]", session_state.agent).model_name model_variants = self.server_state.model_variants - from agentpool_server.shared.model_utils import ( + from wolfharness_server.shared.model_utils import ( _extract_provider, _find_variant_name, ) @@ -266,7 +266,7 @@ async def _persist_assistant_message(self, session_id: str) -> None: RunFailedEvent. This replaces the storage persistence previously done by _wait_and_finalize in the synchronous POST /message path. """ - from agentpool_server.opencode_server.routes.message_routes import ( + from wolfharness_server.opencode_server.routes.message_routes import ( persist_message_to_storage, ) @@ -463,7 +463,7 @@ async def _ensure_child_session_visible( # TUI shows the enriched title (e.g. "Team 'X' · Member (@Y subagent)"). if title is not None and session.title != title: session.title = title - from agentpool_server.opencode_server.models import SessionUpdatedEvent + from wolfharness_server.opencode_server.models import SessionUpdatedEvent await self.server_state.broadcast_event(SessionUpdatedEvent.create(session)) @@ -936,7 +936,7 @@ async def subscribe_to_events(self, session_id: str) -> AsyncIterator[Any]: event_stream = await self.session_pool.event_bus.subscribe(session_id) try: - from agentpool.orchestrator.core import drain_and_merge + from wolfharness.orchestrator.core import drain_and_merge async for event in drain_and_merge(event_stream): async for oc_event in event_adapter.convert_event(event.event): diff --git a/src/agentpool_server/opencode_server/opencode_message_bridge.py b/src/wolfharness_server/opencode_server/opencode_message_bridge.py similarity index 96% rename from src/agentpool_server/opencode_server/opencode_message_bridge.py rename to src/wolfharness_server/opencode_server/opencode_message_bridge.py index f76e8b10d..20a91e139 100644 --- a/src/agentpool_server/opencode_server/opencode_message_bridge.py +++ b/src/wolfharness_server/opencode_server/opencode_message_bridge.py @@ -9,20 +9,20 @@ from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.converters import ( +from wolfharness.log import get_logger +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.converters import ( chat_message_to_opencode, opencode_to_chat_message, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, PartUpdatedEvent, TimeCreatedUpdated, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( TimeStart, TimeStartEnd, TimeStartEndCompacted, @@ -31,7 +31,7 @@ ToolStateError, ToolStateRunning, ) -from agentpool_server.opencode_server.models.session import Session +from wolfharness_server.opencode_server.models.session import Session # ToolState variants that have a ``metadata`` attribute. @@ -41,8 +41,12 @@ if TYPE_CHECKING: - from agentpool.agents.events.events import RunErrorEvent, SpawnSessionStart, StreamCompleteEvent - from agentpool_server.opencode_server.state import ServerState + from wolfharness.agents.events.events import ( + RunErrorEvent, + SpawnSessionStart, + StreamCompleteEvent, + ) + from wolfharness_server.opencode_server.state import ServerState logger = get_logger(__name__) @@ -242,7 +246,7 @@ def _session_state_to_opencode(state: Any) -> Session: Returns: OpenCode Session model. """ - from agentpool_storage.opencode_provider import helpers + from wolfharness_storage.opencode_provider import helpers created_ms = state.created_at_ns // 1_000_000 updated_ms = state.last_active_at_ns // 1_000_000 @@ -284,9 +288,9 @@ def _reconstruct_tool_parts_from_checkpoint( if not pending_calls: return - from agentpool.utils import identifiers as identifier - from agentpool.utils.time_utils import now_ms - from agentpool_server.opencode_server.models.parts import ( + from wolfharness.utils import identifiers as identifier + from wolfharness.utils.time_utils import now_ms + from wolfharness_server.opencode_server.models.parts import ( TimeStart, ToolPart, ToolStateRunning, @@ -296,9 +300,9 @@ def _reconstruct_tool_parts_from_checkpoint( assistant_msg_id = identifier.ascending("message") # Agent/model propagation: look up the real agent_name from the - # session state instead of hardcoding "agentpool". Falls back to - # "agentpool" when the session state is unavailable. - agent_name = "agentpool" + # session state instead of hardcoding "wolfharness". Falls back to + # "wolfharness" when the session state is unavailable. + agent_name = "wolfharness" pool = state.pool_or_none session_pool = pool.session_pool if pool is not None else None if session_pool is not None: @@ -377,7 +381,7 @@ async def _create_subagent_tool_part( Returns: The created ToolPart, or None if one already exists for this child. """ - from agentpool.utils import identifiers as identifier + from wolfharness.utils import identifiers as identifier # Find the parent session's latest assistant message from in-memory state # (not via get_messages_for_session, which may return copies when diff --git a/src/agentpool_server/opencode_server/opencode_session_routes.py b/src/wolfharness_server/opencode_server/opencode_session_routes.py similarity index 95% rename from src/agentpool_server/opencode_server/opencode_session_routes.py rename to src/wolfharness_server/opencode_server/opencode_session_routes.py index 7dae20180..5dbb0274a 100644 --- a/src/agentpool_server/opencode_server/opencode_session_routes.py +++ b/src/wolfharness_server/opencode_server/opencode_session_routes.py @@ -11,26 +11,26 @@ import asyncio from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger -from agentpool.utils.identifiers import extract_timestamp_ms -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.models import ( +from wolfharness.log import get_logger +from wolfharness.utils.identifiers import extract_timestamp_ms +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.models import ( SessionCreatedEvent, SessionErrorEvent, SessionStatus, SessionStatusEvent, TimeCreatedUpdated, ) -from agentpool_server.opencode_server.opencode_message_bridge import ( +from wolfharness_server.opencode_server.opencode_message_bridge import ( _reconstruct_tool_parts_from_checkpoint, ) if TYPE_CHECKING: - from agentpool.orchestrator.core import SessionPool - from agentpool.sessions.models import SessionData - from agentpool_server.opencode_server.models.session import Session - from agentpool_server.opencode_server.state import ServerState + from wolfharness.orchestrator.core import SessionPool + from wolfharness.sessions.models import SessionData + from wolfharness_server.opencode_server.models.session import Session + from wolfharness_server.opencode_server.state import ServerState logger = get_logger(__name__) @@ -116,8 +116,8 @@ async def ensure_session( Returns: The Session object (existing or newly created) """ - from agentpool_server.opencode_server.converters import session_data_to_opencode - from agentpool_server.opencode_server.models import SessionUpdatedEvent + from wolfharness_server.opencode_server.converters import session_data_to_opencode + from wolfharness_server.opencode_server.models import SessionUpdatedEvent # --- Fast path: already in memory ----------------------------------- if session_id in state.sessions: @@ -169,7 +169,7 @@ async def ensure_session( if sp_session is not None: sp_session.input_provider = input_provider - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( SessionCreatedEvent, ) @@ -205,13 +205,13 @@ async def _create_and_persist_session( Returns: The newly created and persisted ``Session``. """ - from agentpool_server.opencode_server.converters import opencode_to_session_data - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.converters import opencode_to_session_data + from wolfharness_server.opencode_server.models import ( Session, SessionCreatedEvent, SessionUpdatedEvent, ) - from agentpool_storage.opencode_provider import helpers + from wolfharness_storage.opencode_provider import helpers now = extract_timestamp_ms(session_id) or now_ms() if parent_id is not None: @@ -377,7 +377,7 @@ async def create_session( Returns: The session state from the SessionPool. """ - from agentpool_server.opencode_server.opencode_message_bridge import ( + from wolfharness_server.opencode_server.opencode_message_bridge import ( _session_state_to_opencode, ) @@ -514,7 +514,7 @@ async def route_message( self._pending_message_ids[session_id] = pending_id # Store model metadata so _before_consumer_loop can propagate the # real agent/model onto the assistant message instead of hardcoding - # "agentpool"/"default"/"agentpool". + # "wolfharness"/"default"/"wolfharness". self._pending_message_metadata[session_id] = { "message_id": message_id, "model_id": model_id, @@ -536,7 +536,7 @@ async def route_message( if session_state is not None: session_state.input_provider = input_provider - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode delivery_mode = DeliveryMode.STEER if priority == "asap" else DeliveryMode.QUEUE return await self.session_pool.send_message( diff --git a/src/wolfharness_server/opencode_server/otel_fastapi_patch.py b/src/wolfharness_server/opencode_server/otel_fastapi_patch.py new file mode 100644 index 000000000..5beb48693 --- /dev/null +++ b/src/wolfharness_server/opencode_server/otel_fastapi_patch.py @@ -0,0 +1,98 @@ +"""Workaround for OpenTelemetry FastAPI instrumentation with FastAPI >= 0.136. + +FastAPI >= 0.136 wraps sub-routers added via ``include_router`` in an +``_IncludedRouter`` wrapper. These wrappers are matchable base routes that +intentionally carry no ``path`` attribute. + +``opentelemetry.instrumentation.fastapi._get_route_details`` walks +``app.routes`` and reads ``route.path``. Its ``Match.FULL`` branch already +guards the missing-``path`` case with try/except, but the ``Match.PARTIAL`` +branch does not — so any request that only *partially* matches a +lazily-included route (for example a dynamic path like ``/session/{id}/message`` +inside an included router) raises ``AttributeError`` and turns into a 500. + +This module replaces the module-level ``_get_route_details`` helper in +``opentelemetry.instrumentation.fastapi`` with a guarded copy. +``_get_default_span_details`` resolves it as a module global on every call, so +the reassignment takes effect without re-instrumenting the app. + +Why a runtime patch instead of upgrading the dependency? +-------------------------------------------------------- +The upstream OpenTelemetry fix landed in ``opentelemetry-instrumentation- +fastapi>=0.64b0``, but it requires ``opentelemetry-semantic-conventions`` +pinned to the exact same ``0.6xb0`` version, i.e. ``==0.64b0``. The pinned +``mistralai`` (a transitive dep of ``pydantic-ai-slim[mistral]``) declares +``opentelemetry-semantic-conventions<0.61`` and cannot coexist with that +upgrade, so the dependency graph is unsatisfiable unless we override +``mistralai``'s metadata. + +We deliberately avoid that override (see below) and keep this patch instead: + +- ``[[tool.uv.dependency-metadata]]`` overrides DO NOT propagate to downstream + projects that depend on ``wolfharness`` (e.g. ``xeno-agent``). Every consumer + would have to repeat the same override in its own ``pyproject.toml``, which + turns a single dependency bump into a coordination burden across repositories. +- The patch is fully local to this package: it changes no dependency versions, + so all downstream projects keep working without edits. +- ``mistralai`` only imports stable attribute constants from + ``opentelemetry.semconv.attributes``; the semantic-conventions contents it + relies on are stable across the 0.60-0.65 betas. +- ``opentelemetry-instrumentation-fastapi`` is a pre-release (``0.6xb0``); the + patch is immune to beta-version churn and works on any version in range. + +Revisit the upstream upgrade (removing this module) if either condition changes: +(1) ``mistralai`` relaxes its ``opentelemetry-semantic-conventions`` pin, or +(2) ``dependency-metadata`` overrides start propagating transitively. +""" + +from __future__ import annotations + +from typing import Any + +from starlette.routing import Match, Route + + +def _safe_get_route_details(scope: dict[str, Any]) -> str | None: + """Route-details resolver matching OTel's with a guarded PARTIAL branch. + + Identical to the OTel implementation except the ``Match.PARTIAL`` branch + falls back to ``scope["path"]`` when the matched route has no ``path`` + attribute (FastAPI >= 0.136 ``_IncludedRouter`` wrappers). + """ + app = scope["app"] + route: str | None = None + + for starlette_route in app.routes: + match, _ = ( + Route.matches(starlette_route, scope) + if isinstance(starlette_route, Route) + else starlette_route.matches(scope) + ) + if match == Match.FULL: + try: + route = starlette_route.path + except AttributeError: + # routes added via host routing won't have a path attribute + route = scope.get("path") + break + if match == Match.PARTIAL: + try: + route = starlette_route.path + except AttributeError: + # FastAPI >= 0.136 ``_IncludedRouter`` wrappers carry no path. + route = scope.get("path") + return route + + +def patch_otel_fastapi_route_details() -> None: + """Replace OTel's ``_get_route_details`` with the guarded version. + + Idempotent: re-applying ends with the OTel module pointing at our guarded + function either way. Safe to call before ``logfire.instrument_fastapi``. + """ + import opentelemetry.instrumentation.fastapi as otel_fastapi + + otel_fastapi.__dict__["_get_route_details"] = _safe_get_route_details + + +__all__ = ["patch_otel_fastapi_route_details"] diff --git a/src/agentpool_server/opencode_server/provider_auth.py b/src/wolfharness_server/opencode_server/provider_auth.py similarity index 98% rename from src/agentpool_server/opencode_server/provider_auth.py rename to src/wolfharness_server/opencode_server/provider_auth.py index 8ea15338e..a172a9991 100644 --- a/src/agentpool_server/opencode_server/provider_auth.py +++ b/src/wolfharness_server/opencode_server/provider_auth.py @@ -13,7 +13,7 @@ import httpx -from agentpool.auth.anthropic_auth import ( +from wolfharness.auth.anthropic_auth import ( OAUTH_MANUAL_REDIRECT_URI, AnthropicOAuthToken, AnthropicTokenStore, @@ -21,14 +21,14 @@ exchange_code_for_token, generate_pkce, ) -from agentpool_server.opencode_server.models.agent import ( +from wolfharness_server.opencode_server.models.agent import ( ProviderAuthAuthorization, ProviderAuthMethod, ) if TYPE_CHECKING: - from agentpool_server.opencode_server.models.agent import AuthInfo + from wolfharness_server.opencode_server.models.agent import AuthInfo class ProviderAuthBackend(ABC): diff --git a/src/wolfharness_server/opencode_server/routes/__init__.py b/src/wolfharness_server/opencode_server/routes/__init__.py new file mode 100644 index 000000000..4b86bdba7 --- /dev/null +++ b/src/wolfharness_server/opencode_server/routes/__init__.py @@ -0,0 +1,29 @@ +"""Route handlers for the OpenCode API.""" + +from wolfharness_server.opencode_server.routes.global_routes import router as global_router +from wolfharness_server.opencode_server.routes.app_routes import router as app_router +from wolfharness_server.opencode_server.routes.config_routes import router as config_router +from wolfharness_server.opencode_server.routes.session_routes import router as session_router +from wolfharness_server.opencode_server.routes.message_routes import router as message_router +from wolfharness_server.opencode_server.routes.file_routes import router as file_router +from wolfharness_server.opencode_server.routes.agent_routes import router as agent_router +from wolfharness_server.opencode_server.routes.permission_routes import router as permission_router +from wolfharness_server.opencode_server.routes.question_routes import router as question_router +from wolfharness_server.opencode_server.routes.pty_routes import router as pty_router +from wolfharness_server.opencode_server.routes.tui_routes import router as tui_router +from wolfharness_server.opencode_server.routes.lsp_routes import router as lsp_router + +__all__ = [ + "agent_router", + "app_router", + "config_router", + "file_router", + "global_router", + "lsp_router", + "message_router", + "permission_router", + "pty_router", + "question_router", + "session_router", + "tui_router", +] diff --git a/src/agentpool_server/opencode_server/routes/agent_routes.py b/src/wolfharness_server/opencode_server/routes/agent_routes.py similarity index 92% rename from src/agentpool_server/opencode_server/routes/agent_routes.py rename to src/wolfharness_server/opencode_server/routes/agent_routes.py index cab2e8ba7..5f80afe19 100644 --- a/src/agentpool_server/opencode_server/routes/agent_routes.py +++ b/src/wolfharness_server/opencode_server/routes/agent_routes.py @@ -9,17 +9,17 @@ from fastapi import APIRouter, HTTPException from pydantic import BaseModel, HttpUrl -from agentpool.capabilities.combined_toolset import CombinedToolsetCapability -from agentpool.log import get_logger -from agentpool.mcp_server.manager import MCPManager -from agentpool_config.mcp_server import ( +from wolfharness.capabilities.combined_toolset import CombinedToolsetCapability +from wolfharness.log import get_logger +from wolfharness.mcp_server.manager import MCPManager +from wolfharness_config.mcp_server import ( SSEMCPServerConfig, StdioMCPServerConfig, StreamableHTTPMCPServerConfig, ) -from agentpool_server.opencode_server.converters import to_mcp_status -from agentpool_server.opencode_server.dependencies import StateDep -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.converters import to_mcp_status +from wolfharness_server.opencode_server.dependencies import StateDep +from wolfharness_server.opencode_server.models import ( Agent, AuthInfo, Command, @@ -30,11 +30,13 @@ McpAuthorizationResponse, McpResource, MCPStatus, + OpenCodeCapabilities, ProviderAuthAuthorization, ProviderAuthMethod, Session, SkillInfo, WorkspaceCreateRequest, + WorkspaceEventConnectionStatus, WorkspaceInfo, WorktreeCreateRequest, WorktreeInfo, @@ -102,7 +104,7 @@ def _find_mcp_manager(state: Any, session_id: str | None = None) -> MCPManager | state: Server state session_id: Optional session ID for scoped capability lookup. """ - from agentpool.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel agent = state.agent host_ctx = agent.host_context @@ -500,8 +502,8 @@ async def list_mcp_resources(state: StateDep) -> dict[str, McpResource]: result: dict[str, McpResource] = {} import asyncio - from agentpool.capabilities.extension_registry import Scope, ScopeLevel - from agentpool.capabilities.resource_protocols import ResourceAccess + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.resource_protocols import ResourceAccess agent = state.agent host_ctx = agent.host_context @@ -551,7 +553,7 @@ async def list_mcp_resources(state: StateDep) -> dict[str, McpResource]: @router.post("/experimental/worktree") async def create_worktree(request: WorktreeCreateRequest, state: StateDep) -> WorktreeInfo: """Create a new git worktree for isolated agent work.""" - from agentpool.utils.worktree import create_worktree + from wolfharness.utils.worktree import create_worktree repo_dir = state.agent.env.cwd or state.working_dir try: @@ -564,7 +566,7 @@ async def create_worktree(request: WorktreeCreateRequest, state: StateDep) -> Wo @router.get("/experimental/worktree") async def list_worktrees(state: StateDep) -> list[str]: """List all sandbox worktree directories.""" - from agentpool.utils.worktree import list_worktrees + from wolfharness.utils.worktree import list_worktrees repo_dir = state.agent.env.cwd or state.working_dir return await list_worktrees(repo_dir) @@ -573,7 +575,7 @@ async def list_worktrees(state: StateDep) -> list[str]: @router.delete("/experimental/worktree") async def remove_worktree(request: WorktreeRemoveRequest, state: StateDep) -> bool: """Remove a git worktree and delete its branch.""" - from agentpool.utils.worktree import remove_worktree + from wolfharness.utils.worktree import remove_worktree repo_dir = state.agent.env.cwd or state.working_dir try: @@ -586,7 +588,7 @@ async def remove_worktree(request: WorktreeRemoveRequest, state: StateDep) -> bo @router.post("/experimental/worktree/reset") async def reset_worktree(request: WorktreeResetRequest, state: StateDep) -> bool: """Reset a worktree branch to the primary default branch.""" - from agentpool.utils.worktree import reset_worktree + from wolfharness.utils.worktree import reset_worktree repo_dir = state.agent.env.cwd or state.working_dir try: @@ -598,7 +600,7 @@ async def reset_worktree(request: WorktreeResetRequest, state: StateDep) -> bool async def _get_project_id(state: StateDep) -> str: """Return the current OpenCode project ID for compatibility responses.""" - from agentpool_storage.project_store import ProjectStore + from wolfharness_storage.project_store import ProjectStore project = await ProjectStore(state.storage).get_or_create(state.working_dir) return project.project_id @@ -626,7 +628,7 @@ def _workspace_from_worktree( @router.get("/experimental/workspace") async def list_workspaces(state: StateDep) -> list[WorkspaceInfo]: """List worktree-backed workspaces for OpenCode TUI compatibility.""" - from agentpool.utils.worktree import list_worktrees + from wolfharness.utils.worktree import list_worktrees repo_dir = state.agent.env.cwd or state.working_dir project_id = await _get_project_id(state) @@ -636,10 +638,40 @@ async def list_workspaces(state: StateDep) -> list[WorkspaceInfo]: ] +@router.get("/experimental/workspace/status") +async def get_workspace_status( + state: StateDep, + directory: str | None = None, + workspace: str | None = None, +) -> list[WorkspaceEventConnectionStatus]: + """Return workspace event-stream connection statuses. + + OpenCode SDK expects ``Array``. We do not + maintain per-workspace event-stream connections, so the result is empty. + + Args: + state: Server state (kept for request context compatibility). + directory: Optional directory filter (unused, kept for contract). + workspace: Optional workspace filter (unused, kept for contract). + """ + _ = directory, workspace, state + return [] + + +@router.get("/experimental/capabilities") +async def get_capabilities() -> OpenCodeCapabilities: + """Return experimental server capabilities for the OpenCode client. + + OpenCode requires the ``backgroundSubagents`` field. We do not yet support + background subagents, so this is reported as ``false``. + """ + return OpenCodeCapabilities(background_subagents=False) + + @router.post("/experimental/workspace") async def create_workspace(request: WorkspaceCreateRequest, state: StateDep) -> WorkspaceInfo: """Create a worktree-backed workspace through OpenCode's workspace API.""" - from agentpool.utils.worktree import create_worktree + from wolfharness.utils.worktree import create_worktree if request.type != "worktree": raise HTTPException(status_code=400, detail="Only worktree workspaces are supported") @@ -660,7 +692,7 @@ async def create_workspace(request: WorkspaceCreateRequest, state: StateDep) -> @router.delete("/experimental/workspace/{workspace_id}") async def remove_workspace(workspace_id: str, state: StateDep) -> WorkspaceInfo | None: """Remove a worktree-backed workspace by OpenCode workspace ID.""" - from agentpool.utils.worktree import list_worktrees, remove_worktree + from wolfharness.utils.worktree import list_worktrees, remove_worktree repo_dir = state.agent.env.cwd or state.working_dir project_id = await _get_project_id(state) @@ -694,7 +726,7 @@ async def list_sessions_global( Supports pagination via cursor (timestamp-based). """ - from agentpool_server.opencode_server.converters import session_data_to_opencode + from wolfharness_server.opencode_server.converters import session_data_to_opencode effective_limit = limit or 100 sessions: list[Session] = [] diff --git a/src/agentpool_server/opencode_server/routes/app_routes.py b/src/wolfharness_server/opencode_server/routes/app_routes.py similarity index 95% rename from src/agentpool_server/opencode_server/routes/app_routes.py rename to src/wolfharness_server/opencode_server/routes/app_routes.py index e5d5113f8..2a8a1b08d 100644 --- a/src/agentpool_server/opencode_server/routes/app_routes.py +++ b/src/wolfharness_server/opencode_server/routes/app_routes.py @@ -9,9 +9,9 @@ import anyenv from fastapi import APIRouter, HTTPException -from agentpool.utils.time_utils import datetime_to_ms -from agentpool_server.opencode_server.dependencies import StateDep -from agentpool_server.opencode_server.models import ( +from wolfharness.utils.time_utils import datetime_to_ms +from wolfharness_server.opencode_server.dependencies import StateDep +from wolfharness_server.opencode_server.models import ( App, AppTimeInfo, PathInfo, @@ -22,12 +22,12 @@ ProjectUpdateRequest, VcsInfo, ) -from agentpool_storage.opencode_provider import helpers -from agentpool_storage.project_store import ProjectStore +from wolfharness_storage.opencode_provider import helpers +from wolfharness_storage.project_store import ProjectStore if TYPE_CHECKING: - from agentpool.sessions.models import ProjectData + from wolfharness.sessions.models import ProjectData router = APIRouter(tags=["app"]) diff --git a/src/agentpool_server/opencode_server/routes/config_routes.py b/src/wolfharness_server/opencode_server/routes/config_routes.py similarity index 97% rename from src/agentpool_server/opencode_server/routes/config_routes.py rename to src/wolfharness_server/opencode_server/routes/config_routes.py index 791f57ebc..c4306bf7f 100644 --- a/src/agentpool_server/opencode_server/routes/config_routes.py +++ b/src/wolfharness_server/opencode_server/routes/config_routes.py @@ -10,10 +10,10 @@ from fastapi import APIRouter -from agentpool.log import get_logger -from agentpool.models.manifest import AgentsManifest -from agentpool_server.opencode_server.dependencies import StateDep -from agentpool_server.opencode_server.models import ( +from wolfharness.log import get_logger +from wolfharness.models.manifest import AgentsManifest +from wolfharness_server.opencode_server.dependencies import StateDep +from wolfharness_server.opencode_server.models import ( Config, Mode, Model, @@ -24,13 +24,13 @@ ProviderListResponse, ProvidersResponse, ) -from agentpool_server.shared.constants import ( +from wolfharness_server.shared.constants import ( DEFAULT_MODEL_CONTEXT_LIMIT, DEFAULT_MODEL_INPUT_COST, DEFAULT_MODEL_OUTPUT_COST, DEFAULT_MODEL_OUTPUT_LIMIT, ) -from agentpool_server.shared.model_utils import ( +from wolfharness_server.shared.model_utils import ( _build_providers_from_tokonomics, _extract_provider, ) @@ -306,7 +306,7 @@ def _infer_default_model(state: StateDep) -> str | None: # agent_cfg.model may be a raw str or a structured config (e.g. # StringModelConfig with identifier). The identifier itself can be # either a variant name ("glm47") or a full model id ("openai-chat:svc/glm-4.7"). - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig if not isinstance(agent_cfg, NativeAgentConfig): return None @@ -340,7 +340,7 @@ def _infer_default_model(state: StateDep) -> str | None: @router.get("/config") async def get_config(state: StateDep) -> Config: """Get server configuration.""" - from agentpool_server.opencode_server.models.config import Keybinds, WatcherConfig + from wolfharness_server.opencode_server.models.config import Keybinds, WatcherConfig # Initialize config if not yet set if state.config is None: diff --git a/src/agentpool_server/opencode_server/routes/file_routes.py b/src/wolfharness_server/opencode_server/routes/file_routes.py similarity index 98% rename from src/agentpool_server/opencode_server/routes/file_routes.py rename to src/wolfharness_server/opencode_server/routes/file_routes.py index 199484e3c..82058c898 100644 --- a/src/agentpool_server/opencode_server/routes/file_routes.py +++ b/src/wolfharness_server/opencode_server/routes/file_routes.py @@ -11,8 +11,8 @@ from fastapi import APIRouter, HTTPException, Query import ripgrep_rs -from agentpool_server.opencode_server.dependencies import StateDep -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.dependencies import StateDep +from wolfharness_server.opencode_server.models import ( FileContent, FileNode, FindMatch, diff --git a/src/agentpool_server/opencode_server/routes/global_routes.py b/src/wolfharness_server/opencode_server/routes/global_routes.py similarity index 96% rename from src/agentpool_server/opencode_server/routes/global_routes.py rename to src/wolfharness_server/opencode_server/routes/global_routes.py index 6667ef47b..e09d2ab91 100644 --- a/src/agentpool_server/opencode_server/routes/global_routes.py +++ b/src/wolfharness_server/opencode_server/routes/global_routes.py @@ -11,16 +11,16 @@ from fastapi import APIRouter, Query from sse_starlette.sse import EventSourceResponse -from agentpool import log -from agentpool.agents.events.events import CustomEvent -from agentpool_server.opencode_server.dependencies import StateDep -from agentpool_server.opencode_server.models import Event, GlobalEvent, HealthResponse -from agentpool_server.opencode_server.models.app import ( +from wolfharness import log +from wolfharness.agents.events.events import CustomEvent +from wolfharness_server.opencode_server.dependencies import StateDep +from wolfharness_server.opencode_server.models import Event, GlobalEvent, HealthResponse +from wolfharness_server.opencode_server.models.app import ( DiagnosticResponse, DisposeResponse, UpgradeResponse, ) -from agentpool_server.opencode_server.models.events import ( +from wolfharness_server.opencode_server.models.events import ( MessageUpdatedEvent, PartUpdatedEvent, ServerConnectedEvent, @@ -30,7 +30,7 @@ SessionIdProperties, SessionUpdatedEvent, ) -from agentpool_server.opencode_server.routes.routing import ( +from wolfharness_server.opencode_server.routes.routing import ( RoutingCheckResponse, tui_event_filter, ) @@ -39,7 +39,7 @@ if TYPE_CHECKING: from collections.abc import AsyncGenerator - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState logger = log.get_logger(__name__) @@ -280,7 +280,7 @@ async def _event_generator( # noqa: PLR0915 except asyncio.QueueShutDown: break - from agentpool.orchestrator.core import EventEnvelope + from wolfharness.orchestrator.core import EventEnvelope inner_event: Any inner_event = raw_event.event if isinstance(raw_event, EventEnvelope) else raw_event diff --git a/src/agentpool_server/opencode_server/routes/lsp_routes.py b/src/wolfharness_server/opencode_server/routes/lsp_routes.py similarity index 98% rename from src/agentpool_server/opencode_server/routes/lsp_routes.py rename to src/wolfharness_server/opencode_server/routes/lsp_routes.py index ef1d7d86b..653d341d8 100644 --- a/src/agentpool_server/opencode_server/routes/lsp_routes.py +++ b/src/wolfharness_server/opencode_server/routes/lsp_routes.py @@ -11,8 +11,8 @@ from fastapi import APIRouter, HTTPException, Query -from agentpool_server.opencode_server.dependencies import StateDep -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.dependencies import StateDep +from wolfharness_server.opencode_server.models import ( Diagnostic, DiagnosticRange, FormatterStatus, diff --git a/src/agentpool_server/opencode_server/routes/message_routes.py b/src/wolfharness_server/opencode_server/routes/message_routes.py similarity index 97% rename from src/agentpool_server/opencode_server/routes/message_routes.py rename to src/wolfharness_server/opencode_server/routes/message_routes.py index 15bee8aa3..02cee0412 100644 --- a/src/agentpool_server/opencode_server/routes/message_routes.py +++ b/src/wolfharness_server/opencode_server/routes/message_routes.py @@ -9,15 +9,15 @@ from fastapi import APIRouter, HTTPException, Query, status -from agentpool.log import get_logger -from agentpool.utils import identifiers as identifier -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.converters import ( +from wolfharness.log import get_logger +from wolfharness.utils import identifiers as identifier +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.converters import ( extract_user_prompt_from_parts, opencode_to_chat_message, ) -from agentpool_server.opencode_server.dependencies import StateDep -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.dependencies import StateDep +from wolfharness_server.opencode_server.models import ( AgentPartInput, AssistantMessage, FilePartInput, @@ -40,13 +40,13 @@ Tokens, UserMessage, ) -from agentpool_server.opencode_server.routes.session_routes import get_or_load_session -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.routes.session_routes import get_or_load_session +from wolfharness_server.opencode_server.session_pool_integration import ( append_message_to_session, get_messages_for_session, set_session_status, ) -from agentpool_server.opencode_server.stream_adapter import OpenCodeStreamAdapter +from wolfharness_server.opencode_server.stream_adapter import OpenCodeStreamAdapter if TYPE_CHECKING: @@ -54,13 +54,13 @@ from pydantic_ai import UserContent - from agentpool.common_types import PathReference - from agentpool.messaging import ChatMessage - from agentpool.orchestrator.session_pool import SessionPool - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness.common_types import PathReference + from wolfharness.messaging import ChatMessage + from wolfharness.orchestrator.session_pool import SessionPool + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState logger = get_logger(__name__) @@ -516,7 +516,7 @@ async def _route_message_locked( # noqa: PLR0915 session_id=session_id, parent_id=user_msg_id, model_id=request.model.model_id if request.model else "default", # ty: ignore[invalid-argument-type] - provider_id=request.model.provider_id if request.model else "agentpool", # ty: ignore[invalid-argument-type] + provider_id=request.model.provider_id if request.model else "wolfharness", # ty: ignore[invalid-argument-type] mode=agent_name, agent=agent_name, path=MessagePath(cwd=state.working_dir, root=state.working_dir), @@ -693,7 +693,7 @@ async def _route_message_locked( # noqa: PLR0915 # Build meta from parts — the EventBus event carries this so the # EventProcessor can reconstruct and broadcast the full user message # as the sole publication point. - from agentpool_server.opencode_server.event_processor import ( + from wolfharness_server.opencode_server.event_processor import ( OpenCodeUserMessageMeta, ) @@ -713,7 +713,7 @@ async def _route_message_locked( # noqa: PLR0915 meta=route_meta, ) else: - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode delivery_mode = DeliveryMode.STEER if delivery_priority == "asap" else DeliveryMode.QUEUE message_id = await session_pool.send_message( @@ -1025,7 +1025,7 @@ async def send_message_async(session_id: str, request: MessageRequest, state: St # Serialize parts for meta — the EventBus event carries this so # the EventProcessor can reconstruct and broadcast the full user # message (parts + message) as the sole publication point. - from agentpool_server.opencode_server.event_processor import ( + from wolfharness_server.opencode_server.event_processor import ( OpenCodeUserMessageMeta, ) @@ -1071,7 +1071,7 @@ async def send_message_async(session_id: str, request: MessageRequest, state: St ) sp_state.input_provider = input_provider - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode delivery_mode = ( DeliveryMode.STEER if delivery_priority == "asap" else DeliveryMode.QUEUE diff --git a/src/agentpool_server/opencode_server/routes/permission_routes.py b/src/wolfharness_server/opencode_server/routes/permission_routes.py similarity index 93% rename from src/agentpool_server/opencode_server/routes/permission_routes.py rename to src/wolfharness_server/opencode_server/routes/permission_routes.py index f853c0ebb..ae73ffc32 100644 --- a/src/agentpool_server/opencode_server/routes/permission_routes.py +++ b/src/wolfharness_server/opencode_server/routes/permission_routes.py @@ -4,9 +4,9 @@ from fastapi import APIRouter, HTTPException -from agentpool import log -from agentpool_server.opencode_server.dependencies import StateDep -from agentpool_server.opencode_server.models import ( +from wolfharness import log +from wolfharness_server.opencode_server.dependencies import StateDep +from wolfharness_server.opencode_server.models import ( PermissionAskedProperties, PermissionReplyRequest, PermissionResolvedEvent, diff --git a/src/agentpool_server/opencode_server/routes/pty_routes.py b/src/wolfharness_server/opencode_server/routes/pty_routes.py similarity index 97% rename from src/agentpool_server/opencode_server/routes/pty_routes.py rename to src/wolfharness_server/opencode_server/routes/pty_routes.py index b957c22e0..1e07d881d 100644 --- a/src/agentpool_server/opencode_server/routes/pty_routes.py +++ b/src/wolfharness_server/opencode_server/routes/pty_routes.py @@ -12,9 +12,9 @@ from fastapi import APIRouter, HTTPException, WebSocket, WebSocketDisconnect -from agentpool import log -from agentpool_server.opencode_server.dependencies import StateDep -from agentpool_server.opencode_server.models import ( +from wolfharness import log +from wolfharness_server.opencode_server.dependencies import StateDep +from wolfharness_server.opencode_server.models import ( PtyCreatedEvent, PtyCreateRequest, PtyDeletedEvent, @@ -28,7 +28,7 @@ if TYPE_CHECKING: from exxec.pty_manager import PtyManagerProtocol - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState logger = log.get_logger(__name__) router = APIRouter(prefix="/pty", tags=["pty"]) diff --git a/src/agentpool_server/opencode_server/routes/question_routes.py b/src/wolfharness_server/opencode_server/routes/question_routes.py similarity index 97% rename from src/agentpool_server/opencode_server/routes/question_routes.py rename to src/wolfharness_server/opencode_server/routes/question_routes.py index c0a025397..218a42264 100644 --- a/src/agentpool_server/opencode_server/routes/question_routes.py +++ b/src/wolfharness_server/opencode_server/routes/question_routes.py @@ -6,9 +6,9 @@ from fastapi import APIRouter, HTTPException -from agentpool_server.opencode_server.dependencies import StateDep -from agentpool_server.opencode_server.input_provider import OpenCodeInputProvider -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.dependencies import StateDep +from wolfharness_server.opencode_server.input_provider import OpenCodeInputProvider +from wolfharness_server.opencode_server.models import ( PermissionReply, PermissionResolvedEvent, QuestionRejectedEvent, diff --git a/src/agentpool_server/opencode_server/routes/routing.py b/src/wolfharness_server/opencode_server/routes/routing.py similarity index 93% rename from src/agentpool_server/opencode_server/routes/routing.py rename to src/wolfharness_server/opencode_server/routes/routing.py index 6096c28b6..ef1c6a27a 100644 --- a/src/agentpool_server/opencode_server/routes/routing.py +++ b/src/wolfharness_server/opencode_server/routes/routing.py @@ -14,11 +14,11 @@ from typing import TYPE_CHECKING, Literal -from agentpool_server.opencode_server.models.base import OpenCodeBaseModel +from wolfharness_server.opencode_server.models.base import OpenCodeBaseModel if TYPE_CHECKING: - from agentpool_server.opencode_server.models.events import GlobalEvent + from wolfharness_server.opencode_server.models.events import GlobalEvent RoutingReason = Literal[ diff --git a/src/agentpool_server/opencode_server/routes/session_routes.py b/src/wolfharness_server/opencode_server/routes/session_routes.py similarity index 98% rename from src/agentpool_server/opencode_server/routes/session_routes.py rename to src/wolfharness_server/opencode_server/routes/session_routes.py index c59f75165..72c5ee4b0 100644 --- a/src/agentpool_server/opencode_server/routes/session_routes.py +++ b/src/wolfharness_server/opencode_server/routes/session_routes.py @@ -13,20 +13,20 @@ from pydantic_ai import FileUrl from slashed import CommandContext -from agentpool.log import get_logger -from agentpool.repomap import RepoMap, find_src_files -from agentpool.utils import identifiers as identifier -from agentpool.utils.identifiers import extract_timestamp_ms -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.command_validation import validate_command -from agentpool_server.opencode_server.converters import ( +from wolfharness.log import get_logger +from wolfharness.repomap import RepoMap, find_src_files +from wolfharness.utils import identifiers as identifier +from wolfharness.utils.identifiers import extract_timestamp_ms +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.command_validation import validate_command +from wolfharness_server.opencode_server.converters import ( chat_message_to_opencode, opencode_to_session_data, session_data_to_opencode, ) -from agentpool_server.opencode_server.dependencies import StateDep -from agentpool_server.opencode_server.input_provider import OpenCodeInputProvider -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.dependencies import StateDep +from wolfharness_server.opencode_server.input_provider import OpenCodeInputProvider +from wolfharness_server.opencode_server.models import ( AssistantMessage, CommandExecutedEvent, CommandRequest, @@ -64,22 +64,22 @@ Todo, Tokens, ) -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( append_message_to_session, get_messages_for_session, get_session_status as _get_single_session_status, set_messages_for_session, set_session_status, ) -from agentpool_server.opencode_server.stream_adapter import OpenCodeStreamAdapter -from agentpool_server.opencode_server.todo_utils import build_opencode_todos -from agentpool_storage.opencode_provider import helpers -from agentpool_storage.protocols import SessionPersistence +from wolfharness_server.opencode_server.stream_adapter import OpenCodeStreamAdapter +from wolfharness_server.opencode_server.todo_utils import build_opencode_todos +from wolfharness_storage.opencode_provider import helpers +from wolfharness_storage.protocols import SessionPersistence if TYPE_CHECKING: - from agentpool.sessions.models import SessionData - from agentpool_server.opencode_server.state import ServerState + from wolfharness.sessions.models import SessionData + from wolfharness_server.opencode_server.state import ServerState logger = get_logger(__name__) @@ -456,7 +456,7 @@ async def _execute_skill_command( # TextPart parts allows the EventProcessor to reconstruct the user # message from meta.parts, displaying the raw command in the TUI. # This mirrors the normal path (message_routes.py:700-701). - from agentpool_server.opencode_server.event_processor import ( + from wolfharness_server.opencode_server.event_processor import ( OpenCodeUserMessageMeta, ) @@ -516,7 +516,7 @@ async def _execute_skill_command( # test setups without integration. Note: send_message does not # support assistant_msg_id, so the SSE-delivered ID may diverge # from the HTTP placeholder in this path (cosmetic mismatch only). - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode await session_pool.send_message( session_id=session_id, @@ -1254,7 +1254,7 @@ async def fork_session( # noqa: D417 if session_pool is not None: fork_agent = await session_pool.sessions.get_or_create_session_agent(new_session_id) fork_agent.conversation.chat_messages.clear() - from agentpool_server.opencode_server.converters import opencode_to_chat_message + from wolfharness_server.opencode_server.converters import opencode_to_chat_message for msg_with_parts in copied_messages: chat_msg = opencode_to_chat_message(msg_with_parts, session_id=new_session_id) @@ -1614,8 +1614,8 @@ async def summarize_session( # noqa: PLR0915 TextPartDelta, ) - from agentpool.agents.events import StreamCompleteEvent, UserMessageInsertedEvent - from agentpool.messaging.compaction import compact_conversation, summarizing_context + from wolfharness.agents.events import StreamCompleteEvent, UserMessageInsertedEvent + from wolfharness.messaging.compaction import compact_conversation, summarizing_context session = await get_or_load_session(state, session_id) if session is None: @@ -1957,7 +1957,7 @@ async def revert_session(session_id: str, request: RevertRequest, state: StateDe the old ``FileOpsTracker.reverted_changes`` are cleared before the new STAGE overwrites the marker. """ - from agentpool_server.opencode_server.models import MessageRemovedEvent, PartRemovedEvent + from wolfharness_server.opencode_server.models import MessageRemovedEvent, PartRemovedEvent # 3.1: Ensure session is idle before proceeding. await _ensure_session_idle(state, session_id) diff --git a/src/agentpool_server/opencode_server/routes/tui_routes.py b/src/wolfharness_server/opencode_server/routes/tui_routes.py similarity index 97% rename from src/agentpool_server/opencode_server/routes/tui_routes.py rename to src/wolfharness_server/opencode_server/routes/tui_routes.py index b1dd26b38..d31993f0b 100644 --- a/src/agentpool_server/opencode_server/routes/tui_routes.py +++ b/src/wolfharness_server/opencode_server/routes/tui_routes.py @@ -11,8 +11,8 @@ from fastapi import APIRouter from pydantic import BaseModel, Field -from agentpool_server.opencode_server.dependencies import StateDep -from agentpool_server.opencode_server.models.events import ( +from wolfharness_server.opencode_server.dependencies import StateDep +from wolfharness_server.opencode_server.models.events import ( TuiCommandExecuteEvent, TuiCommandExecuteProperties, TuiPromptAppendEvent, diff --git a/src/agentpool_server/opencode_server/server.py b/src/wolfharness_server/opencode_server/server.py similarity index 91% rename from src/agentpool_server/opencode_server/server.py rename to src/wolfharness_server/opencode_server/server.py index 293a0905c..c1b18fd29 100644 --- a/src/agentpool_server/opencode_server/server.py +++ b/src/wolfharness_server/opencode_server/server.py @@ -18,8 +18,8 @@ from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse, RedirectResponse, Response -from agentpool import log -from agentpool_server.opencode_server.routes import ( +from wolfharness import log +from wolfharness_server.opencode_server.routes import ( agent_router, app_router, config_router, @@ -33,8 +33,8 @@ session_router, tui_router, ) -from agentpool_server.opencode_server.state import ServerState -from agentpool_server.opencode_server.todo_utils import build_opencode_todos +from wolfharness_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.todo_utils import build_opencode_todos if TYPE_CHECKING: @@ -42,9 +42,9 @@ from httpx import Headers - from agentpool.agents.base_agent import BaseAgent - from agentpool.storage.manager import SessionMetadataGeneratedEvent - from agentpool.utils.todos import TodoTracker + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.storage.manager import SessionMetadataGeneratedEvent + from wolfharness.utils.todos import TodoTracker VERSION = "0.1.0" @@ -65,7 +65,7 @@ def render(self, content: Any) -> bytes: return super().render(jsonable_encoder(content, exclude_none=True)) -async def check_pypi_version(package: str = "agentpool") -> str | None: +async def check_pypi_version(package: str = "wolfharness") -> str | None: """Check PyPI for the latest version of a package. Args: @@ -131,7 +131,7 @@ def create_app(*, agent: BaseAgent[Any, Any], working_dir: str | None = None) -> # Set up SessionPool integration for session-scoped event consumption if state.pool.session_pool is not None: - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -146,8 +146,8 @@ def create_app(*, agent: BaseAgent[Any, Any], working_dir: str | None = None) -> if state.pool.skills is not None: from slashed import CommandStore - from agentpool.skills.command import SkillCommand - from agentpool_server.opencode_server.skill_bridge import OpenCodeSkillBridge + from wolfharness.skills.command import SkillCommand + from wolfharness_server.opencode_server.skill_bridge import OpenCodeSkillBridge def _build_skill_commands() -> list[SkillCommand]: """Build SkillCommand list from current pool skills.""" @@ -206,7 +206,7 @@ def _sync_command_store( # kind="skills_changed" when capabilities emit change notifications. extension_registry = state.pool.extension_registry if extension_registry is not None: - from agentpool.capabilities.extension_registry import ( + from wolfharness.capabilities.extension_registry import ( Scope, ScopeLevel, ) @@ -242,7 +242,7 @@ async def _watch_skill_changes() -> None: # when an MCP server's tool list changes (via notifications/tools/list_changed). # This watcher converts that to McpToolsChangedEvent and broadcasts it # so connected OpenCode clients can refresh their tool lists. - from agentpool_server.opencode_server.event_processor import EventProcessor + from wolfharness_server.opencode_server.event_processor import EventProcessor processor = EventProcessor() @@ -271,7 +271,7 @@ async def _watch_mcp_tool_changes() -> None: # Set up todo change callback to broadcast events async def on_todo_change(tracker: TodoTracker) -> None: """Broadcast todo updates to all active sessions.""" - from agentpool_server.opencode_server.models.events import Todo, TodoUpdatedEvent + from wolfharness_server.opencode_server.models.events import Todo, TodoUpdatedEvent # Convert tracker entries to OpenCode Todo models. todos = build_opencode_todos(tracker, Todo) @@ -285,8 +285,8 @@ async def on_todo_change(tracker: TodoTracker) -> None: async def on_title_generated(event: SessionMetadataGeneratedEvent) -> None: """Update session when metadata is generated by StorageManager.""" - from agentpool_server.opencode_server.converters import opencode_to_session_data - from agentpool_server.opencode_server.models.events import SessionUpdatedEvent + from wolfharness_server.opencode_server.converters import opencode_to_session_data + from wolfharness_server.opencode_server.models.events import SessionUpdatedEvent logger.info("on_title_generated called", session_id=event.session_id, data=event.metadata) session_id = event.session_id @@ -322,8 +322,8 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: # noqa: PLR0915 from watchfiles import Change - from agentpool.utils.file_watcher import FileWatcher, GitBranchWatcher - from agentpool_server.opencode_server.models import ( + from wolfharness.utils.file_watcher import FileWatcher, GitBranchWatcher + from wolfharness_server.opencode_server.models import ( FileWatcherUpdatedEvent, VcsBranchUpdatedEvent, ) @@ -389,15 +389,15 @@ async def on_file_change(changes: AbstractSet[tuple[Change, str]]) -> None: # --- Version update check (triggered when first client connects) --- async def check_for_updates() -> None: """Check PyPI for updates and notify via toast.""" - from agentpool import __version__ as current_version - from agentpool_server.opencode_server.models.events import TuiToastShowEvent + from wolfharness import __version__ as current_version + from wolfharness_server.opencode_server.models.events import TuiToastShowEvent - latest = await check_pypi_version("agentpool") + latest = await check_pypi_version("wolfharness") if latest and compare_versions(current_version, latest): logger.info("Update available", current_version=current_version, latest=latest) event = TuiToastShowEvent.create( title="Update Available", - message=f"agentpool {latest} is available (current: {current_version})", + message=f"wolfharness {latest} is available (current: {current_version})", variant="info", duration=10000, ) @@ -572,6 +572,15 @@ async def proxy_web_ui(request: Request, path: str) -> Response: if os.environ.get("LOGFIRE_DISABLE", "").lower() != "true": try: + from wolfharness_server.opencode_server.otel_fastapi_patch import ( + patch_otel_fastapi_route_details, + ) + + # FastAPI >= 0.136 wraps included routers in _IncludedRouter nodes + # without a `.path` attribute; OTel's _get_route_details crashes on + # these for partial matches (e.g. /session/{id}/message), turning + # valid requests into 500s. Guard before instrumenting. + patch_otel_fastapi_route_details() logfire.instrument_fastapi(app) except Exception: logger.warning("Failed to instrument FastAPI app with Logfire", exc_info=True) @@ -639,7 +648,7 @@ def run_server( if __name__ == "__main__": import asyncio - from agentpool import AgentPool, config_resources + from wolfharness import AgentPool, config_resources async def main() -> None: pool = AgentPool(config_resources.ACP_ASSISTANT) diff --git a/src/agentpool_server/opencode_server/session_pool_integration.py b/src/wolfharness_server/opencode_server/session_pool_integration.py similarity index 84% rename from src/agentpool_server/opencode_server/session_pool_integration.py rename to src/wolfharness_server/opencode_server/session_pool_integration.py index 0df508493..b3d2e1ec8 100644 --- a/src/agentpool_server/opencode_server/session_pool_integration.py +++ b/src/wolfharness_server/opencode_server/session_pool_integration.py @@ -17,17 +17,17 @@ from typing import TYPE_CHECKING, Any -from agentpool_server.mixins import ProtocolEventConsumerMixin -from agentpool_server.opencode_server.opencode_event_bridge import ( +from wolfharness_server.mixins import ProtocolEventConsumerMixin +from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) -from agentpool_server.opencode_server.opencode_message_bridge import ( +from wolfharness_server.opencode_server.opencode_message_bridge import ( OpenCodeMessageBridgeMixin, append_message_to_session, get_messages_for_session, set_messages_for_session, ) -from agentpool_server.opencode_server.opencode_session_routes import ( +from wolfharness_server.opencode_server.opencode_session_routes import ( OpenCodeSessionRoutesMixin, ensure_session, get_session_status, @@ -36,13 +36,13 @@ if TYPE_CHECKING: - from agentpool.agents.events.events import SpawnSessionStart - from agentpool.orchestrator.core import SessionPool - from agentpool_server.opencode_server.event_adapter import OpenCodeEventAdapter - from agentpool_server.opencode_server.event_processor_context import ( + from wolfharness.agents.events.events import SpawnSessionStart + from wolfharness.orchestrator.core import SessionPool + from wolfharness_server.opencode_server.event_adapter import OpenCodeEventAdapter + from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState __all__ = [ diff --git a/src/agentpool_server/opencode_server/skill_bridge.py b/src/wolfharness_server/opencode_server/skill_bridge.py similarity index 98% rename from src/agentpool_server/opencode_server/skill_bridge.py rename to src/wolfharness_server/opencode_server/skill_bridge.py index cb75800d0..7e6e4a178 100644 --- a/src/agentpool_server/opencode_server/skill_bridge.py +++ b/src/wolfharness_server/opencode_server/skill_bridge.py @@ -9,7 +9,7 @@ import logfire from slashed import Command as SlashedCommand, CommandContext -from agentpool.log import get_logger +from wolfharness.log import get_logger logger = get_logger(__name__) @@ -17,7 +17,7 @@ if TYPE_CHECKING: from collections.abc import Callable - from agentpool.skills.command import SkillCommand + from wolfharness.skills.command import SkillCommand class SkillCommandWrapper: diff --git a/src/agentpool_server/opencode_server/state.py b/src/wolfharness_server/opencode_server/state.py similarity index 89% rename from src/agentpool_server/opencode_server/state.py rename to src/wolfharness_server/opencode_server/state.py index d175a75db..5676e965a 100644 --- a/src/agentpool_server/opencode_server/state.py +++ b/src/wolfharness_server/opencode_server/state.py @@ -9,14 +9,14 @@ import time from typing import TYPE_CHECKING, Any -from agentpool import log -from agentpool.diagnostics.lsp_manager import LSPManager -from agentpool_server.opencode_server.models import SessionStatus -from agentpool_server.opencode_server.provider_auth import ( +from wolfharness import log +from wolfharness.diagnostics.lsp_manager import LSPManager +from wolfharness_server.opencode_server.models import SessionStatus +from wolfharness_server.opencode_server.provider_auth import ( ProviderAuthService, create_default_auth_service, ) -from agentpool_storage.opencode_provider import helpers +from wolfharness_storage.opencode_provider import helpers logger = log.get_logger(__name__) @@ -25,21 +25,21 @@ from fsspec.asyn import AsyncFileSystem from slashed import CommandStore - from agentpool.agents.base_agent import BaseAgent - from agentpool.delegation import AgentPool - from agentpool.models.model_configs import AnyModelConfig - from agentpool.orchestrator.core import SessionController - from agentpool.storage import StorageManager - from agentpool_server.opencode_server.input_provider import OpenCodeInputProvider - from agentpool_server.opencode_server.models import ( + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.delegation import AgentPool + from wolfharness.models.model_configs import AnyModelConfig + from wolfharness.orchestrator.core import SessionController + from wolfharness.storage import StorageManager + from wolfharness_server.opencode_server.input_provider import OpenCodeInputProvider + from wolfharness_server.opencode_server.models import ( Config, Event, MessageWithParts, QuestionInfo, Session, ) - from agentpool_server.opencode_server.models.question import QuestionToolInfo - from agentpool_server.opencode_server.routes.global_routes import GlobalEventFactory + from wolfharness_server.opencode_server.models.question import QuestionToolInfo + from wolfharness_server.opencode_server.routes.global_routes import GlobalEventFactory # Type alias for async callback OnFirstSubscriberCallback = Callable[[], Coroutine[Any, Any, None]] @@ -102,7 +102,7 @@ def parse_model_info(model_name: str | None) -> tuple[str, str]: Splits on the first colon (e.g. ``"openai:gpt-4o"`` → ``("gpt-4o", "openai")``). Falls back to ``("default", - "agentpool")`` when the model name is ``None`` or missing a + "wolfharness")`` when the model name is ``None`` or missing a provider prefix. Args: @@ -114,7 +114,7 @@ def parse_model_info(model_name: str | None) -> tuple[str, str]: if model_name and ":" in model_name: provider, model = model_name.split(":", 1) return model, provider - return "default", "agentpool" + return "default", "wolfharness" @property def model_variants(self) -> dict[str, AnyModelConfig]: @@ -134,7 +134,7 @@ def resolve_default_model_info(self) -> tuple[str, str]: name as model_id and configured provider as provider_id. 2. Parses ``self.agent.model_name`` (e.g. ``"openai:gpt-4o"``) by splitting on the first colon. - 3. Falls back to ``("default", "agentpool")``. + 3. Falls back to ``("default", "wolfharness")``. Returns: Tuple of ``(model_id, provider_id)``. @@ -144,7 +144,7 @@ def resolve_default_model_info(self) -> tuple[str, str]: if agent_model and self._pool is not None: manifest = self._pool.manifest if manifest and manifest.model_variants: - from agentpool_server.shared.model_utils import ( + from wolfharness_server.shared.model_utils import ( _extract_provider, _find_variant_name, ) @@ -191,7 +191,7 @@ def __post_init__(self) -> None: event_bus = getattr(session_pool, "event_bus", None) if event_bus is not None: - from agentpool_server.opencode_server.event_bridge import ( + from wolfharness_server.opencode_server.event_bridge import ( OpenCodeEventBridge, ) @@ -204,7 +204,7 @@ def get_event_factory(self) -> GlobalEventFactory: and computed project ID, then cached for the server's lifetime. Imports GlobalEventFactory locally to avoid circular imports. """ - from agentpool_server.opencode_server.routes.global_routes import GlobalEventFactory + from wolfharness_server.opencode_server.routes.global_routes import GlobalEventFactory if self._event_factory is None: directory = self.base_path @@ -307,7 +307,7 @@ def ensure_input_provider(self, session_id: str) -> OpenCodeInputProvider: Stores the provider on SessionState (via SessionController) when available. """ - from agentpool_server.opencode_server.input_provider import OpenCodeInputProvider + from wolfharness_server.opencode_server.input_provider import OpenCodeInputProvider input_provider = None if self.session_controller is not None: @@ -386,8 +386,8 @@ async def broadcast_event(self, event: Event) -> None: async def mark_session_idle(self, session_id: str) -> None: """Mark a session idle and broadcast the matching status events.""" - from agentpool_server.opencode_server.models import SessionIdleEvent, SessionStatusEvent - from agentpool_server.opencode_server.session_pool_integration import set_session_status + from wolfharness_server.opencode_server.models import SessionIdleEvent, SessionStatusEvent + from wolfharness_server.opencode_server.session_pool_integration import set_session_status status = SessionStatus(type="idle") await set_session_status(self, session_id, status) @@ -396,6 +396,6 @@ async def mark_session_idle(self, session_id: str) -> None: async def emit_session_turn_complete(self, session_id: str) -> None: """Broadcast the per-turn completion signal without changing busy state.""" - from agentpool_server.opencode_server.models import SessionIdleEvent + from wolfharness_server.opencode_server.models import SessionIdleEvent await self.broadcast_event(SessionIdleEvent.create(session_id)) diff --git a/src/agentpool_server/opencode_server/stream_adapter.py b/src/wolfharness_server/opencode_server/stream_adapter.py similarity index 93% rename from src/agentpool_server/opencode_server/stream_adapter.py rename to src/wolfharness_server/opencode_server/stream_adapter.py index 323b58a53..96c71d574 100644 --- a/src/agentpool_server/opencode_server/stream_adapter.py +++ b/src/wolfharness_server/opencode_server/stream_adapter.py @@ -13,22 +13,22 @@ from pydantic_ai import RequestUsage -from agentpool.log import get_logger -from agentpool.tasks.exceptions import RunAbortedError -from agentpool.utils import identifiers as identifier -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.event_processor import EventProcessor -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.log import get_logger +from wolfharness.tasks.exceptions import RunAbortedError +from wolfharness.utils import identifiers as identifier +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.event_processor import EventProcessor +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessageWithParts, PartUpdatedEvent, SessionErrorEvent, TokenCache, Tokens, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( StepFinishPart, TextPart, TimeStartEndOptional, @@ -38,10 +38,10 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator, Callable, Iterator - from agentpool.agents.events.events import RichAgentStreamEvent - from agentpool_server.opencode_server.models import MessageWithParts - from agentpool_server.opencode_server.models.events import Event - from agentpool_server.opencode_server.state import ServerState + from wolfharness.agents.events.events import RichAgentStreamEvent + from wolfharness_server.opencode_server.models import MessageWithParts + from wolfharness_server.opencode_server.models.events import Event + from wolfharness_server.opencode_server.state import ServerState logger = get_logger(__name__) diff --git a/src/agentpool_server/opencode_server/todo_utils.py b/src/wolfharness_server/opencode_server/todo_utils.py similarity index 91% rename from src/agentpool_server/opencode_server/todo_utils.py rename to src/wolfharness_server/opencode_server/todo_utils.py index 584136a25..6d04a9381 100644 --- a/src/agentpool_server/opencode_server/todo_utils.py +++ b/src/wolfharness_server/opencode_server/todo_utils.py @@ -6,7 +6,7 @@ if TYPE_CHECKING: - from agentpool.utils.todos import TodoPriority, TodoStatus, TodoTracker + from wolfharness.utils.todos import TodoPriority, TodoStatus, TodoTracker class TodoModelFactory[TodoModelT](Protocol): diff --git a/src/agentpool_storage/py.typed b/src/wolfharness_server/py.typed similarity index 100% rename from src/agentpool_storage/py.typed rename to src/wolfharness_server/py.typed diff --git a/src/agentpool_server/shared/__init__.py b/src/wolfharness_server/shared/__init__.py similarity index 87% rename from src/agentpool_server/shared/__init__.py rename to src/wolfharness_server/shared/__init__.py index 0cd98ad33..dd24bf0cf 100644 --- a/src/agentpool_server/shared/__init__.py +++ b/src/wolfharness_server/shared/__init__.py @@ -2,7 +2,7 @@ from __future__ import annotations -from agentpool_server.shared.constants import ( +from wolfharness_server.shared.constants import ( DEFAULT_MODEL_CONTEXT_LIMIT, DEFAULT_MODEL_INPUT_COST, DEFAULT_MODEL_OUTPUT_COST, diff --git a/src/agentpool_server/shared/constants.py b/src/wolfharness_server/shared/constants.py similarity index 100% rename from src/agentpool_server/shared/constants.py rename to src/wolfharness_server/shared/constants.py diff --git a/src/agentpool_server/shared/model_utils.py b/src/wolfharness_server/shared/model_utils.py similarity index 95% rename from src/agentpool_server/shared/model_utils.py rename to src/wolfharness_server/shared/model_utils.py index 380db4c61..8a661000b 100644 --- a/src/agentpool_server/shared/model_utils.py +++ b/src/wolfharness_server/shared/model_utils.py @@ -9,8 +9,8 @@ from typing import TYPE_CHECKING, Any -from agentpool.log import get_logger -from agentpool.models.model_configs import ( +from wolfharness.log import get_logger +from wolfharness.models.model_configs import ( AnthropicModelConfig, AnyModelConfig, FallbackModelConfig, @@ -18,7 +18,7 @@ OpenAIModelConfig, StringModelConfig, ) -from agentpool_server.shared.constants import ( +from wolfharness_server.shared.constants import ( DEFAULT_MODEL_CONTEXT_LIMIT, DEFAULT_MODEL_INPUT_COST, DEFAULT_MODEL_OUTPUT_COST, @@ -30,9 +30,9 @@ from tokonomics.model_discovery.model_info import ModelInfo as TokoModelInfo from acp.schema import SessionModelState - from agentpool.agents.base_agent import BaseAgent - from agentpool_server.acp_server.provider_router import ProviderRouter - from agentpool_server.opencode_server.models import Provider + from wolfharness.agents.base_agent import BaseAgent + from wolfharness_server.acp_server.provider_router import ProviderRouter + from wolfharness_server.opencode_server.models import Provider logger = get_logger(__name__) @@ -169,7 +169,7 @@ def resolve_model_info_from_response( variant name, and returns the variant name + configured provider. When no variant matches (or inputs are ``None``), falls back to raw names - with ``"unknown"`` / ``"agentpool"`` defaults for ``None`` values. + with ``"unknown"`` / ``"wolfharness"`` defaults for ``None`` values. Args: model_name: Raw model name from ``result.response.model_name`` @@ -188,7 +188,7 @@ def resolve_model_info_from_response( config = model_variants[variant_name] return variant_name, _extract_provider(config) logger.debug("No variant match for %s", full_id) - return model_name or "unknown", provider_name or "agentpool" + return model_name or "unknown", provider_name or "wolfharness" def _build_providers_from_tokonomics(toko_models: list[TokoModelInfo]) -> list[Provider]: @@ -203,7 +203,7 @@ def _build_providers_from_tokonomics(toko_models: list[TokoModelInfo]) -> list[P Returns: List of Provider objects with models converted using Model.from_tokonomics(). """ - from agentpool_server.opencode_server.models import Model, Provider + from wolfharness_server.opencode_server.models import Model, Provider providers_by_name: dict[str, Provider] = {} @@ -246,7 +246,7 @@ def _apply_configured_variants( This function modifies the providers list in place. New providers are created if a configured variant references a non-existent provider. """ - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( Model, ModelCost, ModelLimit, diff --git a/src/wolfharness_storage/__init__.py b/src/wolfharness_storage/__init__.py new file mode 100644 index 000000000..9054e0788 --- /dev/null +++ b/src/wolfharness_storage/__init__.py @@ -0,0 +1,37 @@ +"""Storage provider package.""" + +from wolfharness_storage.adapter import StorageProviderAdapter +from wolfharness_storage.base import StorageProvider +from wolfharness_storage.project_store import ( + ProjectStore, + detect_project_root, + discover_config_path, + generate_project_id, + resolve_config, +) +from wolfharness_storage.protocols import ( + CheckpointStore, + CommandLog, + MessagePersistence, + ProjectStoreProtocol, + SessionMetadata, + SessionPersistence, + StatsAggregator, +) + +__all__ = [ + "CheckpointStore", + "CommandLog", + "MessagePersistence", + "ProjectStore", + "ProjectStoreProtocol", + "SessionMetadata", + "SessionPersistence", + "StatsAggregator", + "StorageProvider", + "StorageProviderAdapter", + "detect_project_root", + "discover_config_path", + "generate_project_id", + "resolve_config", +] diff --git a/src/agentpool_storage/acp_provider/__init__.py b/src/wolfharness_storage/acp_provider/__init__.py similarity index 59% rename from src/agentpool_storage/acp_provider/__init__.py rename to src/wolfharness_storage/acp_provider/__init__.py index 14c5460b8..2d2651d63 100644 --- a/src/agentpool_storage/acp_provider/__init__.py +++ b/src/wolfharness_storage/acp_provider/__init__.py @@ -1,5 +1,5 @@ """ACP storage provider - read-only session access via ACP protocol.""" -from agentpool_storage.acp_provider.provider import ACPStorageProvider +from wolfharness_storage.acp_provider.provider import ACPStorageProvider __all__ = ["ACPStorageProvider"] diff --git a/src/agentpool_storage/acp_provider/provider.py b/src/wolfharness_storage/acp_provider/provider.py similarity index 91% rename from src/agentpool_storage/acp_provider/provider.py rename to src/wolfharness_storage/acp_provider/provider.py index 981c5ea14..e3b2888ba 100644 --- a/src/agentpool_storage/acp_provider/provider.py +++ b/src/wolfharness_storage/acp_provider/provider.py @@ -4,18 +4,18 @@ from typing import TYPE_CHECKING -from agentpool.log import get_logger -from agentpool.utils.time_utils import get_now, parse_iso_timestamp -from agentpool_config.storage import ACPStorageConfig -from agentpool_storage.base import StorageProvider -from agentpool_storage.models import ConversationData +from wolfharness.log import get_logger +from wolfharness.utils.time_utils import get_now, parse_iso_timestamp +from wolfharness_config.storage import ACPStorageConfig +from wolfharness_storage.base import StorageProvider +from wolfharness_storage.models import ConversationData if TYPE_CHECKING: from datetime import datetime from acp.client.connection import ClientSideConnection - from agentpool_storage.models import QueryFilters + from wolfharness_storage.models import QueryFilters logger = get_logger(__name__) diff --git a/src/agentpool_storage/adapter.py b/src/wolfharness_storage/adapter.py similarity index 95% rename from src/agentpool_storage/adapter.py rename to src/wolfharness_storage/adapter.py index c6e015c9c..1ee4ebd6e 100644 --- a/src/agentpool_storage/adapter.py +++ b/src/wolfharness_storage/adapter.py @@ -2,7 +2,7 @@ ``StorageProviderAdapter`` delegates every method to the wrapped ``StorageProvider`` instance, making it pass ``isinstance`` checks for all -seven Protocols defined in ``agentpool_storage.protocols``. +seven Protocols defined in ``wolfharness_storage.protocols``. This enables gradual migration: consumers depend on the narrow Protocol they need, while the underlying storage remains a single ``StorageProvider`` @@ -18,12 +18,12 @@ from collections.abc import Sequence from datetime import datetime - from agentpool.common_types import JsonValue - from agentpool.messaging import ChatMessage, TokenCost - from agentpool.sessions.models import ProjectData, SessionData - from agentpool_config.session import SessionQuery - from agentpool_storage.base import StorageProvider - from agentpool_storage.models import ConversationData, QueryFilters, StatsFilters + from wolfharness.common_types import JsonValue + from wolfharness.messaging import ChatMessage, TokenCost + from wolfharness.sessions.models import ProjectData, SessionData + from wolfharness_config.session import SessionQuery + from wolfharness_storage.base import StorageProvider + from wolfharness_storage.models import ConversationData, QueryFilters, StatsFilters class StorageProviderAdapter: diff --git a/src/agentpool_storage/base.py b/src/wolfharness_storage/base.py similarity index 98% rename from src/agentpool_storage/base.py rename to src/wolfharness_storage/base.py index 4eaacd217..904617dba 100644 --- a/src/agentpool_storage/base.py +++ b/src/wolfharness_storage/base.py @@ -12,12 +12,12 @@ from datetime import datetime from types import TracebackType - from agentpool.common_types import JsonValue - from agentpool.messaging import ChatMessage, TokenCost - from agentpool.sessions.models import ProjectData, SessionData - from agentpool_config.session import SessionQuery - from agentpool_config.storage import BaseStorageProviderConfig - from agentpool_storage.models import ConversationData, QueryFilters, StatsFilters + from wolfharness.common_types import JsonValue + from wolfharness.messaging import ChatMessage, TokenCost + from wolfharness.sessions.models import ProjectData, SessionData + from wolfharness_config.session import SessionQuery + from wolfharness_config.storage import BaseStorageProviderConfig + from wolfharness_storage.models import ConversationData, QueryFilters, StatsFilters class StoredMessage: diff --git a/src/wolfharness_storage/file_provider/__init__.py b/src/wolfharness_storage/file_provider/__init__.py new file mode 100644 index 000000000..dd8af7754 --- /dev/null +++ b/src/wolfharness_storage/file_provider/__init__.py @@ -0,0 +1,7 @@ +"""File provider for wolfharness.""" + +from __future__ import annotations + +from wolfharness_storage.file_provider.provider import FileProvider + +__all__ = ["FileProvider"] diff --git a/src/agentpool_storage/file_provider/provider.py b/src/wolfharness_storage/file_provider/provider.py similarity index 96% rename from src/agentpool_storage/file_provider/provider.py rename to src/wolfharness_storage/file_provider/provider.py index 59a296532..267c4ad92 100644 --- a/src/agentpool_storage/file_provider/provider.py +++ b/src/wolfharness_storage/file_provider/provider.py @@ -9,14 +9,14 @@ from pydantic_ai.usage import RunUsage from upathtools import to_upath -from agentpool.common_types import JsonValue, MessageRole -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage, TokenCost -from agentpool.storage import deserialize_messages -from agentpool.utils.time_utils import get_now, parse_iso_timestamp -from agentpool_config.storage import FileStorageConfig -from agentpool_storage.base import StorageProvider -from agentpool_storage.models import TokenUsage +from wolfharness.common_types import JsonValue, MessageRole +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage, TokenCost +from wolfharness.storage import deserialize_messages +from wolfharness.utils.time_utils import get_now, parse_iso_timestamp +from wolfharness_config.storage import FileStorageConfig +from wolfharness_storage.base import StorageProvider +from wolfharness_storage.models import TokenUsage if TYPE_CHECKING: @@ -24,8 +24,8 @@ from yamling import FormatType - from agentpool.sessions.models import ProjectData - from agentpool_config.session import SessionQuery + from wolfharness.sessions.models import ProjectData + from wolfharness_config.session import SessionQuery logger = get_logger(__name__) @@ -196,7 +196,7 @@ async def filter_messages(self, query: SessionQuery) -> list[ChatMessage[str]]: async def log_message(self, *, message: ChatMessage[Any]) -> None: """Log a new message.""" - from agentpool.storage.serialization import serialize_messages + from wolfharness.storage.serialization import serialize_messages cost_info = message.cost_info self._data["messages"].append({ @@ -526,7 +526,7 @@ async def delete_session_messages(self, session_id: str) -> int: def _to_project_data(self, data: ProjectDataDict) -> ProjectData: """Convert dict to ProjectData.""" - from agentpool.sessions.models import ProjectData + from wolfharness.sessions.models import ProjectData return ProjectData( project_id=data["project_id"], diff --git a/src/agentpool_storage/formatters.py b/src/wolfharness_storage/formatters.py similarity index 98% rename from src/agentpool_storage/formatters.py rename to src/wolfharness_storage/formatters.py index c4d3c91f8..8bcf12d9d 100644 --- a/src/agentpool_storage/formatters.py +++ b/src/wolfharness_storage/formatters.py @@ -9,7 +9,7 @@ if TYPE_CHECKING: - from agentpool_storage.models import ConversationData + from wolfharness_storage.models import ConversationData def is_conversation_data(data: Any) -> TypeGuard[ConversationData]: diff --git a/src/wolfharness_storage/memory_provider/__init__.py b/src/wolfharness_storage/memory_provider/__init__.py new file mode 100644 index 000000000..1d303687a --- /dev/null +++ b/src/wolfharness_storage/memory_provider/__init__.py @@ -0,0 +1,7 @@ +"""Memory provider for wolfharness.""" + +from __future__ import annotations + +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider + +__all__ = ["MemoryStorageProvider"] diff --git a/src/agentpool_storage/memory_provider/provider.py b/src/wolfharness_storage/memory_provider/provider.py similarity index 97% rename from src/agentpool_storage/memory_provider/provider.py rename to src/wolfharness_storage/memory_provider/provider.py index 0268a98c0..7d8364078 100644 --- a/src/agentpool_storage/memory_provider/provider.py +++ b/src/wolfharness_storage/memory_provider/provider.py @@ -4,21 +4,21 @@ from typing import TYPE_CHECKING, Any -from agentpool.utils.time_utils import get_now, parse_iso_timestamp -from agentpool_config.storage import MemoryStorageConfig -from agentpool_storage.base import StorageProvider -from agentpool_storage.models import ConversationData +from wolfharness.utils.time_utils import get_now, parse_iso_timestamp +from wolfharness_config.storage import MemoryStorageConfig +from wolfharness_storage.base import StorageProvider +from wolfharness_storage.models import ConversationData if TYPE_CHECKING: from collections.abc import Sequence from datetime import datetime - from agentpool.common_types import JsonValue - from agentpool.messaging import ChatMessage - from agentpool.sessions.models import ProjectData, SessionData - from agentpool_config.session import SessionQuery - from agentpool_storage.models import QueryFilters, StatsFilters, TokenUsage + from wolfharness.common_types import JsonValue + from wolfharness.messaging import ChatMessage + from wolfharness.sessions.models import ProjectData, SessionData + from wolfharness_config.session import SessionQuery + from wolfharness_storage.models import QueryFilters, StatsFilters, TokenUsage class MemoryStorageProvider(StorageProvider): diff --git a/src/agentpool_storage/models.py b/src/wolfharness_storage/models.py similarity index 97% rename from src/agentpool_storage/models.py rename to src/wolfharness_storage/models.py index 0488507d5..a3f1869b5 100644 --- a/src/agentpool_storage/models.py +++ b/src/wolfharness_storage/models.py @@ -9,7 +9,7 @@ if TYPE_CHECKING: from datetime import datetime - from agentpool.messaging import ChatMessage + from wolfharness.messaging import ChatMessage GroupBy = Literal["agent", "model", "hour", "day"] diff --git a/src/agentpool_storage/opencode_provider/ARCHITECTURE.md b/src/wolfharness_storage/opencode_provider/ARCHITECTURE.md similarity index 98% rename from src/agentpool_storage/opencode_provider/ARCHITECTURE.md rename to src/wolfharness_storage/opencode_provider/ARCHITECTURE.md index 43fe4177b..1cbb5a7ae 100644 --- a/src/agentpool_storage/opencode_provider/ARCHITECTURE.md +++ b/src/wolfharness_storage/opencode_provider/ARCHITECTURE.md @@ -53,7 +53,7 @@ The random portion appears to be a timestamp-based identifier. Example: ```bash -echo -n "/home/phil65/dev/oss/agentpool" | sha1sum +echo -n "/home/phil65/dev/oss/wolfharness" | sha1sum # → 486ce75a8fddd4372018ab816ac62d8004dc52fd ``` @@ -74,7 +74,7 @@ echo -n "/home/phil65/dev/oss/agentpool" | sha1sum "id": "ses_4afbda00cffeVl5YERm4op7JEG", "version": "1.0.193", "projectID": "486ce75a8fddd4372018ab816ac62d8004dc52fd", - "directory": "/home/phil65/dev/oss/agentpool", + "directory": "/home/phil65/dev/oss/wolfharness", "title": "Claude capabilities overview", "time": { "created": 1766578085876, @@ -237,7 +237,7 @@ for msg_file in messages: - Retrieve messages in chronological order 4. **Format Conversion** - - OpenCode format → `ChatMessage` (for agentpool) + - OpenCode format → `ChatMessage` (for wolfharness) - `ChatMessage` → OpenCode format (for persistence) ### Challenges diff --git a/src/agentpool_storage/opencode_provider/__init__.py b/src/wolfharness_storage/opencode_provider/__init__.py similarity index 85% rename from src/agentpool_storage/opencode_provider/__init__.py rename to src/wolfharness_storage/opencode_provider/__init__.py index 162053da9..057f6d830 100644 --- a/src/agentpool_storage/opencode_provider/__init__.py +++ b/src/wolfharness_storage/opencode_provider/__init__.py @@ -13,7 +13,7 @@ from __future__ import annotations -from agentpool_storage.opencode_provider.provider import OpenCodeStorageProvider +from wolfharness_storage.opencode_provider.provider import OpenCodeStorageProvider __all__ = [ "OpenCodeStorageProvider", diff --git a/src/agentpool_storage/opencode_provider/helpers.py b/src/wolfharness_storage/opencode_provider/helpers.py similarity index 96% rename from src/agentpool_storage/opencode_provider/helpers.py rename to src/wolfharness_storage/opencode_provider/helpers.py index 0e18dcc8e..3e5ef04ee 100644 --- a/src/agentpool_storage/opencode_provider/helpers.py +++ b/src/wolfharness_storage/opencode_provider/helpers.py @@ -28,17 +28,17 @@ UserPromptPart, ) -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage, TokenCost -from agentpool.utils import identifiers as identifier -from agentpool.utils.pydantic_ai_helpers import to_user_content -from agentpool.utils.time_utils import ms_to_datetime -from agentpool_server.opencode_server.models.message import ( +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage, TokenCost +from wolfharness.utils import identifiers as identifier +from wolfharness.utils.pydantic_ai_helpers import to_user_content +from wolfharness.utils.time_utils import ms_to_datetime +from wolfharness_server.opencode_server.models.message import ( AssistantMessage, MessageInfo, UserMessage, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( FilePart, Part, ReasoningPart, @@ -46,7 +46,7 @@ ToolPart, ToolStateCompleted, ) -from agentpool_server.opencode_server.models.session import Session +from wolfharness_server.opencode_server.models.session import Session if TYPE_CHECKING: @@ -75,7 +75,7 @@ def compute_project_id(directory: str) -> str: !!! note "Dual ID scheme" This is DIFFERENT from ``generate_project_id()`` in - ``agentpool_storage.project_store``, which hashes the canonical worktree + ``wolfharness_storage.project_store``, which hashes the canonical worktree path for AgentPool-internal ``ProjectData`` identification. The two IDs serve distinct purposes and are not interchangeable: - ``compute_project_id`` — git root commit SHA1 (OpenCode session layout) diff --git a/src/agentpool_storage/opencode_provider/provider.py b/src/wolfharness_storage/opencode_provider/provider.py similarity index 97% rename from src/agentpool_storage/opencode_provider/provider.py rename to src/wolfharness_storage/opencode_provider/provider.py index 11d44687c..cbc048e0e 100644 --- a/src/agentpool_storage/opencode_provider/provider.py +++ b/src/wolfharness_storage/opencode_provider/provider.py @@ -32,13 +32,18 @@ UserPromptPart, ) -from agentpool.log import get_logger -from agentpool.sessions.models import ProjectData, SessionData -from agentpool.utils.pydantic_ai_helpers import safe_args_as_dict -from agentpool.utils.thread_helpers import run_in_thread -from agentpool.utils.time_utils import datetime_to_ms, get_now, ms_to_datetime, parse_iso_timestamp -from agentpool_config.storage import OpenCodeStorageConfig -from agentpool_server.opencode_server.models import ( +from wolfharness.log import get_logger +from wolfharness.sessions.models import ProjectData, SessionData +from wolfharness.utils.pydantic_ai_helpers import safe_args_as_dict +from wolfharness.utils.thread_helpers import run_in_thread +from wolfharness.utils.time_utils import ( + datetime_to_ms, + get_now, + ms_to_datetime, + parse_iso_timestamp, +) +from wolfharness_config.storage import OpenCodeStorageConfig +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessageInfo as OpenCodeMessage, Part as OpenCodePart, @@ -46,15 +51,15 @@ SessionSummary, TimeCreatedUpdated, ) -from agentpool_storage.base import StorageProvider -from agentpool_storage.models import ConversationData as ConvData, TokenUsage -from agentpool_storage.opencode_provider import helpers +from wolfharness_storage.base import StorageProvider +from wolfharness_storage.models import ConversationData as ConvData, TokenUsage +from wolfharness_storage.opencode_provider import helpers if TYPE_CHECKING: - from agentpool.messaging import ChatMessage, TokenCost - from agentpool_config.session import SessionQuery - from agentpool_storage.models import QueryFilters, StatsFilters + from wolfharness.messaging import ChatMessage, TokenCost + from wolfharness_config.session import SessionQuery + from wolfharness_storage.models import QueryFilters, StatsFilters logger = get_logger(__name__) @@ -306,7 +311,7 @@ async def _write_message( # noqa: PLR0915 finish_reason: Any | None = None, ) -> None: """Write a message in OpenCode format.""" - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( AssistantMessage, MessagePath, MessageTime, @@ -338,7 +343,7 @@ async def _write_message( # noqa: PLR0915 session_id=session_id, parent_id=parent_id or "", model_id=model or "", - provider_id=model.split(":")[0] if model else "agentpool", + provider_id=model.split(":")[0] if model else "wolfharness", path=MessagePath(cwd=str(Path.cwd()), root=str(Path.cwd())), time=MessageTime(created=now_ms), tokens=Tokens( @@ -1301,8 +1306,8 @@ async def get_filtered_conversations( compact: Only show first/last message of each conversation include_tokens: Include token usage statistics """ - from agentpool.utils.parse_time import parse_time_period - from agentpool.utils.time_utils import get_now + from wolfharness.utils.parse_time import parse_time_period + from wolfharness.utils.time_utils import get_now cutoff: datetime | None = None if period: @@ -1396,7 +1401,7 @@ async def list_session_ids( import asyncio import datetime as dt - from agentpool_storage.models import QueryFilters, StatsFilters + from wolfharness_storage.models import QueryFilters, StatsFilters async def main() -> None: provider = OpenCodeStorageProvider() diff --git a/src/agentpool_storage/project_store.py b/src/wolfharness_storage/project_store.py similarity index 93% rename from src/agentpool_storage/project_store.py rename to src/wolfharness_storage/project_store.py index e606b1178..c080e2af5 100644 --- a/src/agentpool_storage/project_store.py +++ b/src/wolfharness_storage/project_store.py @@ -6,17 +6,17 @@ from pathlib import Path from typing import TYPE_CHECKING -from agentpool.log import get_logger -from agentpool.sessions.models import ProjectData -from agentpool.utils.time_utils import get_now +from wolfharness.log import get_logger +from wolfharness.sessions.models import ProjectData +from wolfharness.utils.time_utils import get_now if TYPE_CHECKING: - from agentpool.storage.manager import StorageManager + from wolfharness.storage.manager import StorageManager logger = get_logger(__name__) -# Config file names to search for in .agentpool/ directory +# Config file names to search for in .wolfharness/ directory CONFIG_FILENAMES = ["config.yml", "config.yaml", "config.json", "config.toml"] @@ -25,7 +25,7 @@ def resolve_config(project: ProjectData | None = None, cwd: str | None = None) - Resolution order: 1. Project's explicit config_path (if set) - 2. .agentpool/config.yml in project worktree (auto-discovered) + 2. .wolfharness/config.yml in project worktree (auto-discovered) 3. Global default from ConfigStore (CLI fallback) 4. None (use built-in defaults) @@ -36,7 +36,7 @@ def resolve_config(project: ProjectData | None = None, cwd: str | None = None) - Returns: Path to config file, or None if no config found """ - from agentpool_cli.store import ConfigStore + from wolfharness_cli.store import ConfigStore # 1. Project-specific explicit config if project and project.config_path: @@ -96,7 +96,7 @@ def generate_project_id(worktree: str) -> str: !!! note "Dual ID scheme" This is DIFFERENT from ``compute_project_id()`` in - ``agentpool_storage.opencode_provider.helpers``, which derives the ID + ``wolfharness_storage.opencode_provider.helpers``, which derives the ID from the git root commit SHA1 for OpenCode session directory layout. The two IDs serve distinct purposes and are not interchangeable: - ``generate_project_id`` — path SHA1 (AgentPool project registry) @@ -113,7 +113,7 @@ def generate_project_id(worktree: str) -> str: def discover_config_path(worktree: str) -> str | None: - """Search for config file in .agentpool/ directory. + """Search for config file in .wolfharness/ directory. Args: worktree: Project root path @@ -121,7 +121,7 @@ def discover_config_path(worktree: str) -> str | None: Returns: Path to config file if found, None otherwise """ - config_dir = Path(worktree) / ".agentpool" + config_dir = Path(worktree) / ".wolfharness" if not config_dir.is_dir(): return None @@ -306,7 +306,7 @@ async def delete(self, project_id: str) -> bool: async def refresh_config(self, project_id: str) -> ProjectData | None: """Re-discover config file for a project. - Useful after user adds .agentpool/config.yml to their project. + Useful after user adds .wolfharness/config.yml to their project. Args: project_id: Project identifier diff --git a/src/agentpool_storage/protocols.py b/src/wolfharness_storage/protocols.py similarity index 96% rename from src/agentpool_storage/protocols.py rename to src/wolfharness_storage/protocols.py index 11f978de2..48b6d6aac 100644 --- a/src/agentpool_storage/protocols.py +++ b/src/wolfharness_storage/protocols.py @@ -26,11 +26,11 @@ from collections.abc import Sequence from datetime import datetime - from agentpool.common_types import JsonValue - from agentpool.messaging import ChatMessage, TokenCost - from agentpool.sessions.models import ProjectData, SessionData - from agentpool_config.session import SessionQuery - from agentpool_storage.models import ConversationData, QueryFilters, StatsFilters + from wolfharness.common_types import JsonValue + from wolfharness.messaging import ChatMessage, TokenCost + from wolfharness.sessions.models import ProjectData, SessionData + from wolfharness_config.session import SessionQuery + from wolfharness_storage.models import ConversationData, QueryFilters, StatsFilters # --------------------------------------------------------------------------- @@ -255,7 +255,7 @@ class ProjectStoreProtocol(Protocol): """Protocol for project CRUD operations. Named ``ProjectStoreProtocol`` to avoid clash with the existing - ``ProjectStore`` class in ``agentpool_storage.project_store``. + ``ProjectStore`` class in ``wolfharness_storage.project_store``. """ async def save_project(self, project: ProjectData) -> None: diff --git a/src/agentpool_toolsets/py.typed b/src/wolfharness_storage/py.typed similarity index 100% rename from src/agentpool_toolsets/py.typed rename to src/wolfharness_storage/py.typed diff --git a/src/agentpool_storage/sql_provider/__init__.py b/src/wolfharness_storage/sql_provider/__init__.py similarity index 71% rename from src/agentpool_storage/sql_provider/__init__.py rename to src/wolfharness_storage/sql_provider/__init__.py index 1f98a936f..e70f082ec 100644 --- a/src/agentpool_storage/sql_provider/__init__.py +++ b/src/wolfharness_storage/sql_provider/__init__.py @@ -2,8 +2,8 @@ from __future__ import annotations -from agentpool_storage.sql_provider.sql_provider import SQLModelProvider -from agentpool_storage.sql_provider.models import ( +from wolfharness_storage.sql_provider.sql_provider import SQLModelProvider +from wolfharness_storage.sql_provider.models import ( CommandHistory, Conversation, ConversationLog, diff --git a/src/agentpool_storage/sql_provider/cli.py b/src/wolfharness_storage/sql_provider/cli.py similarity index 94% rename from src/agentpool_storage/sql_provider/cli.py rename to src/wolfharness_storage/sql_provider/cli.py index 3c0d1407b..5533b6cff 100755 --- a/src/agentpool_storage/sql_provider/cli.py +++ b/src/wolfharness_storage/sql_provider/cli.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Database migration management script for agentpool. +"""Database migration management script for wolfharness. This script provides easy commands for managing database migrations using Alembic. """ @@ -17,8 +17,8 @@ app = typer.Typer( - name="agentpool-db", - help="Database migration management for agentpool", + name="wolfharness-db", + help="Database migration management for wolfharness", rich_markup_mode="rich", ) console = Console() @@ -39,7 +39,7 @@ def run_command(cmd: list[str], cwd: Path | None = None) -> int: def get_project_root() -> Path: """Get the project root directory.""" # Start from this file and go up to find the project root - # This file is in src/agentpool_storage/sql_provider/cli.py + # This file is in src/wolfharness_storage/sql_provider/cli.py return Path(__file__).parent.parent.parent.parent diff --git a/src/agentpool_storage/sql_provider/models.py b/src/wolfharness_storage/sql_provider/models.py similarity index 98% rename from src/agentpool_storage/sql_provider/models.py rename to src/wolfharness_storage/sql_provider/models.py index 54972ec0b..1cf021025 100644 --- a/src/agentpool_storage/sql_provider/models.py +++ b/src/wolfharness_storage/sql_provider/models.py @@ -1,4 +1,4 @@ -"""Database models for agentpool storage.""" +"""Database models for wolfharness storage.""" from __future__ import annotations @@ -14,8 +14,8 @@ from sqlmodel import JSON, Field, SQLModel from sqlmodel.main import SQLModelConfig # type: ignore[attr-defined] -from agentpool.common_types import JsonValue -from agentpool.utils.time_utils import get_now +from wolfharness.common_types import JsonValue +from wolfharness.utils.time_utils import get_now if TYPE_CHECKING: diff --git a/src/agentpool_storage/sql_provider/queries.py b/src/wolfharness_storage/sql_provider/queries.py similarity index 100% rename from src/agentpool_storage/sql_provider/queries.py rename to src/wolfharness_storage/sql_provider/queries.py diff --git a/src/agentpool_storage/sql_provider/sql_messages.py b/src/wolfharness_storage/sql_provider/sql_messages.py similarity index 96% rename from src/agentpool_storage/sql_provider/sql_messages.py rename to src/wolfharness_storage/sql_provider/sql_messages.py index 0f0b20161..edc00522b 100644 --- a/src/agentpool_storage/sql_provider/sql_messages.py +++ b/src/wolfharness_storage/sql_provider/sql_messages.py @@ -11,10 +11,10 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlmodel import desc, select -from agentpool.log import get_logger -from agentpool.utils.time_utils import get_now -from agentpool_storage.sql_provider.models import Message -from agentpool_storage.sql_provider.utils import ( +from wolfharness.log import get_logger +from wolfharness.utils.time_utils import get_now +from wolfharness_storage.sql_provider.models import Message +from wolfharness_storage.sql_provider.utils import ( build_message_query, parse_model_info, to_chat_message, @@ -24,8 +24,8 @@ if TYPE_CHECKING: from sqlalchemy.ext.asyncio import AsyncEngine - from agentpool.messaging import ChatMessage - from agentpool_config.session import SessionQuery + from wolfharness.messaging import ChatMessage + from wolfharness_config.session import SessionQuery logger = get_logger(__name__) @@ -69,7 +69,7 @@ async def log_message(self, *, message: ChatMessage[Any]) -> None: message ID again with final content, tool results, token usage, and finish metadata. """ - from agentpool.storage.serialization import serialize_messages + from wolfharness.storage.serialization import serialize_messages provider, model_name = parse_model_info(message.model_name) cost_info = message.cost_info @@ -220,7 +220,7 @@ async def fork_conversation( Creates a new conversation record. The fork point message_id is returned so callers can set it as parent_id for new messages. """ - from agentpool_storage.sql_provider.models import Conversation + from wolfharness_storage.sql_provider.models import Conversation async with AsyncSession(self.engine) as session: # Get source conversation diff --git a/src/agentpool_storage/sql_provider/sql_projects.py b/src/wolfharness_storage/sql_provider/sql_projects.py similarity index 94% rename from src/agentpool_storage/sql_provider/sql_projects.py rename to src/wolfharness_storage/sql_provider/sql_projects.py index 86ba9c90b..a8d6059bd 100644 --- a/src/agentpool_storage/sql_provider/sql_projects.py +++ b/src/wolfharness_storage/sql_provider/sql_projects.py @@ -11,15 +11,15 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlmodel import desc, select -from agentpool.log import get_logger -from agentpool.utils.time_utils import get_now -from agentpool_storage.sql_provider.models import Project +from wolfharness.log import get_logger +from wolfharness.utils.time_utils import get_now +from wolfharness_storage.sql_provider.models import Project if TYPE_CHECKING: from sqlalchemy.ext.asyncio import AsyncEngine - from agentpool.sessions.models import ProjectData + from wolfharness.sessions.models import ProjectData logger = get_logger(__name__) @@ -36,7 +36,7 @@ class SQLProjectsMixin: def _to_project_data(self, row: Project) -> ProjectData: """Convert database model to ProjectData.""" - from agentpool.sessions.models import ProjectData + from wolfharness.sessions.models import ProjectData return ProjectData( project_id=row.project_id, diff --git a/src/agentpool_storage/sql_provider/sql_provider.py b/src/wolfharness_storage/sql_provider/sql_provider.py similarity index 87% rename from src/agentpool_storage/sql_provider/sql_provider.py rename to src/wolfharness_storage/sql_provider/sql_provider.py index a364c709a..69c983678 100644 --- a/src/agentpool_storage/sql_provider/sql_provider.py +++ b/src/wolfharness_storage/sql_provider/sql_provider.py @@ -7,12 +7,12 @@ from sqlmodel import SQLModel -from agentpool.log import get_logger -from agentpool_config.storage import SQLStorageConfig -from agentpool_storage.base import StorageProvider -from agentpool_storage.sql_provider.sql_messages import SQLMessagesMixin -from agentpool_storage.sql_provider.sql_projects import SQLProjectsMixin -from agentpool_storage.sql_provider.sql_sessions import SQLSessionsMixin +from wolfharness.log import get_logger +from wolfharness_config.storage import SQLStorageConfig +from wolfharness_storage.base import StorageProvider +from wolfharness_storage.sql_provider.sql_messages import SQLMessagesMixin +from wolfharness_storage.sql_provider.sql_projects import SQLProjectsMixin +from wolfharness_storage.sql_provider.sql_sessions import SQLSessionsMixin if TYPE_CHECKING: @@ -57,7 +57,7 @@ async def _init_database(self, auto_migrate: bool = True) -> None: Args: auto_migrate: Whether to automatically run Alembic migrations """ - from agentpool_storage.sql_provider.utils import run_alembic_migrations + from wolfharness_storage.sql_provider.utils import run_alembic_migrations if auto_migrate: # Run migrations first (handles schema changes for existing DBs) diff --git a/src/agentpool_storage/sql_provider/sql_sessions.py b/src/wolfharness_storage/sql_provider/sql_sessions.py similarity index 96% rename from src/agentpool_storage/sql_provider/sql_sessions.py rename to src/wolfharness_storage/sql_provider/sql_sessions.py index 4f5448295..110de53ca 100644 --- a/src/agentpool_storage/sql_provider/sql_sessions.py +++ b/src/wolfharness_storage/sql_provider/sql_sessions.py @@ -15,17 +15,17 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlmodel import SQLModel, desc, select -from agentpool.log import get_logger -from agentpool.messaging import TokenCost -from agentpool.utils.parse_time import parse_time_period -from agentpool.utils.time_utils import get_now -from agentpool_storage.models import QueryFilters -from agentpool_storage.sql_provider.models import ( +from wolfharness.log import get_logger +from wolfharness.messaging import TokenCost +from wolfharness.utils.parse_time import parse_time_period +from wolfharness.utils.time_utils import get_now +from wolfharness_storage.models import QueryFilters +from wolfharness_storage.sql_provider.models import ( CommandHistory, Conversation, Message, ) -from agentpool_storage.sql_provider.utils import ( +from wolfharness_storage.sql_provider.utils import ( format_conversation, to_chat_message, ) @@ -46,9 +46,9 @@ from sqlalchemy.ext.asyncio import AsyncEngine - from agentpool.common_types import JsonValue - from agentpool.sessions.models import SessionData - from agentpool_storage.models import ConversationData, StatsFilters + from wolfharness.common_types import JsonValue + from wolfharness.sessions.models import SessionData + from wolfharness_storage.models import ConversationData, StatsFilters logger = get_logger(__name__) @@ -115,7 +115,7 @@ async def log_session( Uses upsert semantics to handle duplicate session IDs gracefully. If the session already exists, it will be silently ignored. """ - from agentpool_storage.sql_provider.models import Conversation + from wolfharness_storage.sql_provider.models import Conversation async with AsyncSession(self.engine) as session: # Soft validation: check if parent exists (warn but don't crash) @@ -292,7 +292,7 @@ async def get_sessions(self, filters: QueryFilters) -> list[ConversationData]: async def get_session_stats(self, filters: StatsFilters) -> dict[str, dict[str, Any]]: """Get statistics using SQL aggregations.""" - from agentpool_storage.sql_provider.models import Conversation, Message + from wolfharness_storage.sql_provider.models import Conversation, Message async with AsyncSession(self.engine) as session: # Base query for stats @@ -339,7 +339,7 @@ async def reset(self, *, agent_name: str | None = None, hard: bool = False) -> t """Reset database storage.""" from sqlalchemy import text - from agentpool_storage.sql_provider.queries import ( + from wolfharness_storage.sql_provider.queries import ( DELETE_AGENT_CONVERSATIONS, DELETE_AGENT_MESSAGES, DELETE_ALL_CONVERSATIONS, @@ -375,7 +375,7 @@ async def reset(self, *, agent_name: str | None = None, hard: bool = False) -> t async def get_session_counts(self, *, agent_name: str | None = None) -> tuple[int, int]: """Get conversation and message counts.""" - from agentpool_storage.sql_provider import Conversation, Message + from wolfharness_storage.sql_provider import Conversation, Message if not self.session: msg = "Session not initialized. Use provider as async context manager." @@ -410,7 +410,7 @@ def _session_from_db(self, row: Conversation) -> SessionData: """ from pydantic import TypeAdapter - from agentpool.sessions.models import PendingDeferredCall, SessionData + from wolfharness.sessions.models import PendingDeferredCall, SessionData metadata = row.metadata_json or {} # Conversation.title is authoritative — always sync to metadata @@ -455,7 +455,7 @@ async def save_session(self, data: SessionData) -> None: """ from pydantic import TypeAdapter - from agentpool.sessions.models import PendingDeferredCall + from wolfharness.sessions.models import PendingDeferredCall # Serialize pending_deferred_calls into metadata_json metadata = dict(data.metadata) diff --git a/src/agentpool_storage/sql_provider/utils.py b/src/wolfharness_storage/sql_provider/utils.py similarity index 92% rename from src/agentpool_storage/sql_provider/utils.py rename to src/wolfharness_storage/sql_provider/utils.py index ead93202f..ad32336fd 100644 --- a/src/agentpool_storage/sql_provider/utils.py +++ b/src/wolfharness_storage/sql_provider/utils.py @@ -10,12 +10,12 @@ from sqlalchemy import Column, and_ from sqlmodel import select -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage, TokenCost -from agentpool.storage import deserialize_messages -from agentpool.utils.time_utils import parse_iso_timestamp -from agentpool_storage.models import ConversationData -from agentpool_storage.sql_provider.models import Conversation +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage, TokenCost +from wolfharness.storage import deserialize_messages +from wolfharness.utils.time_utils import parse_iso_timestamp +from wolfharness_storage.models import ConversationData +from wolfharness_storage.sql_provider.models import Conversation if TYPE_CHECKING: @@ -24,8 +24,8 @@ from sqlmodel.sql.expression import SelectOfScalar from tokonomics.toko_types import TokenUsage - from agentpool_config.session import SessionQuery - from agentpool_storage.sql_provider.models import Message + from wolfharness_config.session import SessionQuery + from wolfharness_storage.sql_provider.models import Message # Track migrated databases to skip redundant migration attempts @@ -37,7 +37,7 @@ def aggregate_token_usage( messages: Sequence[Message | ChatMessage[str]], ) -> TokenUsage: """Sum up tokens from a sequence of messages.""" - from agentpool_storage.sql_provider.models import Message + from wolfharness_storage.sql_provider.models import Message total = prompt = completion = 0 for msg in messages: @@ -166,7 +166,7 @@ def parse_model_info(model: str | None) -> tuple[str | None, str | None]: def build_message_query(query: SessionQuery) -> SelectOfScalar[Any]: """Build SQLModel query from SessionQuery.""" - from agentpool_storage.sql_provider.models import Message + from wolfharness_storage.sql_provider.models import Message stmt = select(Message).order_by(Message.timestamp, Message.id) # type: ignore diff --git a/src/agentpool_storage/zed_provider/__init__.py b/src/wolfharness_storage/zed_provider/__init__.py similarity index 84% rename from src/agentpool_storage/zed_provider/__init__.py rename to src/wolfharness_storage/zed_provider/__init__.py index 8752963c7..2753ab512 100644 --- a/src/agentpool_storage/zed_provider/__init__.py +++ b/src/wolfharness_storage/zed_provider/__init__.py @@ -9,7 +9,7 @@ from __future__ import annotations -from agentpool_storage.zed_provider.provider import ZedStorageProvider +from wolfharness_storage.zed_provider.provider import ZedStorageProvider __all__ = [ "ZedStorageProvider", diff --git a/src/agentpool_storage/zed_provider/helpers.py b/src/wolfharness_storage/zed_provider/helpers.py similarity index 96% rename from src/agentpool_storage/zed_provider/helpers.py rename to src/wolfharness_storage/zed_provider/helpers.py index 6ee23fad4..e58bc8ab8 100644 --- a/src/agentpool_storage/zed_provider/helpers.py +++ b/src/wolfharness_storage/zed_provider/helpers.py @@ -21,16 +21,16 @@ ) import zstandard -from agentpool.log import get_logger -from agentpool.messaging import ChatMessage -from agentpool.mime_utils import detect_image_media_type -from agentpool.utils.time_utils import parse_iso_timestamp +from wolfharness.log import get_logger +from wolfharness.messaging import ChatMessage +from wolfharness.mime_utils import detect_image_media_type +from wolfharness.utils.time_utils import parse_iso_timestamp if TYPE_CHECKING: from datetime import datetime - from agentpool_storage.zed_provider.models import ( + from wolfharness_storage.zed_provider.models import ( ZedFlatMessage, ZedNestedMessage, ZedThread, @@ -266,7 +266,7 @@ def thread_to_chat_messages(thread: ZedThread, thread_id: str) -> list[ChatMessa Returns: List of ChatMessage objects """ - from agentpool_storage.zed_provider.models import ZedFlatMessage, ZedNestedMessage + from wolfharness_storage.zed_provider.models import ZedFlatMessage, ZedNestedMessage messages: list[ChatMessage[str]] = [] updated_at = parse_iso_timestamp(thread.updated_at) diff --git a/src/agentpool_storage/zed_provider/models.py b/src/wolfharness_storage/zed_provider/models.py similarity index 100% rename from src/agentpool_storage/zed_provider/models.py rename to src/wolfharness_storage/zed_provider/models.py diff --git a/src/agentpool_storage/zed_provider/provider.py b/src/wolfharness_storage/zed_provider/provider.py similarity index 96% rename from src/agentpool_storage/zed_provider/provider.py rename to src/wolfharness_storage/zed_provider/provider.py index c26cf4e0f..d41de836c 100644 --- a/src/agentpool_storage/zed_provider/provider.py +++ b/src/wolfharness_storage/zed_provider/provider.py @@ -11,21 +11,21 @@ import anyenv -from agentpool.log import get_logger -from agentpool.utils.time_utils import get_now, parse_iso_timestamp -from agentpool_config.storage import ZedStorageConfig -from agentpool_storage.base import StorageProvider -from agentpool_storage.models import ConversationData, TokenUsage -from agentpool_storage.zed_provider import helpers -from agentpool_storage.zed_provider.models import ZedThread +from wolfharness.log import get_logger +from wolfharness.utils.time_utils import get_now, parse_iso_timestamp +from wolfharness_config.storage import ZedStorageConfig +from wolfharness_storage.base import StorageProvider +from wolfharness_storage.models import ConversationData, TokenUsage +from wolfharness_storage.zed_provider import helpers +from wolfharness_storage.zed_provider.models import ZedThread if TYPE_CHECKING: from collections.abc import Sequence - from agentpool.messaging import ChatMessage - from agentpool_config.session import SessionQuery - from agentpool_storage.models import QueryFilters, StatsFilters + from wolfharness.messaging import ChatMessage + from wolfharness_config.session import SessionQuery + from wolfharness_storage.models import QueryFilters, StatsFilters logger = get_logger(__name__) @@ -411,7 +411,7 @@ async def fork_conversation( import asyncio import datetime as dt - from agentpool_storage.models import QueryFilters, StatsFilters + from wolfharness_storage.models import QueryFilters, StatsFilters async def main() -> None: provider = ZedStorageProvider() diff --git a/src/wolfharness_sync/__init__.py b/src/wolfharness_sync/__init__.py new file mode 100644 index 000000000..12d328861 --- /dev/null +++ b/src/wolfharness_sync/__init__.py @@ -0,0 +1,73 @@ +"""File sync system for tracking dependencies and triggering reconciliation. + +This module provides a system for: +- Defining file dependencies via in-file metadata + (PEP723-style for Python, frontmatter for Markdown) +- Tracking changes via git +- Tracking external URL resources +- Tracking Python package version changes +- Triggering LLM-powered reconciliation when dependencies change +""" + +from __future__ import annotations + +from wolfharness_sync.config import ( + FileSyncConfig, + PackageSyncConfig, + SyncConfig, + UrlSyncConfig, +) +from wolfharness_sync.git import GitError, GitRepo +from wolfharness_sync.handlers import AgentReconciler, LoggingHandler +from wolfharness_sync.manager import InitMode, SyncManager +from wolfharness_sync.models import FileChange, SyncMetadata, UrlChange +from wolfharness_sync.packages import ( + PackageChange, + PackageRegistry, + PackageState, + is_significant_bump, +) +from wolfharness_sync.parsers import ( + BUILTIN_PARSERS, + MarkdownSyncParser, + MetadataParser, + PythonSyncParser, + get_parser_for_file, +) +from wolfharness_sync.resources import ResourceChange, ResourceRegistry, ResourceState + +__all__ = [ + # Parsers + "BUILTIN_PARSERS", + # Handlers + "AgentReconciler", + # Models + "FileChange", + # Config + "FileSyncConfig", + # Git + "GitError", + "GitRepo", + # Core + "InitMode", + "LoggingHandler", + "MarkdownSyncParser", + "MetadataParser", + # Packages + "PackageChange", + "PackageRegistry", + "PackageState", + "PackageSyncConfig", + "PythonSyncParser", + # Resources + "ResourceChange", + "ResourceRegistry", + "ResourceState", + "SyncConfig", + "SyncManager", + "SyncMetadata", + "UrlChange", + "UrlSyncConfig", + "get_parser_for_file", + "is_significant_bump", +] diff --git a/src/agentpool_sync/config.py b/src/wolfharness_sync/config.py similarity index 95% rename from src/agentpool_sync/config.py rename to src/wolfharness_sync/config.py index 413d56f48..eac4eae1f 100644 --- a/src/agentpool_sync/config.py +++ b/src/wolfharness_sync/config.py @@ -80,8 +80,8 @@ class SyncConfig(BaseModel): urls: list[UrlSyncConfig] = Field(default_factory=list) """URL resources to track centrally.""" - registry_path: str = ".agentpool/resources.yml" + registry_path: str = ".wolfharness/resources.yml" """Path to the resource registry file.""" - packages_registry_path: str = ".agentpool/packages.yml" + packages_registry_path: str = ".wolfharness/packages.yml" """Path to the packages registry file.""" diff --git a/src/agentpool_sync/git.py b/src/wolfharness_sync/git.py similarity index 100% rename from src/agentpool_sync/git.py rename to src/wolfharness_sync/git.py diff --git a/src/agentpool_sync/handlers.py b/src/wolfharness_sync/handlers.py similarity index 98% rename from src/agentpool_sync/handlers.py rename to src/wolfharness_sync/handlers.py index 4b05022a2..69f0d9262 100644 --- a/src/agentpool_sync/handlers.py +++ b/src/wolfharness_sync/handlers.py @@ -8,8 +8,8 @@ if TYPE_CHECKING: from collections.abc import Callable - from agentpool import MessageNode - from agentpool_sync.models import FileChange + from wolfharness import MessageNode + from wolfharness_sync.models import FileChange class AgentReconciler: diff --git a/src/agentpool_sync/manager.py b/src/wolfharness_sync/manager.py similarity index 96% rename from src/agentpool_sync/manager.py rename to src/wolfharness_sync/manager.py index 00753a036..7a56825c0 100644 --- a/src/agentpool_sync/manager.py +++ b/src/wolfharness_sync/manager.py @@ -9,19 +9,19 @@ from pathlib import Path from typing import TYPE_CHECKING, Any -from agentpool_sync.git import GitRepo -from agentpool_sync.models import FileChange -from agentpool_sync.packages import PackageRegistry -from agentpool_sync.parsers import BUILTIN_PARSERS -from agentpool_sync.resources import ResourceRegistry +from wolfharness_sync.git import GitRepo +from wolfharness_sync.models import FileChange +from wolfharness_sync.packages import PackageRegistry +from wolfharness_sync.parsers import BUILTIN_PARSERS +from wolfharness_sync.resources import ResourceRegistry if TYPE_CHECKING: from collections.abc import Awaitable, Callable - from agentpool_sync.models import SyncMetadata - from agentpool_sync.packages import PackageChange - from agentpool_sync.parsers import MetadataParser + from wolfharness_sync.models import SyncMetadata + from wolfharness_sync.packages import PackageChange + from wolfharness_sync.parsers import MetadataParser ChangeHandler = Callable[[FileChange], Awaitable[str | None]] ProjectChangeHandler = Callable[[list[PackageChange]], Awaitable[None]] @@ -55,19 +55,19 @@ def __init__( Args: root: Repository root path - registry_file: Path to resource registry (default: .agentpool/resources.yml) - packages_file: Path to packages registry (default: .agentpool/packages.yml) + registry_file: Path to resource registry (default: .wolfharness/resources.yml) + packages_file: Path to packages registry (default: .wolfharness/packages.yml) """ self.root = Path(root).resolve() self.git = GitRepo(self.root) registry_path = ( - Path(registry_file) if registry_file else self.root / ".agentpool" / "resources.yml" + Path(registry_file) if registry_file else self.root / ".wolfharness" / "resources.yml" ) self.resources = ResourceRegistry(registry_file=registry_path) packages_path = ( - Path(packages_file) if packages_file else self.root / ".agentpool" / "packages.yml" + Path(packages_file) if packages_file else self.root / ".wolfharness" / "packages.yml" ) self.packages = PackageRegistry(registry_file=packages_path) diff --git a/src/agentpool_sync/models.py b/src/wolfharness_sync/models.py similarity index 100% rename from src/agentpool_sync/models.py rename to src/wolfharness_sync/models.py diff --git a/src/agentpool_sync/packages.py b/src/wolfharness_sync/packages.py similarity index 100% rename from src/agentpool_sync/packages.py rename to src/wolfharness_sync/packages.py diff --git a/src/agentpool_sync/parsers/__init__.py b/src/wolfharness_sync/parsers/__init__.py similarity index 100% rename from src/agentpool_sync/parsers/__init__.py rename to src/wolfharness_sync/parsers/__init__.py diff --git a/src/agentpool_sync/parsers/helpers.py b/src/wolfharness_sync/parsers/helpers.py similarity index 100% rename from src/agentpool_sync/parsers/helpers.py rename to src/wolfharness_sync/parsers/helpers.py diff --git a/src/agentpool_sync/parsers/markdown_parser.py b/src/wolfharness_sync/parsers/markdown_parser.py similarity index 93% rename from src/agentpool_sync/parsers/markdown_parser.py rename to src/wolfharness_sync/parsers/markdown_parser.py index 3fd8e0191..01b9520f1 100644 --- a/src/agentpool_sync/parsers/markdown_parser.py +++ b/src/wolfharness_sync/parsers/markdown_parser.py @@ -6,11 +6,11 @@ import yaml -from agentpool_sync.parsers.helpers import FRONTMATTER_PATTERN +from wolfharness_sync.parsers.helpers import FRONTMATTER_PATTERN if TYPE_CHECKING: - from agentpool_sync.models import SyncMetadata + from wolfharness_sync.models import SyncMetadata class MarkdownSyncParser: @@ -34,7 +34,7 @@ class MarkdownSyncParser: def parse(self, content: str) -> SyncMetadata | None: import yamling - from agentpool_sync.models import SyncMetadata + from wolfharness_sync.models import SyncMetadata match = FRONTMATTER_PATTERN.match(content) if not match: diff --git a/src/agentpool_sync/parsers/protocol.py b/src/wolfharness_sync/parsers/protocol.py similarity index 91% rename from src/agentpool_sync/parsers/protocol.py rename to src/wolfharness_sync/parsers/protocol.py index a727b13c8..a5a713acd 100644 --- a/src/agentpool_sync/parsers/protocol.py +++ b/src/wolfharness_sync/parsers/protocol.py @@ -6,7 +6,7 @@ if TYPE_CHECKING: - from agentpool_sync.models import SyncMetadata + from wolfharness_sync.models import SyncMetadata class MetadataParser(Protocol): diff --git a/src/agentpool_sync/parsers/python_parser.py b/src/wolfharness_sync/parsers/python_parser.py similarity index 96% rename from src/agentpool_sync/parsers/python_parser.py rename to src/wolfharness_sync/parsers/python_parser.py index 9ff6c4c33..fd0bd06e4 100644 --- a/src/agentpool_sync/parsers/python_parser.py +++ b/src/wolfharness_sync/parsers/python_parser.py @@ -7,7 +7,7 @@ if TYPE_CHECKING: - from agentpool_sync.models import SyncMetadata + from wolfharness_sync.models import SyncMetadata _BLOCK_PATTERN = re.compile(r"^# /// sync\s*\n((?:^#[^\n]*\n)*?)^# ///$", re.MULTILINE) @@ -89,7 +89,7 @@ def _parse_toml_like(text: str) -> SyncMetadata: """Simple TOML-like parser for the metadata block.""" import anyenv - from agentpool_sync.models import SyncMetadata + from wolfharness_sync.models import SyncMetadata try: # TODO: need to check whether this needs to be BaseModel with extra fields allowed diff --git a/src/agentpool_sync/resources.py b/src/wolfharness_sync/resources.py similarity index 100% rename from src/agentpool_sync/resources.py rename to src/wolfharness_sync/resources.py diff --git a/src/wolfharness_toolsets/__init__.py b/src/wolfharness_toolsets/__init__.py new file mode 100644 index 000000000..515c994ca --- /dev/null +++ b/src/wolfharness_toolsets/__init__.py @@ -0,0 +1,13 @@ +"""Toolsets package.""" + +from wolfharness_toolsets.config_creation import ConfigCreationTools +from wolfharness_toolsets.fsspec_toolset import FSSpecTools +from wolfharness_toolsets.notifications import NotificationsTools +from wolfharness_toolsets.vfs_toolset import VFSTools + +__all__ = [ + "ConfigCreationTools", + "FSSpecTools", + "NotificationsTools", + "VFSTools", +] diff --git a/src/wolfharness_toolsets/builtin/__init__.py b/src/wolfharness_toolsets/builtin/__init__.py new file mode 100644 index 000000000..4330edc56 --- /dev/null +++ b/src/wolfharness_toolsets/builtin/__init__.py @@ -0,0 +1,23 @@ +"""Built-in toolsets for agent capabilities.""" + +from __future__ import annotations + + +# Import provider classes +from wolfharness_toolsets.builtin.code import CodeTools +from wolfharness_toolsets.builtin.debug import DebugTools +from wolfharness_toolsets.builtin.execution_environment import ProcessManagementTools +from wolfharness_toolsets.builtin.question_tools import QuestionTools +from wolfharness_toolsets.builtin.subagent_tools import SubagentTools +from wolfharness_toolsets.builtin.workers import WorkersTools + + +__all__ = [ + # Provider classes + "CodeTools", + "DebugTools", + "ProcessManagementTools", + "QuestionTools", + "SubagentTools", + "WorkersTools", +] diff --git a/src/agentpool_toolsets/builtin/code.py b/src/wolfharness_toolsets/builtin/code.py similarity index 97% rename from src/agentpool_toolsets/builtin/code.py rename to src/wolfharness_toolsets/builtin/code.py index 1e6a51abc..b9dfcab03 100644 --- a/src/agentpool_toolsets/builtin/code.py +++ b/src/wolfharness_toolsets/builtin/code.py @@ -9,10 +9,10 @@ from upathtools import is_directory -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger -from agentpool_toolsets.fsspec_toolset.diagnostics import ( +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger +from wolfharness_toolsets.fsspec_toolset.diagnostics import ( DiagnosticsManager, format_diagnostics_table, format_run_summary, @@ -25,8 +25,8 @@ from exxec.base import ExecutionEnvironment from fsspec.asyn import AsyncFileSystem - from agentpool.tools.base import Tool - from agentpool_toolsets.fsspec_toolset.diagnostics import DiagnosticsConfig + from wolfharness.tools.base import Tool + from wolfharness_toolsets.fsspec_toolset.diagnostics import DiagnosticsConfig logger = get_logger(__name__) diff --git a/src/agentpool_toolsets/builtin/debug.py b/src/wolfharness_toolsets/builtin/debug.py similarity index 95% rename from src/agentpool_toolsets/builtin/debug.py rename to src/wolfharness_toolsets/builtin/debug.py index a7760ca57..70ed0ec8b 100644 --- a/src/agentpool_toolsets/builtin/debug.py +++ b/src/wolfharness_toolsets/builtin/debug.py @@ -12,9 +12,9 @@ import anyenv from pydantic_ai import RunContext # noqa: TC002 -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger logger = get_logger(__name__) @@ -206,7 +206,7 @@ async def get_logs( async def get_platform_paths() -> str: - """Get platform-specific paths for agentpool. + """Get platform-specific paths for wolfharness. Returns: Dictionary of platform paths @@ -214,14 +214,14 @@ async def get_platform_paths() -> str: import platformdirs paths = { - "config": platformdirs.user_config_dir("agentpool"), - "data": platformdirs.user_data_dir("agentpool"), - "cache": platformdirs.user_cache_dir("agentpool"), - "logs": platformdirs.user_log_dir("agentpool"), - "state": platformdirs.user_state_dir("agentpool"), + "config": platformdirs.user_config_dir("wolfharness"), + "data": platformdirs.user_data_dir("wolfharness"), + "cache": platformdirs.user_cache_dir("wolfharness"), + "logs": platformdirs.user_log_dir("wolfharness"), + "state": platformdirs.user_state_dir("wolfharness"), } - lines = ["Platform paths for agentpool:", ""] + lines = ["Platform paths for wolfharness:", ""] for name, path in paths.items(): lines.append(f" {name}: {path}") diff --git a/src/agentpool_toolsets/builtin/execution_environment.py b/src/wolfharness_toolsets/builtin/execution_environment.py similarity index 96% rename from src/agentpool_toolsets/builtin/execution_environment.py rename to src/wolfharness_toolsets/builtin/execution_environment.py index c456d5cb5..8029cb1a9 100644 --- a/src/agentpool_toolsets/builtin/execution_environment.py +++ b/src/wolfharness_toolsets/builtin/execution_environment.py @@ -5,9 +5,9 @@ import re from typing import TYPE_CHECKING -from agentpool import log -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness import log +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability if TYPE_CHECKING: @@ -15,7 +15,7 @@ from exxec import ExecutionEnvironment - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool logger = log.get_logger(__name__) @@ -37,8 +37,8 @@ class ProcessManagementTools(FunctionToolsetCapability): Uses any ExecutionEnvironment backend and emits events via AgentContext. For code execution and bash commands, use the standalone tools: - - agentpool.tool_impls.bash.BashTool - - agentpool.tool_impls.execute_code.ExecuteCodeTool + - wolfharness.tool_impls.bash.BashTool + - wolfharness.tool_impls.execute_code.ExecuteCodeTool """ def __init__(self, env: ExecutionEnvironment | None = None, name: str = "process") -> None: diff --git a/src/agentpool_toolsets/builtin/file_edit/__init__.py b/src/wolfharness_toolsets/builtin/file_edit/__init__.py similarity index 100% rename from src/agentpool_toolsets/builtin/file_edit/__init__.py rename to src/wolfharness_toolsets/builtin/file_edit/__init__.py diff --git a/src/agentpool_toolsets/builtin/file_edit/file_edit.py b/src/wolfharness_toolsets/builtin/file_edit/file_edit.py similarity index 95% rename from src/agentpool_toolsets/builtin/file_edit/file_edit.py rename to src/wolfharness_toolsets/builtin/file_edit/file_edit.py index 429c58e81..0355c2c67 100644 --- a/src/agentpool_toolsets/builtin/file_edit/file_edit.py +++ b/src/wolfharness_toolsets/builtin/file_edit/file_edit.py @@ -9,12 +9,12 @@ from pathlib import Path from typing import TYPE_CHECKING, Any -from agentpool.tools.base import Tool -from agentpool.utils.diffs import compute_unified_diff, count_changed_lines +from wolfharness.tools.base import Tool +from wolfharness.utils.diffs import compute_unified_diff, count_changed_lines if TYPE_CHECKING: - from agentpool.agents import AgentContext + from wolfharness.agents import AgentContext async def edit_file_tool( diff --git a/src/agentpool_toolsets/builtin/question_tools.py b/src/wolfharness_toolsets/builtin/question_tools.py similarity index 97% rename from src/agentpool_toolsets/builtin/question_tools.py rename to src/wolfharness_toolsets/builtin/question_tools.py index d2e173219..1b76e73be 100644 --- a/src/agentpool_toolsets/builtin/question_tools.py +++ b/src/wolfharness_toolsets/builtin/question_tools.py @@ -14,10 +14,10 @@ from pydantic_ai import ModelRetry from pydantic_xml import BaseXmlModel, attr, element -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.tasks.exceptions import RunAbortedError -from agentpool.tools.base import ToolResult +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.tasks.exceptions import RunAbortedError +from wolfharness.tools.base import ToolResult class Suggest(BaseXmlModel, tag="suggest"): diff --git a/src/agentpool_toolsets/builtin/skills.py b/src/wolfharness_toolsets/builtin/skills.py similarity index 95% rename from src/agentpool_toolsets/builtin/skills.py rename to src/wolfharness_toolsets/builtin/skills.py index 125fc48ec..511edf995 100644 --- a/src/agentpool_toolsets/builtin/skills.py +++ b/src/wolfharness_toolsets/builtin/skills.py @@ -1,7 +1,7 @@ """Skills tools — backward-compatible re-exports. The standalone ``SkillsTools`` toolset has been consolidated into -:class:`~agentpool.capabilities.skill_manager_cap.SkillManagerCap` +:class:`~wolfharness.capabilities.skill_manager_cap.SkillManagerCap` (unify-skill-loading change). The production ``load_skill`` / ``list_skills`` tools are owned by ``SkillManagerCap``. @@ -16,8 +16,8 @@ from typing import Any -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.capabilities.skill_manager_cap import ( +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.capabilities.skill_manager_cap import ( SkillManagerCap, _load_reference_content, _substitute_arguments, diff --git a/src/agentpool_toolsets/builtin/subagent_tools.py b/src/wolfharness_toolsets/builtin/subagent_tools.py similarity index 95% rename from src/agentpool_toolsets/builtin/subagent_tools.py rename to src/wolfharness_toolsets/builtin/subagent_tools.py index f8d63ac2a..d3827ffad 100644 --- a/src/agentpool_toolsets/builtin/subagent_tools.py +++ b/src/wolfharness_toolsets/builtin/subagent_tools.py @@ -17,12 +17,12 @@ import logfire from pydantic_ai import ModelRetry -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.agents.events import StreamCompleteEvent -from agentpool.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger -from agentpool.tools.exceptions import ToolError +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger +from wolfharness.tools.exceptions import ToolError logger = get_logger(__name__) @@ -99,7 +99,7 @@ async def task( # noqa: D417 Returns: Structured output containing result and metadata """ - from agentpool.common_types import SupportsRunStream + from wolfharness.common_types import SupportsRunStream _ = description # Used for logging/tracking in future @@ -234,7 +234,7 @@ def _extract_model_id(agent_cfg: Any) -> str | None: """Extract model_id from agent config if it's a NativeAgentConfig.""" if agent_cfg is None: return None - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig if isinstance(agent_cfg, NativeAgentConfig): raw_model = agent_cfg.model @@ -264,7 +264,7 @@ async def _run_sync( is_team_node: bool, ) -> str: """Run task synchronously and return final content.""" - from agentpool.messaging.message_history import MessageHistory + from wolfharness.messaging.message_history import MessageHistory if is_team_node: result = await node.run(prompt, message_history=MessageHistory()) diff --git a/src/agentpool_toolsets/builtin/workers.py b/src/wolfharness_toolsets/builtin/workers.py similarity index 89% rename from src/agentpool_toolsets/builtin/workers.py rename to src/wolfharness_toolsets/builtin/workers.py index 8485af7c7..b723a0901 100644 --- a/src/agentpool_toolsets/builtin/workers.py +++ b/src/wolfharness_toolsets/builtin/workers.py @@ -10,22 +10,22 @@ from typing import TYPE_CHECKING, Any, Literal -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.agents.events import ( +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.agents.events import ( StreamCompleteEvent, SubAgentEvent, ) -from agentpool.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger -from agentpool.tools.exceptions import ToolError +from wolfharness.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger +from wolfharness.tools.exceptions import ToolError if TYPE_CHECKING: from collections.abc import Sequence - from agentpool.tools.base import Tool - from agentpool_config.workers import WorkerConfig + from wolfharness.tools.base import Tool + from wolfharness_config.workers import WorkerConfig logger = get_logger(__name__) @@ -60,7 +60,7 @@ async def get_tools(self) -> Sequence[Tool]: def _create_worker_tool(self, worker_config: WorkerConfig) -> Tool: """Create a tool for a single worker configuration.""" - from agentpool_config.workers import AgentWorkerConfig + from wolfharness_config.workers import AgentWorkerConfig worker_name = worker_config.name # Regular agents get history management @@ -83,7 +83,7 @@ def _create_agent_tool( """Create tool for a regular agent worker with history management.""" async def run(ctx: AgentContext, prompt: str) -> Any: - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent session_pool = _require_session_pool(ctx) worker = await _resolve_worker(ctx, session_pool, agent_name) @@ -127,7 +127,7 @@ def _create_node_tool(self, node_name: str) -> Tool: async def run(ctx: AgentContext, prompt: str) -> str: session_pool = _require_session_pool(ctx) worker = await _resolve_worker(ctx, session_pool, node_name) - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent is_team_node = not isinstance(worker, BaseAgent) _check_delegation_depth(ctx) @@ -174,7 +174,7 @@ async def _resolve_worker(ctx: AgentContext, session_pool: Any, node_name: str) agent_cfg = ctx.pool.manifest.agents[node_name] if session_pool.sessions is not None: session_pool.sessions.runtime_registry.register(node_name, agent_cfg) - from agentpool.utils.identifiers import generate_session_id + from wolfharness.utils.identifiers import generate_session_id temp_id = generate_session_id() worker = await session_pool.sessions.get_or_create_session_agent( @@ -206,7 +206,7 @@ async def _manage_history( worker: Any, ctx: AgentContext, pass_message_history: bool, reset_history_on_run: bool ) -> Any: """Manage conversation history for agent workers. Returns old history if saved.""" - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent if not isinstance(worker, BaseAgent): return None @@ -227,9 +227,9 @@ async def _create_child_session( is_team_node: bool, ) -> str: """Create child session for worker execution.""" - from agentpool.agents.base_agent import BaseAgent - from agentpool.common_types import SupportsRunStream - from agentpool.delegation.base_team import BaseTeam + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.common_types import SupportsRunStream + from wolfharness.delegation.base_team import BaseTeam parent_session_id = getattr(ctx.node, "session_id", None) or ( ctx.run_ctx.session_id if ctx.run_ctx else "" @@ -275,10 +275,10 @@ async def _execute_worker( is_team_node: bool, ) -> str: """Execute worker and return result content.""" - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent if is_team_node: - from agentpool.messaging.message_history import MessageHistory + from wolfharness.messaging.message_history import MessageHistory result = await worker.run(prompt, message_history=MessageHistory()) return str(result.content) if result.content else "" diff --git a/src/agentpool_toolsets/composio_toolset.py b/src/wolfharness_toolsets/composio_toolset.py similarity index 93% rename from src/agentpool_toolsets/composio_toolset.py rename to src/wolfharness_toolsets/composio_toolset.py index 7fed8c543..bf3684b82 100644 --- a/src/agentpool_toolsets/composio_toolset.py +++ b/src/wolfharness_toolsets/composio_toolset.py @@ -5,14 +5,14 @@ import os from typing import TYPE_CHECKING, Any -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger if TYPE_CHECKING: from collections.abc import Callable, Sequence - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool logger = get_logger(__name__) @@ -83,7 +83,7 @@ async def get_tools(self) -> Sequence[Tool]: import anyio async def main() -> None: - from agentpool import Agent + from wolfharness import Agent tools = ComposioTools("user@example.com", toolsets=["github"]) agent = Agent(model="gpt-5-nano") diff --git a/src/agentpool_toolsets/config_creation.py b/src/wolfharness_toolsets/config_creation.py similarity index 98% rename from src/agentpool_toolsets/config_creation.py rename to src/wolfharness_toolsets/config_creation.py index 676b737a2..316e81a9c 100644 --- a/src/agentpool_toolsets/config_creation.py +++ b/src/wolfharness_toolsets/config_creation.py @@ -9,7 +9,7 @@ from upathtools import is_directory_sync, to_upath from upathtools.filesystems.file_filesystems import JsonSchemaFileSystem -from agentpool.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability if TYPE_CHECKING: diff --git a/src/agentpool_toolsets/cron.py b/src/wolfharness_toolsets/cron.py similarity index 92% rename from src/agentpool_toolsets/cron.py rename to src/wolfharness_toolsets/cron.py index 14ec81c91..f529d052b 100644 --- a/src/agentpool_toolsets/cron.py +++ b/src/wolfharness_toolsets/cron.py @@ -5,18 +5,18 @@ from datetime import datetime from typing import TYPE_CHECKING, Self -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger -from agentpool.utils.time_utils import datetime_to_ms +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger +from wolfharness.utils.time_utils import datetime_to_ms if TYPE_CHECKING: from collections.abc import Sequence from types import TracebackType - from agentpool.tools.base import Tool - from agentpool_bot.cron.cron_types import CronSchedule - from agentpool_bot.cron.service import CronService + from wolfharness.tools.base import Tool + from wolfharness_bot.cron.cron_types import CronSchedule + from wolfharness_bot.cron.service import CronService logger = get_logger(__name__) @@ -93,7 +93,7 @@ async def cron_add( Returns: Confirmation with the job id. """ - from agentpool_bot.cron.cron_types import CronSchedule + from wolfharness_bot.cron.cron_types import CronSchedule if tz and not cron_expr: return "Error: tz can only be used with cron_expr" diff --git a/src/agentpool_toolsets/entry_points.py b/src/wolfharness_toolsets/entry_points.py similarity index 87% rename from src/agentpool_toolsets/entry_points.py rename to src/wolfharness_toolsets/entry_points.py index 99019ba88..ee60b2036 100644 --- a/src/agentpool_toolsets/entry_points.py +++ b/src/wolfharness_toolsets/entry_points.py @@ -7,14 +7,14 @@ from epregistry import EntryPointRegistry -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger if TYPE_CHECKING: from collections.abc import Sequence - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool logger = get_logger(__name__) @@ -26,7 +26,7 @@ class EntryPointTools(FunctionToolsetCapability): def __init__(self, module: str) -> None: super().__init__(name=module) self.module = module - self.registry = EntryPointRegistry[Callable[..., Any]]("agentpool") + self.registry = EntryPointRegistry[Callable[..., Any]]("wolfharness") async def get_tools(self) -> Sequence[Tool]: """Get tools from entry points.""" diff --git a/src/agentpool_toolsets/fsspec_toolset/__init__.py b/src/wolfharness_toolsets/fsspec_toolset/__init__.py similarity index 55% rename from src/agentpool_toolsets/fsspec_toolset/__init__.py rename to src/wolfharness_toolsets/fsspec_toolset/__init__.py index 5b725e23b..0476ed7a6 100644 --- a/src/agentpool_toolsets/fsspec_toolset/__init__.py +++ b/src/wolfharness_toolsets/fsspec_toolset/__init__.py @@ -2,13 +2,13 @@ from __future__ import annotations -from agentpool_toolsets.fsspec_toolset.diagnostics import ( +from wolfharness_toolsets.fsspec_toolset.diagnostics import ( DiagnosticsConfig, DiagnosticsManager, DiagnosticsResult, ) -from agentpool_toolsets.fsspec_toolset.image_utils import resize_image_if_needed -from agentpool_toolsets.fsspec_toolset.toolset import FSSpecTools +from wolfharness_toolsets.fsspec_toolset.image_utils import resize_image_if_needed +from wolfharness_toolsets.fsspec_toolset.toolset import FSSpecTools __all__ = [ "DiagnosticsConfig", diff --git a/src/agentpool_toolsets/fsspec_toolset/diagnostics.py b/src/wolfharness_toolsets/fsspec_toolset/diagnostics.py similarity index 99% rename from src/agentpool_toolsets/fsspec_toolset/diagnostics.py rename to src/wolfharness_toolsets/fsspec_toolset/diagnostics.py index 014e7f105..dbb8b11b5 100644 --- a/src/agentpool_toolsets/fsspec_toolset/diagnostics.py +++ b/src/wolfharness_toolsets/fsspec_toolset/diagnostics.py @@ -18,7 +18,7 @@ import anyenv -from agentpool.log import get_logger +from wolfharness.log import get_logger if TYPE_CHECKING: diff --git a/src/agentpool_toolsets/fsspec_toolset/grep.py b/src/wolfharness_toolsets/fsspec_toolset/grep.py similarity index 99% rename from src/agentpool_toolsets/fsspec_toolset/grep.py rename to src/wolfharness_toolsets/fsspec_toolset/grep.py index a6aef6799..96b175b9e 100644 --- a/src/agentpool_toolsets/fsspec_toolset/grep.py +++ b/src/wolfharness_toolsets/fsspec_toolset/grep.py @@ -7,8 +7,8 @@ import anyenv -from agentpool.log import get_logger -from agentpool_toolsets.fsspec_toolset.helpers import DEFAULT_MAX_SIZE +from wolfharness.log import get_logger +from wolfharness_toolsets.fsspec_toolset.helpers import DEFAULT_MAX_SIZE if TYPE_CHECKING: diff --git a/src/agentpool_toolsets/fsspec_toolset/helpers.py b/src/wolfharness_toolsets/fsspec_toolset/helpers.py similarity index 99% rename from src/agentpool_toolsets/fsspec_toolset/helpers.py rename to src/wolfharness_toolsets/fsspec_toolset/helpers.py index 0c0c8a072..13acfc312 100644 --- a/src/agentpool_toolsets/fsspec_toolset/helpers.py +++ b/src/wolfharness_toolsets/fsspec_toolset/helpers.py @@ -8,7 +8,7 @@ from pydantic_ai import ModelRetry -from agentpool.log import get_logger +from wolfharness.log import get_logger logger = get_logger(__name__) diff --git a/src/agentpool_toolsets/fsspec_toolset/image_utils.py b/src/wolfharness_toolsets/fsspec_toolset/image_utils.py similarity index 100% rename from src/agentpool_toolsets/fsspec_toolset/image_utils.py rename to src/wolfharness_toolsets/fsspec_toolset/image_utils.py diff --git a/src/agentpool_toolsets/fsspec_toolset/streaming_diff_parser.py b/src/wolfharness_toolsets/fsspec_toolset/streaming_diff_parser.py similarity index 100% rename from src/agentpool_toolsets/fsspec_toolset/streaming_diff_parser.py rename to src/wolfharness_toolsets/fsspec_toolset/streaming_diff_parser.py diff --git a/src/agentpool_toolsets/fsspec_toolset/toolset.py b/src/wolfharness_toolsets/fsspec_toolset/toolset.py similarity index 96% rename from src/agentpool_toolsets/fsspec_toolset/toolset.py rename to src/wolfharness_toolsets/fsspec_toolset/toolset.py index 8bdd77a9e..b52e078da 100644 --- a/src/agentpool_toolsets/fsspec_toolset/toolset.py +++ b/src/wolfharness_toolsets/fsspec_toolset/toolset.py @@ -26,27 +26,27 @@ from sublime_search import replace_content from upathtools import is_directory -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger -from agentpool.mime_utils import guess_type, is_binary_content, is_binary_mime -from agentpool.tool_impls.delete_path import create_delete_path_tool -from agentpool.tool_impls.download_file import create_download_file_tool -from agentpool.tool_impls.grep import create_grep_tool -from agentpool.tool_impls.list_directory import create_list_directory_tool -from agentpool.tool_impls.read import create_read_tool -from agentpool.tools.base import ToolResult # noqa: TC001 -from agentpool.utils.diffs import get_changed_line_numbers -from agentpool_toolsets.fsspec_toolset.diagnostics import ( +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger +from wolfharness.mime_utils import guess_type, is_binary_content, is_binary_mime +from wolfharness.tool_impls.delete_path import create_delete_path_tool +from wolfharness.tool_impls.download_file import create_download_file_tool +from wolfharness.tool_impls.grep import create_grep_tool +from wolfharness.tool_impls.list_directory import create_list_directory_tool +from wolfharness.tool_impls.read import create_read_tool +from wolfharness.tools.base import ToolResult # noqa: TC001 +from wolfharness.utils.diffs import get_changed_line_numbers +from wolfharness_toolsets.fsspec_toolset.diagnostics import ( DiagnosticsConfig, DiagnosticsManager, format_diagnostics_table, ) -from agentpool_toolsets.fsspec_toolset.helpers import ( +from wolfharness_toolsets.fsspec_toolset.helpers import ( format_directory_listing, truncate_lines, ) -from agentpool_toolsets.fsspec_toolset.streaming_diff_parser import ( +from wolfharness_toolsets.fsspec_toolset.streaming_diff_parser import ( NewTextChunk, OldTextChunk, StreamingDiffParser, @@ -60,12 +60,12 @@ from fsspec.asyn import AsyncFileSystem from pydantic_ai import ModelRequest - from agentpool.agents.base_agent import BaseAgent - from agentpool.common_types import ModelType - from agentpool.messaging import MessageHistory - from agentpool.prompts.conversion_manager import ConversionManager - from agentpool.tools.base import Tool - from agentpool_toolsets.fsspec_toolset.grep import GrepBackend + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.common_types import ModelType + from wolfharness.messaging import MessageHistory + from wolfharness.prompts.conversion_manager import ConversionManager + from wolfharness.tools.base import Tool + from wolfharness_toolsets.fsspec_toolset.grep import GrepBackend logger = get_logger(__name__) @@ -241,7 +241,7 @@ async def _get_file_map( Returns: Structure map string or None if language not supported """ - from agentpool.repomap import generate_file_outline + from wolfharness.repomap import generate_file_outline # Use centralized outline generation fs = self._get_fs(agent_ctx) @@ -300,7 +300,7 @@ async def list_directory( # noqa: D417 Returns: Markdown-formatted directory listing """ - from agentpool.agents.events import TextContentItem + from wolfharness.agents.events import TextContentItem path = self._resolve_path(path, agent_ctx) msg = f"Listing directory: {path}" @@ -390,9 +390,9 @@ async def read( # noqa: D417 Text content for text files, BinaryContent for binary files (with optional dimension note as list when image was resized), or dict with error """ - from agentpool.agents.events import FileContentItem, LocationContentItem - from agentpool.repomap import truncate_with_notice - from agentpool_toolsets.fsspec_toolset.image_utils import resize_image_if_needed + from wolfharness.agents.events import FileContentItem, LocationContentItem + from wolfharness.repomap import truncate_with_notice + from wolfharness_toolsets.fsspec_toolset.image_utils import resize_image_if_needed path = self._resolve_path(path, agent_ctx) msg = f"Reading file: {path}" @@ -487,7 +487,7 @@ async def read_as_markdown(self, agent_ctx: AgentContext, path: str) -> str | di Returns: File content converted to markdown """ - from agentpool.agents.events import TextContentItem + from wolfharness.agents.events import TextContentItem assert self.converter is not None, "Converter required for read_as_markdown" path = self._resolve_path(path, agent_ctx) @@ -527,8 +527,8 @@ async def write( # noqa: D417 Returns: Success message or ToolResult with metadata """ - from agentpool.agents.events import DiffContentItem - from agentpool.tools.base import ToolResult + from wolfharness.agents.events import DiffContentItem + from wolfharness.tools.base import ToolResult path = self._resolve_path(path, agent_ctx) msg = f"Writing file: {path}" @@ -728,7 +728,7 @@ async def edit_batch( # noqa: D417 ("old_name()", "new_name()"), # Update call sites ] """ - from agentpool.tools.base import ToolResult + from wolfharness.tools.base import ToolResult path = self._resolve_path(path, agent_ctx) msg = f"Editing file: {path} ({description})" @@ -985,8 +985,8 @@ async def grep( # noqa: D417 Returns: Grep results as formatted text """ - from agentpool.agents.events import TextContentItem - from agentpool_toolsets.fsspec_toolset.grep import ( + from wolfharness.agents.events import TextContentItem + from wolfharness_toolsets.fsspec_toolset.grep import ( DEFAULT_EXCLUDE_PATTERNS, detect_grep_backend, grep_with_fsspec, @@ -1187,7 +1187,7 @@ async def agentic_edit( # noqa: D417 Returns: Success message with edit summary """ - from agentpool.messaging import ChatMessage, MessageHistory + from wolfharness.messaging import ChatMessage, MessageHistory path = self._resolve_path(path, agent_ctx) title = f"AI editing file: {path}" @@ -1554,7 +1554,7 @@ async def _stream_raw_content( def to_opencode_edit_metadata(original_content: str, new_content: str, path: str) -> dict[str, Any]: - from agentpool.utils.diffs import compute_unified_diff + from wolfharness.utils.diffs import compute_unified_diff name = Path(path).name diff = compute_unified_diff( @@ -1653,7 +1653,7 @@ async def main() -> None: from pydantic_ai.models.test import TestModel from upathtools import core - from agentpool import Agent, AgentPool + from wolfharness import Agent, AgentPool fs = core.filesystem("file") tools = FSSpecTools(fs, name="local_fs") @@ -1663,7 +1663,7 @@ async def main() -> None: result = await tools.agentic_edit( PyAiContext(deps=None, model=TestModel(), usage=RunUsage()), agent_ctx, - path="/home/phil65/dev/oss/agentpool/src/agentpool_toolsets/fsspec_toolset/toolset.py", + path="/home/phil65/dev/oss/wolfharness/src/wolfharness_toolsets/fsspec_toolset/toolset.py", display_description="Append a poem", ) print(result) diff --git a/src/agentpool_toolsets/mcp_discovery/__init__.py b/src/wolfharness_toolsets/mcp_discovery/__init__.py similarity index 60% rename from src/agentpool_toolsets/mcp_discovery/__init__.py rename to src/wolfharness_toolsets/mcp_discovery/__init__.py index 57ecd9a77..801548115 100644 --- a/src/agentpool_toolsets/mcp_discovery/__init__.py +++ b/src/wolfharness_toolsets/mcp_discovery/__init__.py @@ -1,5 +1,5 @@ """MCP Discovery Toolset - dynamic MCP server exploration and tool execution.""" -from agentpool_toolsets.mcp_discovery.toolset import MCPDiscoveryToolset +from wolfharness_toolsets.mcp_discovery.toolset import MCPDiscoveryToolset __all__ = ["MCPDiscoveryToolset"] diff --git a/src/agentpool_toolsets/mcp_discovery/data/mcp_servers.parquet b/src/wolfharness_toolsets/mcp_discovery/data/mcp_servers.parquet similarity index 100% rename from src/agentpool_toolsets/mcp_discovery/data/mcp_servers.parquet rename to src/wolfharness_toolsets/mcp_discovery/data/mcp_servers.parquet diff --git a/src/agentpool_toolsets/mcp_discovery/toolset.py b/src/wolfharness_toolsets/mcp_discovery/toolset.py similarity index 96% rename from src/agentpool_toolsets/mcp_discovery/toolset.py rename to src/wolfharness_toolsets/mcp_discovery/toolset.py index 772d6c5de..122c9fa11 100644 --- a/src/agentpool_toolsets/mcp_discovery/toolset.py +++ b/src/wolfharness_toolsets/mcp_discovery/toolset.py @@ -19,11 +19,11 @@ from pydantic import HttpUrl from pydantic_ai import RunContext # noqa: TC002 -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger -from agentpool.mcp_server.client import MCPClient -from agentpool.mcp_server.registries.official_registry_client import ( +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger +from wolfharness.mcp_server.client import MCPClient +from wolfharness.mcp_server.registries.official_registry_client import ( MCPRegistryClient, MCPRegistryError, ) @@ -34,9 +34,9 @@ from fastmcp.client.sampling import SamplingHandler - from agentpool.mcp_server.registries.official_registry_client import RegistryServer - from agentpool.tools.base import Tool - from agentpool_config.mcp_server import MCPServerConfig + from wolfharness.mcp_server.registries.official_registry_client import RegistryServer + from wolfharness.tools.base import Tool + from wolfharness_config.mcp_server import MCPServerConfig logger = get_logger(__name__) @@ -154,7 +154,7 @@ def _is_server_allowed(self, server_name: str) -> bool: async def _get_server_config(self, server_name: str) -> MCPServerConfig: """Get connection config for a server from the registry.""" - from agentpool_config.mcp_server import ( + from wolfharness_config.mcp_server import ( SSEMCPServerConfig, StreamableHTTPMCPServerConfig, ) @@ -462,7 +462,7 @@ async def cleanup(self) -> None: if __name__ == "__main__": import asyncio - from agentpool.agents.native_agent import Agent + from wolfharness.agents.native_agent import Agent async def main() -> None: """End-to-end example: Add MCP discovery toolset to an agent and call a tool.""" diff --git a/src/agentpool_toolsets/mcp_run_toolset.py b/src/wolfharness_toolsets/mcp_run_toolset.py similarity index 96% rename from src/agentpool_toolsets/mcp_run_toolset.py rename to src/wolfharness_toolsets/mcp_run_toolset.py index d7664c170..3814fb793 100644 --- a/src/agentpool_toolsets/mcp_run_toolset.py +++ b/src/wolfharness_toolsets/mcp_run_toolset.py @@ -7,8 +7,8 @@ from schemez import OpenAIFunctionDefinition -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -19,7 +19,7 @@ from mcp import ClientSession from mcp.types import CallToolResult - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool logger = get_logger(__name__) diff --git a/src/agentpool_toolsets/notifications.py b/src/wolfharness_toolsets/notifications.py similarity index 96% rename from src/agentpool_toolsets/notifications.py rename to src/wolfharness_toolsets/notifications.py index 7809acaec..f1deec16b 100644 --- a/src/agentpool_toolsets/notifications.py +++ b/src/wolfharness_toolsets/notifications.py @@ -6,14 +6,14 @@ from schemez.functionschema.typedefs import OpenAIFunctionDefinition -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger if TYPE_CHECKING: from collections.abc import Mapping, Sequence - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool logger = get_logger(__name__) diff --git a/src/agentpool_toolsets/openapi.py b/src/wolfharness_toolsets/openapi.py similarity index 96% rename from src/agentpool_toolsets/openapi.py rename to src/wolfharness_toolsets/openapi.py index 586accc89..9df0fb524 100644 --- a/src/agentpool_toolsets/openapi.py +++ b/src/wolfharness_toolsets/openapi.py @@ -8,8 +8,8 @@ from schemez.openapi.loader import load_openapi_spec, parse_operations from upathtools import read_path, to_upath -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -18,7 +18,7 @@ import httpx from upathtools import JoinablePathLike - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool logger = get_logger(__name__) diff --git a/src/wolfharness_toolsets/py.typed b/src/wolfharness_toolsets/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/src/agentpool_toolsets/search_toolset.py b/src/wolfharness_toolsets/search_toolset.py similarity index 94% rename from src/agentpool_toolsets/search_toolset.py rename to src/wolfharness_toolsets/search_toolset.py index 746543995..8ceb6e261 100644 --- a/src/agentpool_toolsets/search_toolset.py +++ b/src/wolfharness_toolsets/search_toolset.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING, Any -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.log import get_logger +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.log import get_logger if TYPE_CHECKING: @@ -20,8 +20,8 @@ WebSearchResponse, ) - from agentpool.agents.context import AgentContext - from agentpool.tools.base import Tool + from wolfharness.agents.context import AgentContext + from wolfharness.tools.base import Tool logger = get_logger(__name__) @@ -102,7 +102,7 @@ async def web_search( # noqa: D417 Returns: Formatted markdown search results. """ - from agentpool.agents.events import TextContentItem + from wolfharness.agents.events import TextContentItem assert self._web_provider is not None await agent_ctx.events.tool_call_progress( @@ -151,7 +151,7 @@ async def news_search( # noqa: D417 Returns: Formatted markdown news results. """ - from agentpool.agents.events import TextContentItem + from wolfharness.agents.events import TextContentItem assert self._news_provider is not None diff --git a/src/agentpool_toolsets/streaming_tools.py b/src/wolfharness_toolsets/streaming_tools.py similarity index 97% rename from src/agentpool_toolsets/streaming_tools.py rename to src/wolfharness_toolsets/streaming_tools.py index c3d811130..bca5a52fa 100644 --- a/src/agentpool_toolsets/streaming_tools.py +++ b/src/wolfharness_toolsets/streaming_tools.py @@ -52,9 +52,9 @@ async def edit_file( from pydantic_ai.messages import ModelRequest, ModelResponse - from agentpool.agents.base_agent import BaseAgent - from agentpool.agents.context import AgentContext - from agentpool.messaging import MessageHistory + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.agents.context import AgentContext + from wolfharness.messaging import MessageHistory @dataclass @@ -185,7 +185,7 @@ def _create_forked_history(agent: BaseAgent) -> MessageHistory: The fork preserves full context for cache benefits while isolating new messages from the main conversation. """ - from agentpool.messaging import ChatMessage, MessageHistory + from wolfharness.messaging import ChatMessage, MessageHistory if current_history := agent.conversation.get_history(): # Get pydantic-ai messages and inject cache point diff --git a/src/agentpool_toolsets/vfs_toolset.py b/src/wolfharness_toolsets/vfs_toolset.py similarity index 97% rename from src/agentpool_toolsets/vfs_toolset.py rename to src/wolfharness_toolsets/vfs_toolset.py index 52fcd8793..eed5d1161 100644 --- a/src/agentpool_toolsets/vfs_toolset.py +++ b/src/wolfharness_toolsets/vfs_toolset.py @@ -4,8 +4,8 @@ from fnmatch import fnmatch -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability async def vfs_list( # noqa: D417 diff --git a/test_graph_config_loading.py b/test_graph_config_loading.py deleted file mode 100644 index 720cd95b0..000000000 --- a/test_graph_config_loading.py +++ /dev/null @@ -1,263 +0,0 @@ -"""Test script for graph config loading in AgentPool. - -Validates that: -- Old YAML configs (teams:/connections:) load and translate correctly -- New graph: YAML configs load and build correctly -- Config validation errors include file location -""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -import pytest - -from agentpool import AgentPool -from agentpool_config.graph_translation import GraphConfig - - -if TYPE_CHECKING: - from pathlib import Path - - -# ============================================================================= -# Fixtures -# ============================================================================= - - -@pytest.fixture -def old_config_path(tmp_path: Path) -> Path: - """Create an old-style config with connections.""" - config = tmp_path / "old_config.yml" - config.write_text(""" -agents: - agent_a: - type: native - model: test - system_prompt: "You are agent A" - connections: - - type: node - name: agent_b - - agent_b: - type: native - model: test - system_prompt: "You are agent B" -""") - return config - - -@pytest.fixture -def old_teams_config_path(tmp_path: Path) -> Path: - """Create an old-style config with teams.""" - config = tmp_path / "old_teams_config.yml" - config.write_text(""" -agents: - analyzer: - type: native - model: test - system_prompt: "You are analyzer" - - reviewer: - type: native - model: test - system_prompt: "You are reviewer" - -teams: - review_pipeline: - mode: sequential - members: [analyzer, reviewer] -""") - return config - - -@pytest.fixture -def new_graph_config_path(tmp_path: Path) -> Path: - """Create a new-style config with graph: section.""" - config = tmp_path / "new_graph_config.yml" - config.write_text(""" -agents: - step_a: - type: native - model: test - system_prompt: "You are step A" - - step_b: - type: native - model: test - system_prompt: "You are step B" - -graph: - name: test_workflow - steps: - - id: step_a - agent: step_a - - id: step_b - agent: step_b - edges: - - from: start - to: step_a - - from: step_a - to: step_b - - from: step_b - to: end -""") - return config - - -@pytest.fixture -def invalid_graph_config_path(tmp_path: Path) -> Path: - """Create a config with an invalid graph reference.""" - config = tmp_path / "invalid_graph_config.yml" - config.write_text(""" -agents: - step_a: - type: native - model: test - -graph: - steps: - - id: step_a - agent: step_a - - id: bad_step - agent: nonexistent_agent - edges: - - from: start - to: step_a - - from: step_a - to: bad_step -""") - return config - - -# ============================================================================= -# Tests -# ============================================================================= - - -@pytest.mark.asyncio -async def test_old_connections_config_loads(old_config_path: Path) -> None: - """Old configs with connections: should load without error.""" - pool = AgentPool(old_config_path) - # Graph config should be translated from connections - assert pool._graph_config is not None - assert isinstance(pool._graph_config, GraphConfig) - assert len(pool._graph_config.steps) == 2 # noqa: PLR2004 - assert len(pool._graph_config.edges) == 1 - - async with pool: - # Graph should be built from config - assert pool._graph is not None - assert pool.graph is not None - - -@pytest.mark.asyncio -async def test_old_teams_config_loads(old_teams_config_path: Path) -> None: - """Old configs with teams: should load and translate correctly.""" - pool = AgentPool(old_teams_config_path) - # Graph config should be translated from teams - assert pool._graph_config is not None - assert isinstance(pool._graph_config, GraphConfig) - assert len(pool._graph_config.steps) == 2 # noqa: PLR2004 - # Sequential team: start -> analyzer -> reviewer -> end = 3 edges - assert len(pool._graph_config.edges) == 3 # noqa: PLR2004 - - async with pool: - assert pool._graph is not None - assert pool.graph is not None - - -@pytest.mark.asyncio -async def test_new_graph_config_loads(new_graph_config_path: Path) -> None: - """New configs with graph: section should load natively.""" - pool = AgentPool(new_graph_config_path) - assert pool._graph_config is not None - assert isinstance(pool._graph_config, GraphConfig) - assert pool._graph_config.name == "test_workflow" - assert len(pool._graph_config.steps) == 2 # noqa: PLR2004 - assert len(pool._graph_config.edges) == 3 # noqa: PLR2004 - - async with pool: - assert pool._graph is not None - assert pool.graph is not None - - -@pytest.mark.asyncio -async def test_invalid_graph_config_error(invalid_graph_config_path: Path) -> None: - """Invalid graph configs should raise with config location in message.""" - pool = AgentPool(invalid_graph_config_path) - # Config loading succeeds (translation works) - assert pool._graph_config is not None - - with pytest.raises(RuntimeError) as exc_info: - async with pool: - pass - - # The top-level exception is wrapped by the outer __aenter__ try block. - # Walk the cause chain to find the specific graph build error. - exc = exc_info.value - full_msg = "" - while exc is not None: - full_msg += str(exc) + "\n" - exc = exc.__cause__ - - # Error should mention the config file path somewhere in the chain - assert str(invalid_graph_config_path) in full_msg - # Error should mention the unknown agent - assert "unknown agent" in full_msg.lower() or "bad_step" in full_msg.lower() - - -@pytest.mark.asyncio -async def test_empty_config_loads(tmp_path: Path) -> None: - """Configs with no teams/connections/graph should have no graph config.""" - config = tmp_path / "empty_config.yml" - config.write_text(""" -agents: - solo: - type: native - model: test -""") - pool = AgentPool(config) - assert pool._graph_config is None - - async with pool: - # No graph config means no built graph - assert pool.graph is None - - -@pytest.mark.asyncio -async def test_programmatic_manifest_with_graph() -> None: - """Programmatic manifests with graph in model_extra should work.""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest - - manifest = AgentsManifest( - agents={ - "a": NativeAgentConfig(name="a", model="test"), - "b": NativeAgentConfig(name="b", model="test"), - }, - # extra="allow" stores unknown fields in model_extra - graph={ - "name": "prog_graph", - "steps": [ - {"id": "a", "agent": "a"}, - {"id": "b", "agent": "b"}, - ], - "edges": [ - {"from": "start", "to": "a"}, - {"from": "a", "to": "b"}, - {"from": "b", "to": "end"}, - ], - }, - ) - - pool = AgentPool(manifest) - assert pool._graph_config is not None - assert pool._graph_config.name == "prog_graph" - - async with pool: - assert pool._graph is not None - - -if __name__ == "__main__": - pytest.main([__file__, "-v"]) diff --git a/test_pool_skills.py b/test_pool_skills.py deleted file mode 100644 index 7b22e8ec1..000000000 --- a/test_pool_skills.py +++ /dev/null @@ -1,93 +0,0 @@ -"""Test skill resolution with actual AgentPool setup mimicking serve-acp. - -Usage (from packages/agentpool): - uv run python test_pool_skills.py -""" - -from __future__ import annotations - -import asyncio -import sys - - -sys.path.insert(0, "/Users/yuchen.liu/src/yilab/iroot-llm/packages/agentpool/src") - -from agentpool import AgentPool - - -async def main(): # noqa: PLR0915 - print("=" * 60) - print("AgentPool Skill Resolution Test") - print("=" * 60) - print() - - config_path = ( - "/Users/yuchen.liu/src/yilab/iroot-llm/packages/xeno-agent/config/diag-agent-ng.yaml" - ) - print(f"Config: {config_path}") - print() - - try: - pool = AgentPool(config_path) - async with pool: - print("Pool initialized") - print(f" skill_resolver: {pool.skill_resolver is not None}") - print(f" skill_provider: {pool.skill_provider is not None}") - print(f" skills_dirs: {pool.skills.registry.skills_dirs if pool.skills else 'N/A'}") - print() - - # List local skills - local_skills = pool.skills.list_skills() - print(f"Local skills ({len(local_skills)}):") - for s in local_skills: - print(f" - {s.name}: {s.skill_path}") - print() - - # List provider skills (including MCP) - if pool.skill_provider: - provider_skills = await pool.skill_provider.get_skills() - print(f"Provider skills ({len(provider_skills)}):") - for s in provider_skills: - print(f" - {s.name}: {s.skill_path}") - print() - - # Test resolver - resolver = pool.skill_resolver - if resolver: - print("Registered providers:") - for name in resolver.list_providers(): - print(f" - {name}") - print() - - # Test 1: Bare skill name - print("--- Test 1: Bare skill name ---") - try: - skill = await resolver.resolve("systematic-troubleshooting") - print(f"OK: {skill.name}") - except Exception as e: # noqa: BLE001 - print(f"FAIL: {e}") - print() - - # Test 2: skill:// URI with reference - print("--- Test 2: skill:// URI with reference ---") - uri = "skill://systematic-troubleshooting/references/expert_knowledge/excavator/excavator-hard-starting.md" - try: - skill = await resolver.resolve(uri) - print(f"OK: {skill.name}") - ref_path = getattr(skill, "_resolved_reference_path", None) - print(f" ref_path: {ref_path}") - except Exception as e: # noqa: BLE001 - print(f"FAIL: {e}") - print() - - except Exception as e: # noqa: BLE001 - print(f"ERROR: {e}") - import traceback - - traceback.print_exc() - - print("Done") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/tests/AGENTS.md b/tests/AGENTS.md index 4b091fae2..fb394e215 100644 --- a/tests/AGENTS.md +++ b/tests/AGENTS.md @@ -24,7 +24,7 @@ AgentPool uses a 4-layer conceptual taxonomy (L1-L4) for discussing test types. | **L1** | Unit | `@pytest.mark.unit` | `TestModel`, `FunctionModel`, mocks | Fast (<100ms) | None | ✅ Always | Logic branches, boundary conditions, data transforms | | **L2** | Integration | `@pytest.mark.integration` | Real `AgentPool` + `TestModel`, FastAPI `TestClient` | Fast (<500ms) | None | ✅ Always | Component wiring, capability registration, event conversion, protocol handlers (mocked deps) | | **L3** | VCR | `@pytest.mark.vcr` | `pytest-recording` + `vcrpy` + cassettes | Fast-Medium (<5s) | None (replay) | ✅ Always | Real model API response format, streaming event sequences, tool call structures, protocol transport | -| **L4** | Subprocess E2E | `@pytest.mark.e2e` | Real `agentpool serve-*` process + protocol client | Slow (5-30s) | Optional | L4a: ✅ PR smoke, L4b: ❌ Nightly | Server startup, stdio transport, process lifecycle, real I/O timing | +| **L4** | Subprocess E2E | `@pytest.mark.e2e` | Real `wolfharness serve-*` process + protocol client | Slow (5-30s) | Optional | L4a: ✅ PR smoke, L4b: ❌ Nightly | Server startup, stdio transport, process lifecycle, real I/O timing | Tests carry exactly ONE primary layer marker. L3 VCR tests that also exercise protocol integration MAY additionally carry `@pytest.mark.integration` as a secondary marker for filtering. The primary marker determines CI stage assignment. @@ -99,7 +99,7 @@ a skipped test is never executed. The test intent MUST be documented in the docs so the test clearly communicates what behavior is expected once the feature is implemented. ```python -@pytest.mark.skip(reason="mcp/connect client-side not implemented in agentpool ACP server yet") +@pytest.mark.skip(reason="mcp/connect client-side not implemented in wolfharness ACP server yet") async def test_mcp_connect_client_side(...): """Send mcp/connect request with a valid MCP server config. Expect result.connected = true and result.server_info containing @@ -434,14 +434,14 @@ Never. Fix the test or fix the code. If a test is legitimately obsolete, mark it | `vcr_config` | module | VCR configuration (header filtering, body decoding) | | `acp_client` | function | ACP client connected to in-process ACP server | | `opencode_client` | function | FastAPI `TestClient` for OpenCode server | -| `subprocess_server` | function | Spawned `agentpool serve-*` process (cached by serve_command; use `--no-server-cache` to bypass) | +| `subprocess_server` | function | Spawned `wolfharness serve-*` process (cached by serve_command; use `--no-server-cache` to bypass) | | `minimal_config` | session | Minimal YAML config with single test agent | | `session_e2e_config` | session | Session-scoped e2e config with in-memory storage (for cached servers) | | `session_e2e_config_with_tool` | session | Session-scoped e2e config with bash tool + in-memory storage | ## Subprocess Server Cache -The `subprocess_server` fixture uses a **session-scoped cache** to reuse `agentpool serve-*` processes across tests with the same `serve_command`. This reduces ~100+ subprocess spawns to ~4-5, cutting L4a e2e time from ~14min to ~4-5min. +The `subprocess_server` fixture uses a **session-scoped cache** to reuse `wolfharness serve-*` processes across tests with the same `serve_command`. This reduces ~100+ subprocess spawns to ~4-5, cutting L4a e2e time from ~14min to ~4-5min. ### How It Works diff --git a/tests/_controller_helpers.py b/tests/_controller_helpers.py index 23a03a7a4..ccaddfbc3 100644 --- a/tests/_controller_helpers.py +++ b/tests/_controller_helpers.py @@ -10,11 +10,11 @@ import time from typing import TYPE_CHECKING, Any -from agentpool.lifecycle.types import DeliveryMode +from wolfharness.lifecycle.types import DeliveryMode if TYPE_CHECKING: - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController async def send_via_controller( diff --git a/tests/acp/test_client_handler_session_update.py b/tests/acp/test_client_handler_session_update.py index 91e982f4b..a472982a8 100644 --- a/tests/acp/test_client_handler_session_update.py +++ b/tests/acp/test_client_handler_session_update.py @@ -25,9 +25,9 @@ ToolCallStart, UserMessageChunk, ) -from agentpool.agents.acp_agent import ACPAgent -from agentpool.agents.acp_agent.client_handler import ACPClientHandler -from agentpool.agents.acp_agent.session_state import ACPSessionState +from wolfharness.agents.acp_agent import ACPAgent +from wolfharness.agents.acp_agent.client_handler import ACPClientHandler +from wolfharness.agents.acp_agent.session_state import ACPSessionState def _mock_agent() -> MagicMock: @@ -235,7 +235,7 @@ async def test_current_mode_update_emits_signal( handler: ACPClientHandler, mock_agent: MagicMock ) -> None: """CurrentModeUpdate should emit state_updated signal with ModeInfo.""" - from agentpool.agents.modes import ModeInfo + from wolfharness.agents.modes import ModeInfo session_state = ACPSessionState(session_id="test-session") session_state.modes = SessionModeState( diff --git a/tests/acp/test_event_converter_errors.py b/tests/acp/test_event_converter_errors.py index 538acc0dd..5384bb658 100644 --- a/tests/acp/test_event_converter_errors.py +++ b/tests/acp/test_event_converter_errors.py @@ -8,14 +8,14 @@ from pydantic_ai import RequestUsage import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( RunErrorEvent, RunFailedEvent, StreamCompleteEvent, ToolCallStartEvent, ) -from agentpool.messaging.messages import ChatMessage -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.messaging.messages import ChatMessage +from wolfharness_server.acp_server.event_converter import ACPEventConverter @pytest.fixture diff --git a/tests/acp/test_event_converter_snapshots.py b/tests/acp/test_event_converter_snapshots.py index a7d17034d..5d70528ff 100644 --- a/tests/acp/test_event_converter_snapshots.py +++ b/tests/acp/test_event_converter_snapshots.py @@ -33,13 +33,13 @@ from pydantic_ai.usage import RequestUsage -from agentpool.agents.events import StreamCompleteEvent -from agentpool.messaging.messages import ChatMessage -from agentpool_server.acp_server.event_converter import ACPEventConverter from tests.fixtures.subagent_events import ( TEST_EVENT_SEQUENCES, zed_full_lifecycle_events, ) +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.messaging.messages import ChatMessage +from wolfharness_server.acp_server.event_converter import ACPEventConverter pytestmark = pytest.mark.integration @@ -398,7 +398,7 @@ async def test_full_lifecycle( # tool_call_id for snapshot comparison fixed_uuid = UUID("00000000-0000-0000-0000-000000000001") with patch( - "agentpool_server.acp_server.event_converter.uuid.uuid4", + "wolfharness_server.acp_server.event_converter.uuid.uuid4", return_value=fixed_uuid, ): events = zed_full_lifecycle_events() @@ -486,7 +486,7 @@ async def test_zed_mode_tool_call_start_has_kind_subagent(self): Then: The yielded ToolCallStart has kind="other" (subagent context is conveyed via field_meta, not the kind field). """ - from agentpool.agents.events import SpawnSessionStart + from wolfharness.agents.events import SpawnSessionStart converter = ACPEventConverter(subagent_display_mode="zed") converter._current_message_id = "test-msg-id" @@ -519,7 +519,7 @@ async def test_zed_mode_build_subagent_completed_has_meta_and_tool_name(self): Then: The yielded ToolCallProgress has field_meta with subagent_session_info and tool_name keys. """ - from agentpool.agents.events import SpawnSessionStart + from wolfharness.agents.events import SpawnSessionStart converter = ACPEventConverter(subagent_display_mode="zed") converter._current_message_id = "test-msg-id" diff --git a/tests/acp/test_meta_guardrails.py b/tests/acp/test_meta_guardrails.py index 87b9584e8..c7b279b74 100644 --- a/tests/acp/test_meta_guardrails.py +++ b/tests/acp/test_meta_guardrails.py @@ -14,8 +14,8 @@ import pytest -from agentpool.agents.events import SpawnSessionStart -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.agents.events import SpawnSessionStart +from wolfharness_server.acp_server.event_converter import ACPEventConverter @pytest.fixture diff --git a/tests/acp/test_qwen_display_mode.py b/tests/acp/test_qwen_display_mode.py index 70a26e507..781142e68 100644 --- a/tests/acp/test_qwen_display_mode.py +++ b/tests/acp/test_qwen_display_mode.py @@ -15,8 +15,8 @@ import pytest from acp.schema import AgentMessageChunk, ToolCallStart -from agentpool.agents.events import SpawnSessionStart -from agentpool_server.acp_server.event_converter import ( +from wolfharness.agents.events import SpawnSessionStart +from wolfharness_server.acp_server.event_converter import ( ACPEventConverter, SubagentContext, ) diff --git a/tests/acp/test_subagent_display_mode_coerce.py b/tests/acp/test_subagent_display_mode_coerce.py index feb17cfd6..630d8b0e6 100644 --- a/tests/acp/test_subagent_display_mode_coerce.py +++ b/tests/acp/test_subagent_display_mode_coerce.py @@ -10,7 +10,7 @@ import pytest -from agentpool_server.acp_server.server import _coerce_subagent_display_mode +from wolfharness_server.acp_server.server import _coerce_subagent_display_mode # --------------------------------------------------------------------------- @@ -99,7 +99,7 @@ def test_coerce_qwen(caplog: pytest.LogCaptureFixture): @pytest.mark.unit def test_pool_server_config_accepts_qwen(): """ACPPoolServerConfig accepts 'qwen' without ValidationError.""" - from agentpool_config.pool_server import ACPPoolServerConfig + from wolfharness_config.pool_server import ACPPoolServerConfig config = ACPPoolServerConfig(subagent_display_mode="qwen") assert config.subagent_display_mode == "qwen" diff --git a/tests/acp/test_toast_notification.py b/tests/acp/test_toast_notification.py index 82af9c01b..a4158d48e 100644 --- a/tests/acp/test_toast_notification.py +++ b/tests/acp/test_toast_notification.py @@ -6,7 +6,7 @@ import pytest -from agentpool.agents.events import ToastInfo +from wolfharness.agents.events import ToastInfo pytestmark = pytest.mark.unit @@ -27,7 +27,7 @@ def mock_session(self): async def test_send_toast_error(self, mock_session): """Test sending error toast notification.""" - from agentpool_server.acp_server.session import ACPSession + from wolfharness_server.acp_server.session import ACPSession # Patch the method onto the mock with patch.object(mock_session, "notifications") as mock_notifs: @@ -37,7 +37,7 @@ async def test_send_toast_error(self, mock_session): level="error", ) mock_notifs.send_ext_notification.assert_called_once_with( - method="_agentpool/toast", + method="_wolfharness/toast", params={ "message": "Test error", "level": "error", @@ -48,7 +48,7 @@ async def test_send_toast_error(self, mock_session): async def test_send_toast_warning(self, mock_session): """Test sending warning toast notification.""" - from agentpool_server.acp_server.session import ACPSession + from wolfharness_server.acp_server.session import ACPSession with patch.object(mock_session, "notifications") as mock_notifs: await ACPSession._send_toast( @@ -58,7 +58,7 @@ async def test_send_toast_warning(self, mock_session): duration=5000, ) mock_notifs.send_ext_notification.assert_called_once_with( - method="_agentpool/toast", + method="_wolfharness/toast", params={ "message": "Warning message", "level": "warning", @@ -69,7 +69,7 @@ async def test_send_toast_warning(self, mock_session): async def test_send_toast_with_action(self, mock_session): """Test sending toast with action button.""" - from agentpool_server.acp_server.session import ACPSession + from wolfharness_server.acp_server.session import ACPSession with patch.object(mock_session, "notifications") as mock_notifs: await ACPSession._send_toast( @@ -79,7 +79,7 @@ async def test_send_toast_with_action(self, mock_session): action={"label": "Retry", "command": "/retry"}, ) mock_notifs.send_ext_notification.assert_called_once_with( - method="_agentpool/toast", + method="_wolfharness/toast", params={ "message": "Click to retry", "level": "info", @@ -90,7 +90,7 @@ async def test_send_toast_with_action(self, mock_session): async def test_send_toast_cancelled(self, mock_session): """Test that toast is not sent when session is cancelled.""" - from agentpool_server.acp_server.session import ACPSession + from wolfharness_server.acp_server.session import ACPSession mock_session._cancelled = True with patch.object(mock_session, "notifications") as mock_notifs: @@ -103,7 +103,7 @@ async def test_send_toast_cancelled(self, mock_session): async def test_send_toast_exception_handled(self, mock_session): """Test that exceptions in send_ext_notification are handled.""" - from agentpool_server.acp_server.session import ACPSession + from wolfharness_server.acp_server.session import ACPSession with patch.object(mock_session, "notifications") as mock_notifs: mock_notifs.send_ext_notification.side_effect = RuntimeError("Network error") @@ -129,8 +129,8 @@ def mock_handler(self): return handler async def test_handle_toast_notification(self, mock_handler): - """Test handling _agentpool/toast ext notification.""" - from agentpool.agents.acp_agent.client_handler import ACPClientHandler + """Test handling _wolfharness/toast ext notification.""" + from wolfharness.agents.acp_agent.client_handler import ACPClientHandler params = { "message": "Error occurred", @@ -139,7 +139,7 @@ async def test_handle_toast_notification(self, mock_handler): "action": {"label": "Retry", "command": "/retry"}, } - await ACPClientHandler.ext_notification(mock_handler, "_agentpool/toast", params) + await ACPClientHandler.ext_notification(mock_handler, "_wolfharness/toast", params) # Verify state_updated was emitted with ToastInfo mock_handler._agent.state_updated.emit.assert_called_once() @@ -152,11 +152,11 @@ async def test_handle_toast_notification(self, mock_handler): async def test_handle_toast_notification_defaults(self, mock_handler): """Test handling toast with default values.""" - from agentpool.agents.acp_agent.client_handler import ACPClientHandler + from wolfharness.agents.acp_agent.client_handler import ACPClientHandler params = {"message": "Info message"} - await ACPClientHandler.ext_notification(mock_handler, "_agentpool/toast", params) + await ACPClientHandler.ext_notification(mock_handler, "_wolfharness/toast", params) toast = mock_handler._agent.state_updated.emit.call_args[0][0] assert isinstance(toast, ToastInfo) @@ -167,7 +167,7 @@ async def test_handle_toast_notification_defaults(self, mock_handler): async def test_handle_unknown_ext_notification(self, mock_handler): """Test that unknown ext notifications are ignored gracefully.""" - from agentpool.agents.acp_agent.client_handler import ACPClientHandler + from wolfharness.agents.acp_agent.client_handler import ACPClientHandler await ACPClientHandler.ext_notification(mock_handler, "_unknown/method", {"foo": "bar"}) @@ -191,12 +191,12 @@ async def test_send_ext_notification(self, mock_notifications): await ACPNotifications.send_ext_notification( mock_notifications, - method="_agentpool/toast", + method="_wolfharness/toast", params={"message": "Hello", "level": "info"}, ) mock_notifications.client.ext_notification.assert_called_once_with( - "_agentpool/toast", + "_wolfharness/toast", {"message": "Hello", "level": "info"}, ) @@ -243,7 +243,7 @@ def test_toast_info_full(self): def test_toast_info_in_state_update(self): """Test that ToastInfo can be used as a state update.""" - from agentpool.agents.events import ToastInfo + from wolfharness.agents.events import ToastInfo toast = ToastInfo(message="Test", level="warning") assert isinstance(toast, ToastInfo) diff --git a/tests/acp/test_zed_none_child.py b/tests/acp/test_zed_none_child.py index 1445f2b40..e90c9834a 100644 --- a/tests/acp/test_zed_none_child.py +++ b/tests/acp/test_zed_none_child.py @@ -4,7 +4,7 @@ unknown/missing values) in zed mode does not raise ``KeyError`` or crash, matching the plan requirement in ``tasks.md 6.8``. -Ref: ``src/agentpool_server/acp_server/event_converter.py:690-693`` +Ref: ``src/wolfharness_server/acp_server/event_converter.py:690-693`` """ from __future__ import annotations @@ -13,15 +13,15 @@ from pydantic_ai.usage import RequestUsage import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( PartDeltaEvent, RunErrorEvent, SpawnSessionStart, StreamCompleteEvent, SubAgentEvent, ) -from agentpool.messaging.messages import ChatMessage -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.messaging.messages import ChatMessage +from wolfharness_server.acp_server.event_converter import ACPEventConverter # --------------------------------------------------------------------------- diff --git a/tests/acp/test_zed_subagent_spawn.py b/tests/acp/test_zed_subagent_spawn.py index f11b079d6..ffc0103a4 100644 --- a/tests/acp/test_zed_subagent_spawn.py +++ b/tests/acp/test_zed_subagent_spawn.py @@ -15,16 +15,16 @@ import pytest from acp.schema import ToolCallStart -from agentpool import Agent -from agentpool.agents.context import ( +from wolfharness import Agent +from wolfharness.agents.context import ( MAX_SUBAGENT_DEPTH, AgentContext, AgentRunContext, SubagentDepthError, ) -from agentpool.agents.events import SpawnSessionStart -from agentpool.orchestrator.core import EventBus -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.agents.events import SpawnSessionStart +from wolfharness.orchestrator.core import EventBus +from wolfharness_server.acp_server.event_converter import ACPEventConverter # --------------------------------------------------------------------------- @@ -291,7 +291,7 @@ def test_team_py_uses_yield_spawn_pattern() -> None: """ import inspect - from agentpool.delegation import base_team + from wolfharness.delegation import base_team source = inspect.getsource(base_team) diff --git a/tests/acp_server/test_acp_skill_commands.py b/tests/acp_server/test_acp_skill_commands.py index 13028e8e6..f71009ec1 100644 --- a/tests/acp_server/test_acp_skill_commands.py +++ b/tests/acp_server/test_acp_skill_commands.py @@ -11,9 +11,9 @@ import pytest from slashed import Command as SlashedCommand, CommandStore -from agentpool.skills.command import SkillCommand -from agentpool.skills.skill import Skill -from agentpool_server.acp_server.commands.skill_commands import ACPSkillBridge +from wolfharness.skills.command import SkillCommand +from wolfharness.skills.skill import Skill +from wolfharness_server.acp_server.commands.skill_commands import ACPSkillBridge # --------------------------------------------------------------------------- @@ -191,7 +191,7 @@ def _make_minimal_session( def _call_register_skill_commands(session: MagicMock) -> None: """Invoke the real _register_skill_commands method on a mock session.""" # We need to call the unbound method from ACPSession on our mock - from agentpool_server.acp_server.session import ACPSession + from wolfharness_server.acp_server.session import ACPSession ACPSession._register_skill_commands(session) # type: ignore[arg-type] diff --git a/tests/acp_server/test_acp_skill_e2e.py b/tests/acp_server/test_acp_skill_e2e.py index f8c364a5a..706293773 100644 --- a/tests/acp_server/test_acp_skill_e2e.py +++ b/tests/acp_server/test_acp_skill_e2e.py @@ -19,10 +19,10 @@ import pytest from slashed import Command as SlashedCommand, CommandStore -from agentpool import Agent, AgentPool -from agentpool.capabilities.change_event import ChangeEvent -from agentpool.skills.skill import Skill -from agentpool_server.acp_server.session import ACPSession +from wolfharness import Agent, AgentPool +from wolfharness.capabilities.change_event import ChangeEvent +from wolfharness.skills.skill import Skill +from wolfharness_server.acp_server.session import ACPSession if TYPE_CHECKING: @@ -53,8 +53,8 @@ def _make_skill( def _make_pool_and_agent() -> tuple[AgentPool, Agent]: """Create a simple pool with one agent.""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) pool = AgentPool(manifest) @@ -395,7 +395,7 @@ async def test_regression_manifest_commands_still_work( _mock_skills_on_pool(pool, [_make_skill(name="my-skill")]) # Mock manifest to return a command config - from agentpool_config.commands import StaticCommandConfig + from wolfharness_config.commands import StaticCommandConfig manifest_cmd = StaticCommandConfig( type="static", @@ -463,7 +463,7 @@ async def test_regression_send_update_includes_both_manifest_and_skill_commands( skill = _make_skill(name="skill-cmd", description="A skill command") _mock_skills_on_pool(pool, [skill]) - from agentpool_config.commands import StaticCommandConfig + from wolfharness_config.commands import StaticCommandConfig manifest_cmd = StaticCommandConfig( type="static", @@ -503,7 +503,7 @@ async def test_regression_command_name_collision_last_registered_wins( skill = _make_skill(name=shared_name, description="Skill version of shared command") _mock_skills_on_pool(pool, [skill]) - from agentpool_config.commands import StaticCommandConfig + from wolfharness_config.commands import StaticCommandConfig manifest_cmd = StaticCommandConfig( type="static", diff --git a/tests/acp_server/test_acp_skill_lifecycle.py b/tests/acp_server/test_acp_skill_lifecycle.py index 452424409..719c23587 100644 --- a/tests/acp_server/test_acp_skill_lifecycle.py +++ b/tests/acp_server/test_acp_skill_lifecycle.py @@ -14,9 +14,9 @@ import pytest -from agentpool.capabilities.change_event import ChangeEvent -from agentpool.skills.command import SkillCommand -from agentpool.skills.skill import Skill +from wolfharness.capabilities.change_event import ChangeEvent +from wolfharness.skills.command import SkillCommand +from wolfharness.skills.skill import Skill # --------------------------------------------------------------------------- @@ -71,7 +71,7 @@ def _make_mock_session( """ from slashed import CommandStore - from agentpool_server.acp_server.commands.skill_commands import ACPSkillBridge + from wolfharness_server.acp_server.commands.skill_commands import ACPSkillBridge session = MagicMock() @@ -113,7 +113,7 @@ def _make_mock_session( session.notifications.send_agent_text = AsyncMock() # Bind real methods - from agentpool_server.acp_server.session import ACPSession + from wolfharness_server.acp_server.session import ACPSession session._register_skill_commands = ACPSession._register_skill_commands.__get__( session, ACPSession @@ -369,7 +369,7 @@ async def test_skill_executor_loads_instructions_and_injects_into_staged_content Injects into staged_content. """ - from agentpool_server.opencode_server.skill_bridge import create_skill_command + from wolfharness_server.opencode_server.skill_bridge import create_skill_command skill = _make_skill( name="inject-skill", @@ -404,7 +404,7 @@ async def test_skill_executor_with_load_instructions_raising_value_error() -> No Sends 'no instructions' message, no injection. """ - from agentpool_server.opencode_server.skill_bridge import create_skill_command + from wolfharness_server.opencode_server.skill_bridge import create_skill_command # Create a virtual skill (PurePosixPath) with instructions=None # load_instructions() will raise ValueError for virtual skills without pre-set instructions @@ -463,7 +463,7 @@ async def test_injected_prompt_format_uses_correct_xml_tags() -> None: uses + XML tags. """ - from agentpool_server.opencode_server.skill_bridge import create_skill_command + from wolfharness_server.opencode_server.skill_bridge import create_skill_command skill = _make_skill( name="format-skill", diff --git a/tests/agents/acp_agent/test_acp_agent_load_session.py b/tests/agents/acp_agent/test_acp_agent_load_session.py index 8ab523429..56f6c33a2 100644 --- a/tests/agents/acp_agent/test_acp_agent_load_session.py +++ b/tests/agents/acp_agent/test_acp_agent_load_session.py @@ -14,9 +14,9 @@ SessionModeState, UserMessageChunk, ) -from agentpool.agents.acp_agent import ACPAgent -from agentpool.agents.acp_agent.session_state import ACPSessionState -from agentpool.sessions.models import SessionData +from wolfharness.agents.acp_agent import ACPAgent +from wolfharness.agents.acp_agent.session_state import ACPSessionState +from wolfharness.sessions.models import SessionData @pytest.fixture diff --git a/tests/agents/acp_agent/test_acp_converters.py b/tests/agents/acp_agent/test_acp_converters.py index 7384c88fc..b536528fd 100644 --- a/tests/agents/acp_agent/test_acp_converters.py +++ b/tests/agents/acp_agent/test_acp_converters.py @@ -20,7 +20,7 @@ ToolCallStart, UserMessageChunk, ) -from agentpool.agents.acp_agent.acp_converters import ( +from wolfharness.agents.acp_agent.acp_converters import ( ACPMessageAccumulator, acp_notifications_to_messages, ) diff --git a/tests/agents/acp_agent/test_acp_turn_hooks.py b/tests/agents/acp_agent/test_acp_turn_hooks.py index eb9768f84..64aba9f31 100644 --- a/tests/agents/acp_agent/test_acp_turn_hooks.py +++ b/tests/agents/acp_agent/test_acp_turn_hooks.py @@ -19,12 +19,12 @@ ToolCallStart, TurnCompleteUpdate, ) -from agentpool.agents.acp_agent.turn import ACPTurn -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import ( +from wolfharness.agents.acp_agent.turn import ACPTurn +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import ( StreamCompleteEvent, ) -from agentpool.hooks import AgentHooks, CallableHook, HookResult +from wolfharness.hooks import AgentHooks, CallableHook, HookResult # --------------------------------------------------------------------------- diff --git a/tests/agents/acp_agent/test_create_turn.py b/tests/agents/acp_agent/test_create_turn.py index b28af0f41..c37bc1247 100644 --- a/tests/agents/acp_agent/test_create_turn.py +++ b/tests/agents/acp_agent/test_create_turn.py @@ -8,11 +8,11 @@ from acp import InitializeRequest from acp.agent.acp_agent_api import ACPAgentAPI -from agentpool.agents.acp_agent import ACPAgent -from agentpool.agents.acp_agent.client_handler import TimeoutableEvent -from agentpool.agents.acp_agent.session_state import ACPSessionState -from agentpool.agents.acp_agent.turn import ACPClientProtocol, ACPTurn -from agentpool.agents.context import AgentRunContext +from wolfharness.agents.acp_agent import ACPAgent +from wolfharness.agents.acp_agent.client_handler import TimeoutableEvent +from wolfharness.agents.acp_agent.session_state import ACPSessionState +from wolfharness.agents.acp_agent.turn import ACPClientProtocol, ACPTurn +from wolfharness.agents.context import AgentRunContext @pytest.mark.unit diff --git a/tests/agents/acp_agent/test_filter_servers.py b/tests/agents/acp_agent/test_filter_servers.py index d5006f8bd..28485a18c 100644 --- a/tests/agents/acp_agent/test_filter_servers.py +++ b/tests/agents/acp_agent/test_filter_servers.py @@ -7,7 +7,7 @@ from acp.schema import AgentCapabilities from acp.schema.mcp import AcpMcpServer, HttpMcpServer, StdioMcpServer -from agentpool.agents.acp_agent.helpers import filter_servers_by_capabilities +from wolfharness.agents.acp_agent.helpers import filter_servers_by_capabilities pytestmark = pytest.mark.unit diff --git a/tests/agents/acp_agent/test_load_session_manual.py b/tests/agents/acp_agent/test_load_session_manual.py index 7080bebf1..2b616bc4c 100644 --- a/tests/agents/acp_agent/test_load_session_manual.py +++ b/tests/agents/acp_agent/test_load_session_manual.py @@ -3,10 +3,10 @@ Run with: uv run python tests/agents/acp_agent/test_load_session_manual.py This tests the full flow: -1. Client connects to agentpool ACP server (wrapping Claude Code) +1. Client connects to wolfharness ACP server (wrapping Claude Code) 2. Lists sessions from Claude Code 3. Loads a session - server delegates to Claude Code's load_session -4. Claude Code replays notifications -> agentpool forwards -> client receives +4. Claude Code replays notifications -> wolfharness forwards -> client receives 5. Client's conversation.chat_messages gets populated Logs are written to /tmp/load_session_test.log for inspection. @@ -21,7 +21,7 @@ import pytest -from agentpool.agents.acp_agent import ACPAgent +from wolfharness.agents.acp_agent import ACPAgent pytestmark = pytest.mark.unit @@ -37,8 +37,8 @@ logging.StreamHandler(), # Also print to console ], ) -logging.getLogger("agentpool").setLevel(logging.DEBUG) -logging.getLogger("agentpool_server").setLevel(logging.DEBUG) +logging.getLogger("wolfharness").setLevel(logging.DEBUG) +logging.getLogger("wolfharness_server").setLevel(logging.DEBUG) logging.getLogger("acp").setLevel(logging.DEBUG) print(f"Logs will be written to: {LOG_FILE}") @@ -46,13 +46,13 @@ async def main() -> None: """Test load_session flow.""" - # Connect to agentpool ACP server running Claude Code agent + # Connect to wolfharness ACP server running Claude Code agent print("Starting ACPAgent...") async with ACPAgent( command="uv", - args=["run", "agentpool", "serve-acp", "tests/agents/acp_agent/claude_code_config.yml"], + args=["run", "wolfharness", "serve-acp", "tests/agents/acp_agent/claude_code_config.yml"], name="test_client", - cwd="/home/phil65/dev/oss/agentpool", + cwd="/home/phil65/dev/oss/wolfharness", ) as agent: print(f"Connected to ACP server, session_id: {agent._sdk_session_id}") diff --git a/tests/agents/acp_agent/test_step_usage.py b/tests/agents/acp_agent/test_step_usage.py index 5b4f4e41d..a93f800c4 100644 --- a/tests/agents/acp_agent/test_step_usage.py +++ b/tests/agents/acp_agent/test_step_usage.py @@ -24,10 +24,10 @@ ToolCallStart, UsageUpdate, ) -from agentpool.agents.acp_agent.acp_converters import acp_to_native_event -from agentpool.agents.acp_agent.turn import ACPTurn -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import StepUsageEvent +from wolfharness.agents.acp_agent.acp_converters import acp_to_native_event +from wolfharness.agents.acp_agent.turn import ACPTurn +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import StepUsageEvent if TYPE_CHECKING: @@ -168,7 +168,7 @@ def test_mixed_stream_with_step_index_progression() -> None: class _MockACPClient: """Mock ACP client that yields a predetermined sequence of session updates. - Implements the :class:`~agentpool.agents.acp_agent.turn.ACPClientProtocol` + Implements the :class:`~wolfharness.agents.acp_agent.turn.ACPClientProtocol` with a fixed list of ``SessionUpdate`` objects for ``stream_events()`` and an empty list for ``get_messages()``. """ diff --git a/tests/agents/acp_agent/test_turn.py b/tests/agents/acp_agent/test_turn.py index 32e972c4a..b7aeb0d57 100644 --- a/tests/agents/acp_agent/test_turn.py +++ b/tests/agents/acp_agent/test_turn.py @@ -12,9 +12,9 @@ AgentMessageChunk, TextContentBlock, ) -from agentpool.agents.acp_agent.turn import ACPTurn -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import ( +from wolfharness.agents.acp_agent.turn import ACPTurn +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import ( PartDeltaEvent, RunErrorEvent, StreamCompleteEvent, diff --git a/tests/agents/acp_agent/test_turn_integration.py b/tests/agents/acp_agent/test_turn_integration.py index 564570a75..e9c202bf9 100644 --- a/tests/agents/acp_agent/test_turn_integration.py +++ b/tests/agents/acp_agent/test_turn_integration.py @@ -14,17 +14,17 @@ from acp import InitializeRequest from acp.schema import AgentMessageChunk, TextContentBlock -from agentpool.agents.acp_agent import ACPAgent -from agentpool.agents.acp_agent.turn import ACPTurn -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import ( +from wolfharness.agents.acp_agent import ACPAgent +from wolfharness.agents.acp_agent.turn import ACPTurn +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import ( PartDeltaEvent, StreamCompleteEvent, ) -from agentpool.lifecycle import DirectChannel, MemoryJournal -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.run import RunHandle -from agentpool.orchestrator.turn import Turn +from wolfharness.lifecycle import DirectChannel, MemoryJournal +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.run import RunHandle +from wolfharness.orchestrator.turn import Turn if TYPE_CHECKING: diff --git a/tests/agents/events/test_deferred_events.py b/tests/agents/events/test_deferred_events.py index 9ad776ac9..c24d77392 100644 --- a/tests/agents/events/test_deferred_events.py +++ b/tests/agents/events/test_deferred_events.py @@ -7,7 +7,7 @@ import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( RichAgentStreamEvent, SessionResumeEvent, ToolCallDeferredEvent, diff --git a/tests/agents/events/test_event_bus_scopes.py b/tests/agents/events/test_event_bus_scopes.py index 924c42757..051d73c3f 100644 --- a/tests/agents/events/test_event_bus_scopes.py +++ b/tests/agents/events/test_event_bus_scopes.py @@ -12,10 +12,10 @@ import pytest -from agentpool import Agent -from agentpool.agents.context import AgentContext, AgentRunContext -from agentpool.agents.events import RunStartedEvent, StreamEventEmitter -from agentpool.orchestrator.core import EventBus +from wolfharness import Agent +from wolfharness.agents.context import AgentContext, AgentRunContext +from wolfharness.agents.events import RunStartedEvent, StreamEventEmitter +from wolfharness.orchestrator.core import EventBus def _stream_empty(queue: asyncio.Queue[Any]) -> bool: @@ -143,11 +143,11 @@ async def test_descendant_scope_child_does_not_receive_parent() -> None: @pytest.mark.anyio async def test_descendant_scope_with_session_controller() -> None: """Descendant scope works when using a SessionController for hierarchy queries.""" - from agentpool import AgentPool, AgentsManifest, NativeAgentConfig + from wolfharness import AgentPool, AgentsManifest, NativeAgentConfig manifest = AgentsManifest(agents={"agent1": NativeAgentConfig(name="agent1", model="test")}) async with AgentPool(manifest) as pool: - from agentpool.orchestrator.core import SessionController + from wolfharness.orchestrator.core import SessionController controller = SessionController(pool) event_bus = EventBus(max_queue_size=10, session_controller=controller) diff --git a/tests/agents/events/test_file_ops_message_id.py b/tests/agents/events/test_file_ops_message_id.py index 741450182..5d7323953 100644 --- a/tests/agents/events/test_file_ops_message_id.py +++ b/tests/agents/events/test_file_ops_message_id.py @@ -13,10 +13,10 @@ import pytest -from agentpool import Agent -from agentpool.agents.context import AgentContext, AgentRunContext -from agentpool.agents.events import DiffContentItem, StreamEventEmitter -from agentpool.utils.streams import FileOpsTracker +from wolfharness import Agent +from wolfharness.agents.context import AgentContext, AgentRunContext +from wolfharness.agents.events import DiffContentItem, StreamEventEmitter +from wolfharness.utils.streams import FileOpsTracker @pytest.mark.unit diff --git a/tests/agents/events/test_user_message_inserted_event.py b/tests/agents/events/test_user_message_inserted_event.py index e2b0e8894..85e7a5c12 100644 --- a/tests/agents/events/test_user_message_inserted_event.py +++ b/tests/agents/events/test_user_message_inserted_event.py @@ -7,7 +7,7 @@ import pytest -from agentpool.agents.events.events import UserMessageInsertedEvent +from wolfharness.agents.events.events import UserMessageInsertedEvent pytestmark = [pytest.mark.unit] diff --git a/tests/agents/native_agent/test_agent_instructions.py b/tests/agents/native_agent/test_agent_instructions.py index 774b0742b..ad67b1fb6 100644 --- a/tests/agents/native_agent/test_agent_instructions.py +++ b/tests/agents/native_agent/test_agent_instructions.py @@ -7,8 +7,8 @@ from pydantic_ai import Agent as PydanticAgent import pytest -from agentpool.agents.native_agent import Agent -from agentpool.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.agents.native_agent import Agent +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability pytestmark = pytest.mark.unit @@ -175,7 +175,7 @@ def get_instructions(self) -> str | None: async def test_from_config_with_provider_instruction_ref(self): """Test from_config with ProviderInstructionConfig using ref.""" - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig class SimpleRefProvider(FunctionToolsetCapability): def __init__(self) -> None: diff --git a/tests/agents/native_agent/test_approval_bridge.py b/tests/agents/native_agent/test_approval_bridge.py index 726c1d0a1..dbc0a2bb6 100644 --- a/tests/agents/native_agent/test_approval_bridge.py +++ b/tests/agents/native_agent/test_approval_bridge.py @@ -20,9 +20,9 @@ ) import pytest -from agentpool import Agent -from agentpool.agents.context import AgentContext, AgentRunContext -from agentpool.agents.native_agent.approval_bridge import ( +from wolfharness import Agent +from wolfharness.agents.context import AgentContext, AgentRunContext +from wolfharness.agents.native_agent.approval_bridge import ( _map_confirmation_result, _resolve_deferred_approvals, create_approval_bridge_capability, @@ -315,7 +315,7 @@ async def test_get_agentlet_includes_approval_bridge_capability( """get_agentlet() includes the approval bridge capability.""" from pydantic_ai.capabilities import HandleDeferredToolCalls - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet(None, None, None) diff --git a/tests/agents/native_agent/test_capability_chain.py b/tests/agents/native_agent/test_capability_chain.py index 6566736ad..fe374b56b 100644 --- a/tests/agents/native_agent/test_capability_chain.py +++ b/tests/agents/native_agent/test_capability_chain.py @@ -13,7 +13,7 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent +from wolfharness import Agent pytestmark = pytest.mark.unit @@ -41,16 +41,16 @@ async def test_deferred_bridge_before_approval_bridge( # uses local imports. with ( patch( - "agentpool.agents.native_agent.deferred_bridge.create_deferred_bridge_capability", + "wolfharness.agents.native_agent.deferred_bridge.create_deferred_bridge_capability", ) as mock_create_deferred, patch( - "agentpool.agents.native_agent.elicitation_bridge.create_elicitation_bridge_capability", + "wolfharness.agents.native_agent.elicitation_bridge.create_elicitation_bridge_capability", ) as mock_create_elicitation, patch( - "agentpool.agents.native_agent.approval_bridge.create_approval_bridge_capability", + "wolfharness.agents.native_agent.approval_bridge.create_approval_bridge_capability", ) as mock_create_approval, patch( - "agentpool.agents.native_agent.agent.PydanticAgent", + "wolfharness.agents.native_agent.agent.PydanticAgent", ) as mock_pydantic_agent, ): # Create distinguishable mock capabilities @@ -121,13 +121,13 @@ async def test_deferred_bridge_receives_deferred_tools_mapping( with ( patch( - "agentpool.agents.native_agent.deferred_bridge.create_deferred_bridge_capability", + "wolfharness.agents.native_agent.deferred_bridge.create_deferred_bridge_capability", ) as mock_create_deferred, patch( - "agentpool.agents.native_agent.approval_bridge.create_approval_bridge_capability", + "wolfharness.agents.native_agent.approval_bridge.create_approval_bridge_capability", ) as mock_create_approval, patch( - "agentpool.agents.native_agent.agent.PydanticAgent", + "wolfharness.agents.native_agent.agent.PydanticAgent", ) as mock_pydantic_agent, ): deferred_cap = MagicMock(spec=HandleDeferredToolCalls) @@ -176,13 +176,13 @@ async def test_deferred_bridge_empty_when_no_deferred_tools( with ( patch( - "agentpool.agents.native_agent.deferred_bridge.create_deferred_bridge_capability", + "wolfharness.agents.native_agent.deferred_bridge.create_deferred_bridge_capability", ) as mock_create_deferred, patch( - "agentpool.agents.native_agent.approval_bridge.create_approval_bridge_capability", + "wolfharness.agents.native_agent.approval_bridge.create_approval_bridge_capability", ) as mock_create_approval, patch( - "agentpool.agents.native_agent.agent.PydanticAgent", + "wolfharness.agents.native_agent.agent.PydanticAgent", ) as mock_pydantic_agent, ): deferred_cap = MagicMock(spec=HandleDeferredToolCalls) @@ -215,13 +215,13 @@ async def test_deferred_bridge_handles_get_tools_failure( with ( patch( - "agentpool.agents.native_agent.deferred_bridge.create_deferred_bridge_capability", + "wolfharness.agents.native_agent.deferred_bridge.create_deferred_bridge_capability", ) as mock_create_deferred, patch( - "agentpool.agents.native_agent.approval_bridge.create_approval_bridge_capability", + "wolfharness.agents.native_agent.approval_bridge.create_approval_bridge_capability", ) as mock_create_approval, patch( - "agentpool.agents.native_agent.agent.PydanticAgent", + "wolfharness.agents.native_agent.agent.PydanticAgent", ) as mock_pydantic_agent, ): deferred_cap = MagicMock(spec=HandleDeferredToolCalls) diff --git a/tests/agents/native_agent/test_checkpoint.py b/tests/agents/native_agent/test_checkpoint.py index 7a81442f4..b9a4b5266 100644 --- a/tests/agents/native_agent/test_checkpoint.py +++ b/tests/agents/native_agent/test_checkpoint.py @@ -20,20 +20,20 @@ ) import pytest -from agentpool.agents.native_agent.checkpoint import ( +from wolfharness.agents.native_agent.checkpoint import ( CheckpointData, CheckpointManager, MidStreamCheckpointError, ) -from agentpool.sessions.models import PendingDeferredCall -from agentpool.storage.manager import StorageManager +from wolfharness.sessions.models import PendingDeferredCall +from wolfharness.storage.manager import StorageManager pytestmark = pytest.mark.unit if TYPE_CHECKING: - from agentpool.agents.events.events import ToolCallDeferredEvent + from wolfharness.agents.events.events import ToolCallDeferredEvent class TestCheckpointData: @@ -68,7 +68,7 @@ def test_create_with_data(self) -> None: @pytest.fixture def storage_manager() -> StorageManager: """Create a StorageManager with no providers (for unit testing).""" - from agentpool_config.storage import StorageConfig + from wolfharness_config.storage import StorageConfig config = StorageConfig(providers=[]) return StorageManager(config=config) @@ -443,7 +443,7 @@ def test_serialize_messages_roundtrip( json_str = CheckpointManager._serialize_messages(sample_messages) assert json_str is not None - from agentpool.storage.serialization import deserialize_messages + from wolfharness.storage.serialization import deserialize_messages restored = deserialize_messages(json_str) assert len(restored) == len(sample_messages) @@ -612,7 +612,7 @@ async def test_success_logs_saved( @pytest.mark.anyio async def test_storage_manager_returns_success_flag(self) -> None: """StorageManager.save_checkpoint() returns True when any provider succeeds.""" - from agentpool_config.storage import StorageConfig + from wolfharness_config.storage import StorageConfig config = StorageConfig(providers=[]) mgr = StorageManager(config=config) @@ -628,7 +628,7 @@ async def test_storage_manager_returns_success_flag(self) -> None: @pytest.mark.anyio async def test_storage_manager_returns_failure_flag(self) -> None: """StorageManager.save_checkpoint() returns False when all providers fail.""" - from agentpool_config.storage import StorageConfig + from wolfharness_config.storage import StorageConfig config = StorageConfig(providers=[]) mgr = StorageManager(config=config) @@ -644,7 +644,7 @@ async def test_storage_manager_returns_failure_flag(self) -> None: @pytest.mark.anyio async def test_storage_manager_returns_false_no_providers(self) -> None: """StorageManager.save_checkpoint() returns False when no providers configured.""" - from agentpool_config.storage import StorageConfig + from wolfharness_config.storage import StorageConfig config = StorageConfig(providers=[]) mgr = StorageManager(config=config) diff --git a/tests/agents/native_agent/test_confirmation.py b/tests/agents/native_agent/test_confirmation.py index 18a8b4bcd..b35132d47 100644 --- a/tests/agents/native_agent/test_confirmation.py +++ b/tests/agents/native_agent/test_confirmation.py @@ -20,9 +20,9 @@ from pydantic_graph import End import pytest -from agentpool import Agent -from agentpool.agents.context import AgentContext -from agentpool.tools.base import Tool +from wolfharness import Agent +from wolfharness.agents.context import AgentContext +from wolfharness.tools.base import Tool # ============================================================================ @@ -388,7 +388,7 @@ async def test_multiple_confirmation_tools_same_run( mock_agent._builtin_provider.register_tool(confirmation_tool_1) mock_agent._builtin_provider.register_tool(confirmation_tool_2) - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: def side_effect(**kwargs: Any) -> MagicMock: capabilities = kwargs.get("capabilities", []) or [] @@ -417,7 +417,7 @@ async def test_mixed_approval_denial_same_run( mock_agent._builtin_provider.register_tool(confirmation_tool_1) mock_agent._builtin_provider.register_tool(confirmation_tool_2) - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: def side_effect(**kwargs: Any) -> MagicMock: capabilities = kwargs.get("capabilities", []) or [] @@ -448,7 +448,7 @@ async def test_never_mode_auto_approves_all_tools( mock_agent._builtin_provider.register_tool(confirmation_tool_1) mock_agent._builtin_provider.register_tool(confirmation_tool_2) - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: def side_effect(**kwargs: Any) -> MagicMock: capabilities = kwargs.get("capabilities", []) or [] @@ -474,7 +474,7 @@ async def test_abort_run_stops_subsequent_confirmations( mock_agent._builtin_provider.register_tool(confirmation_tool_1) mock_agent._builtin_provider.register_tool(confirmation_tool_2) - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: def side_effect(**kwargs: Any) -> MagicMock: capabilities = kwargs.get("capabilities", []) or [] diff --git a/tests/agents/native_agent/test_deferred_bridge.py b/tests/agents/native_agent/test_deferred_bridge.py index 542bc2863..037279806 100644 --- a/tests/agents/native_agent/test_deferred_bridge.py +++ b/tests/agents/native_agent/test_deferred_bridge.py @@ -19,8 +19,8 @@ ) import pytest -from agentpool.agents.context import AgentContext, AgentRunContext -from agentpool.agents.events.events import ToolCallDeferredEvent +from wolfharness.agents.context import AgentContext, AgentRunContext +from wolfharness.agents.events.events import ToolCallDeferredEvent pytestmark = pytest.mark.unit @@ -103,7 +103,7 @@ class TestCreateDeferredBridgeCapability: def test_returns_handle_deferred_tool_calls(self) -> None: """Factory returns a HandleDeferredToolCalls capability.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -112,7 +112,7 @@ def test_returns_handle_deferred_tool_calls(self) -> None: def test_handler_is_callable(self) -> None: """Handler function is properly set on the capability.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -126,7 +126,7 @@ async def test_empty_deferred_tools_returns_none( block_tool_call: ToolCallPart, ) -> None: """When deferred_tools is empty, all calls pass through (return None).""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -153,7 +153,7 @@ async def test_block_tool_emits_deferred_event( block_tool_call: ToolCallPart, ) -> None: """Block-strategy tool emits ToolCallDeferredEvent.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -163,7 +163,7 @@ async def test_block_tool_emits_deferred_event( # We need to check that the event is emitted via the event_bus. # Patch the _emit_deferred_event to verify it's called correctly. with patch( - "agentpool.agents.native_agent.deferred_bridge._emit_deferred_event", + "wolfharness.agents.native_agent.deferred_bridge._emit_deferred_event", new_callable=AsyncMock, ) as mock_emit: await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -188,7 +188,7 @@ async def test_block_tool_excluded_from_results( block_tool_call: ToolCallPart, ) -> None: """Block-strategy tool is EXCLUDED from returned DeferredToolResults.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -196,7 +196,7 @@ async def test_block_tool_excluded_from_results( cap = create_deferred_bridge_capability(deferred_tools=deferred_tools) with patch( - "agentpool.agents.native_agent.deferred_bridge._emit_deferred_event", + "wolfharness.agents.native_agent.deferred_bridge._emit_deferred_event", new_callable=AsyncMock, ): result = await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -216,7 +216,7 @@ async def test_block_tool_remaining_in_requests( block_tool_call: ToolCallPart, ) -> None: """After results applied, block tool remains in remaining requests.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -224,7 +224,7 @@ async def test_block_tool_remaining_in_requests( cap = create_deferred_bridge_capability(deferred_tools=deferred_tools) with patch( - "agentpool.agents.native_agent.deferred_bridge._emit_deferred_event", + "wolfharness.agents.native_agent.deferred_bridge._emit_deferred_event", new_callable=AsyncMock, ): result = await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -243,7 +243,7 @@ async def test_multiple_block_tools_all_excluded( deferred_tools: dict[str, str], ) -> None: """All block-strategy tools are excluded from results.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -255,7 +255,7 @@ async def test_multiple_block_tools_all_excluded( cap = create_deferred_bridge_capability(deferred_tools=deferred_tools) with patch( - "agentpool.agents.native_agent.deferred_bridge._emit_deferred_event", + "wolfharness.agents.native_agent.deferred_bridge._emit_deferred_event", new_callable=AsyncMock, ) as mock_emit: result = await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -285,7 +285,7 @@ async def test_continue_tool_resolved_with_placeholder( continue_tool_call: ToolCallPart, ) -> None: """Continue-strategy tool is resolved with a ToolReturn placeholder.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -308,7 +308,7 @@ async def test_continue_tool_not_remaining( continue_tool_call: ToolCallPart, ) -> None: """Continue-strategy tool is fully resolved — no remaining requests.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -329,7 +329,7 @@ async def test_continue_tool_does_not_emit_deferred_event( continue_tool_call: ToolCallPart, ) -> None: """Continue-strategy tools do NOT emit ToolCallDeferredEvent.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -337,7 +337,7 @@ async def test_continue_tool_does_not_emit_deferred_event( cap = create_deferred_bridge_capability(deferred_tools=deferred_tools) with patch( - "agentpool.agents.native_agent.deferred_bridge._emit_deferred_event", + "wolfharness.agents.native_agent.deferred_bridge._emit_deferred_event", new_callable=AsyncMock, ) as mock_emit: await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -362,7 +362,7 @@ async def test_mixed_block_and_continue( continue_tool_call: ToolCallPart, ) -> None: """Block excluded, continue resolved with placeholder.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -370,7 +370,7 @@ async def test_mixed_block_and_continue( cap = create_deferred_bridge_capability(deferred_tools=deferred_tools) with patch( - "agentpool.agents.native_agent.deferred_bridge._emit_deferred_event", + "wolfharness.agents.native_agent.deferred_bridge._emit_deferred_event", new_callable=AsyncMock, ) as mock_emit: result = await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -403,7 +403,7 @@ async def test_mixed_deferred_and_non_deferred( non_deferred_tool_call: ToolCallPart, ) -> None: """Non-deferred tools excluded from results → pass through to next capability.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -411,7 +411,7 @@ async def test_mixed_deferred_and_non_deferred( cap = create_deferred_bridge_capability(deferred_tools=deferred_tools) with patch( - "agentpool.agents.native_agent.deferred_bridge._emit_deferred_event", + "wolfharness.agents.native_agent.deferred_bridge._emit_deferred_event", new_callable=AsyncMock, ): result = await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -445,7 +445,7 @@ async def test_non_deferred_tool_returns_none( non_deferred_tool_call: ToolCallPart, ) -> None: """Non-deferred tools cause the bridge to return None.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -462,7 +462,7 @@ async def test_empty_requests_returns_none( deferred_tools: dict[str, str], ) -> None: """Empty requests return None.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -480,7 +480,7 @@ async def test_only_approvals_no_deferred_tools_returns_none( non_deferred_tool_call: ToolCallPart, ) -> None: """Approval-only requests (not in deferred_tools) return None.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -509,7 +509,7 @@ async def test_unapproved_block_tool_in_approvals_passes_through( run_ctx: RunContext[Any], ) -> None: """Deferred unapproved tool with block strategy in approvals → pass through.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -526,7 +526,7 @@ async def test_unapproved_block_tool_in_approvals_passes_through( # Approvals are NOT handled by deferred bridge — pass through to approval_bridge with patch( - "agentpool.agents.native_agent.deferred_bridge._emit_deferred_event", + "wolfharness.agents.native_agent.deferred_bridge._emit_deferred_event", new_callable=AsyncMock, ) as mock_emit: result = await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -541,7 +541,7 @@ async def test_continue_unapproved_tool_in_approvals_passes_through( run_ctx: RunContext[Any], ) -> None: """Deferred unapproved tool with continue strategy in approvals → pass through.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( create_deferred_bridge_capability, ) @@ -576,7 +576,7 @@ async def test_emit_uses_event_bus_when_available( block_tool_call: ToolCallPart, ) -> None: """Event is published via event_bus when available.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( _emit_deferred_event, ) @@ -602,7 +602,7 @@ async def test_emit_graceful_when_no_event_bus( run_ctx: RunContext[Any], ) -> None: """No crash when event_bus is unavailable.""" - from agentpool.agents.native_agent.deferred_bridge import ( + from wolfharness.agents.native_agent.deferred_bridge import ( _emit_deferred_event, ) diff --git a/tests/agents/native_agent/test_deferred_wrap_tool.py b/tests/agents/native_agent/test_deferred_wrap_tool.py index 7225e84ae..f918ee7b4 100644 --- a/tests/agents/native_agent/test_deferred_wrap_tool.py +++ b/tests/agents/native_agent/test_deferred_wrap_tool.py @@ -14,8 +14,8 @@ from pydantic_ai.tools import RunContext import pytest -from agentpool.agents.context import AgentContext, AgentRunContext -from agentpool.tools import ApprovalRequired, CallDeferred, Tool +from wolfharness.agents.context import AgentContext, AgentRunContext +from wolfharness.tools import ApprovalRequired, CallDeferred, Tool if TYPE_CHECKING: @@ -88,7 +88,7 @@ def _create_deferred_tool( @pytest.mark.unit async def test_non_deferred_tool_normal_return(agent_ctx: AgentContext) -> None: """deferred=False tool returns normally — identical to current behavior.""" - from agentpool.agents.native_agent.tool_wrapping import wrap_tool + from wolfharness.agents.native_agent.tool_wrapping import wrap_tool def normal_tool(text: str) -> str: return f"result: {text}" @@ -105,7 +105,7 @@ async def test_non_deferred_tool_with_context( agent_ctx: AgentContext, run_ctx: RunContext[Any] ) -> None: """deferred=False tool with RunContext returns normally.""" - from agentpool.agents.native_agent.tool_wrapping import wrap_tool + from wolfharness.agents.native_agent.tool_wrapping import wrap_tool def ctx_tool(ctx: RunContext[Any], text: str) -> str: assert ctx.deps is not None @@ -121,8 +121,8 @@ def ctx_tool(ctx: RunContext[Any], text: str) -> str: @pytest.mark.unit async def test_non_deferred_tool_tool_result_conversion(agent_ctx: AgentContext) -> None: """deferred=False tool that returns ToolResult converts to ToolReturn.""" - from agentpool.agents.native_agent.tool_wrapping import wrap_tool - from agentpool.tools.base import ToolResult + from wolfharness.agents.native_agent.tool_wrapping import wrap_tool + from wolfharness.tools.base import ToolResult def result_tool(text: str) -> ToolResult: return ToolResult(content=f"content: {text}", metadata={"key": "val"}) @@ -146,7 +146,7 @@ async def test_deferred_tool_catches_call_deferred_on_resume( agent_ctx: AgentContext, ) -> None: """Tool body raises CallDeferred → wrap_tool() catches and routes to bridge.""" - from agentpool.agents.native_agent import tool_wrapping as tw_mod + from wolfharness.agents.native_agent import tool_wrapping as tw_mod def deferred_body(text: str) -> str: raise CallDeferred(metadata={"call_id": "tc-1"}) @@ -173,7 +173,7 @@ async def test_deferred_tool_catches_call_deferred_with_context( run_ctx: RunContext[Any], ) -> None: """Tool body with RunContext raises CallDeferred → caught properly.""" - from agentpool.agents.native_agent import tool_wrapping as tw_mod + from wolfharness.agents.native_agent import tool_wrapping as tw_mod def deferred_ctx_body(ctx: RunContext[Any], text: str) -> str: raise CallDeferred(metadata={"from": "ctx_tool"}) @@ -196,7 +196,7 @@ async def test_deferred_tool_catches_approval_required_on_resume( agent_ctx: AgentContext, ) -> None: """Tool body raises ApprovalRequired → wrap_tool() catches and routes to bridge.""" - from agentpool.agents.native_agent import tool_wrapping as tw_mod + from wolfharness.agents.native_agent import tool_wrapping as tw_mod def approval_body(text: str) -> str: raise ApprovalRequired(metadata={"needs": "human"}) @@ -226,7 +226,7 @@ async def test_deferred_tool_normal_return_on_resume_passes_through( agent_ctx: AgentContext, ) -> None: """Tool body returns normally on resume — no deferred lifecycle triggered.""" - from agentpool.agents.native_agent.tool_wrapping import wrap_tool + from wolfharness.agents.native_agent.tool_wrapping import wrap_tool def normal_body(text: str) -> str: return f"done: {text}" @@ -243,8 +243,8 @@ async def test_deferred_tool_normal_return_with_tool_result_passes_through( agent_ctx: AgentContext, ) -> None: """Tool body returns ToolResult on resume — converts to ToolReturn normally.""" - from agentpool.agents.native_agent.tool_wrapping import wrap_tool - from agentpool.tools.base import ToolResult + from wolfharness.agents.native_agent.tool_wrapping import wrap_tool + from wolfharness.tools.base import ToolResult def result_body(text: str) -> ToolResult: return ToolResult(content=f"content: {text}") @@ -267,7 +267,7 @@ async def test_handle_deferred_exception_re_raises_call_deferred( agent_ctx: AgentContext, ) -> None: """_handle_deferred_exception re-raises CallDeferred (bridge not yet integrated).""" - from agentpool.agents.native_agent.tool_wrapping import _handle_deferred_exception + from wolfharness.agents.native_agent.tool_wrapping import _handle_deferred_exception exc = CallDeferred(metadata={"key": "value"}) tool = _create_deferred_tool(lambda: "unused", deferred=True) @@ -283,7 +283,7 @@ async def test_handle_deferred_exception_re_raises_approval_required( agent_ctx: AgentContext, ) -> None: """_handle_deferred_exception re-raises ApprovalRequired (bridge not yet integrated).""" - from agentpool.agents.native_agent.tool_wrapping import _handle_deferred_exception + from wolfharness.agents.native_agent.tool_wrapping import _handle_deferred_exception exc = ApprovalRequired(metadata={"reason": "confirm"}) tool = _create_deferred_tool( @@ -304,7 +304,7 @@ async def test_non_deferred_tool_does_not_catch_call_deferred( agent_ctx: AgentContext, ) -> None: """deferred=False tool: CallDeferred propagates as normal exception.""" - from agentpool.agents.native_agent.tool_wrapping import wrap_tool + from wolfharness.agents.native_agent.tool_wrapping import wrap_tool def raises_deferred(text: str) -> str: raise CallDeferred(metadata={"bad": "not deferred"}) @@ -321,7 +321,7 @@ async def test_non_deferred_tool_does_not_catch_approval_required( agent_ctx: AgentContext, ) -> None: """deferred=False tool: ApprovalRequired propagates as normal exception.""" - from agentpool.agents.native_agent.tool_wrapping import wrap_tool + from wolfharness.agents.native_agent.tool_wrapping import wrap_tool def raises_approval(text: str) -> str: raise ApprovalRequired(metadata={"bad": "not deferred"}) @@ -343,7 +343,7 @@ async def test_deferred_no_context_function_catches_call_deferred( agent_ctx: AgentContext, ) -> None: """Tool without RunContext/AgentContext raising CallDeferred → caught.""" - from agentpool.agents.native_agent import tool_wrapping as tw_mod + from wolfharness.agents.native_agent import tool_wrapping as tw_mod def no_ctx_body(text: str) -> str: raise CallDeferred(metadata={"no_context": True}) diff --git a/tests/agents/native_agent/test_get_agentlet_capabilities.py b/tests/agents/native_agent/test_get_agentlet_capabilities.py index d92a940d1..d887e974e 100644 --- a/tests/agents/native_agent/test_get_agentlet_capabilities.py +++ b/tests/agents/native_agent/test_get_agentlet_capabilities.py @@ -13,9 +13,9 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.context import AgentRunContext -from agentpool.orchestrator.core import EventBus +from wolfharness import Agent +from wolfharness.agents.context import AgentRunContext +from wolfharness.orchestrator.core import EventBus pytestmark = pytest.mark.unit @@ -111,7 +111,7 @@ async def test_get_agentlet_collects_tool_provider_capabilities( mock_provider_no_capability, ] - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet(None, None, None) @@ -137,9 +137,9 @@ async def test_get_agentlet_creates_hooks_capability( hooks_cap = MagicMock() with ( - patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, + patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, patch( - "agentpool.agents.native_agent.tool_intercept.ToolInterceptCapability", + "wolfharness.agents.native_agent.tool_intercept.ToolInterceptCapability", return_value=hooks_cap, ) as mock_ti_class, ): @@ -177,9 +177,9 @@ async def test_get_agentlet_uses_hook_manager_capability_directly( run_ctx = AgentRunContext(session_id="test-session", event_bus=event_bus) with ( - patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, + patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, patch( - "agentpool.agents.native_agent.tool_intercept.ToolInterceptCapability", + "wolfharness.agents.native_agent.tool_intercept.ToolInterceptCapability", return_value=hooks_cap, ) as mock_ti_class, ): @@ -210,7 +210,7 @@ async def test_get_agentlet_collects_mcp_capabilities( """MCP capabilities collected from mcp.get_capabilities().""" mock_agent.mcp = mock_mcp_manager - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet(None, None, None) @@ -245,7 +245,7 @@ async def test_get_agentlet_wraps_history_processors( "_resolve_history_processors", return_value=[mock_history_processor], ), - patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, + patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, ): mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet(None, None, None) @@ -275,7 +275,7 @@ async def test_get_agentlet_wraps_builtin_tools( builtin_tool_2 = MagicMock() mock_agent._builtin_tools = [builtin_tool_1, builtin_tool_2] - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet(None, None, None) @@ -316,9 +316,9 @@ async def test_get_agentlet_passes_capabilities_to_pydantic_agent( "_resolve_history_processors", return_value=[mock_history_processor], ), - patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, + patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, patch( - "agentpool.agents.native_agent.tool_intercept.ToolInterceptCapability", + "wolfharness.agents.native_agent.tool_intercept.ToolInterceptCapability", return_value=hooks_cap, ), ): @@ -360,7 +360,7 @@ async def test_get_agentlet_collects_instructions( "to_pydantic_ai_instructions", new=AsyncMock(return_value=[system_instruction]), ), - patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, + patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, ): mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet(None, None, None) @@ -391,7 +391,7 @@ async def test_get_agentlet_no_duplicate_history_resolution( "_resolve_history_processors", return_value=[], ) as mock_resolve, - patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, + patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, ): mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet(None, None, None) @@ -409,7 +409,7 @@ async def test_get_agentlet_no_wrap_tool_usage( mock_agent: Agent[Any], ) -> None: """No manual tool wrapping via wrap_tool.""" - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() # Also patch wrap_tool if it were imported - but it's not @@ -445,7 +445,7 @@ async def test_get_agentlet_default_providers_contribute_capabilities( "_resolve_history_processors", return_value=[], ), - patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, + patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, ): mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet(None, None, None) @@ -482,7 +482,7 @@ async def test_get_agentlet_handles_failing_provider_instructions( "to_pydantic_ai_instructions", new=AsyncMock(return_value=["system prompt"]), ), - patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, + patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, ): mock_pydantic_agent.return_value = MagicMock() # Should not raise despite provider failing @@ -514,7 +514,7 @@ async def test_get_agentlet_resolves_string_model( "_resolve_model_string", return_value=(mock_model, None), ), - patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, + patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent, ): mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet("custom:model", None, None) @@ -537,7 +537,7 @@ async def test_python_api_capability_passthrough(mock_agent: Agent[Any]) -> None mock_agent.config = MagicMock() mock_agent.config.capabilities = [cap] - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet(None, None, None) @@ -554,7 +554,7 @@ async def test_python_api_capability_passthrough(mock_agent: Agent[Any]) -> None @pytest.mark.anyio async def test_yaml_config_capability_passthrough(mock_agent: Agent[Any]) -> None: """YAML-loaded GenericCapabilityConfig is built and included in capabilities.""" - from agentpool_config.capabilities import GenericCapabilityConfig + from wolfharness_config.capabilities import GenericCapabilityConfig cap_config = GenericCapabilityConfig( type="pydantic_ai.capabilities.Instrumentation", @@ -563,7 +563,7 @@ async def test_yaml_config_capability_passthrough(mock_agent: Agent[Any]) -> Non mock_agent.config = MagicMock() mock_agent.config.capabilities = [cap_config] - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet(None, None, None) @@ -587,7 +587,7 @@ async def test_user_capability_takes_precedence(mock_agent: Agent[Any]) -> None: mock_agent.config = MagicMock() mock_agent.config.capabilities = [user_cap] - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet(None, None, None) @@ -604,7 +604,7 @@ async def test_user_capability_takes_precedence(mock_agent: Agent[Any]) -> None: @pytest.mark.anyio async def test_capability_config_build_called(mock_agent: Agent[Any]) -> None: """GenericCapabilityConfig.build() is called during get_agentlet().""" - from agentpool_config.capabilities import GenericCapabilityConfig + from wolfharness_config.capabilities import GenericCapabilityConfig cap_config = GenericCapabilityConfig( type="pydantic_ai.capabilities.Instrumentation", @@ -615,7 +615,7 @@ async def test_capability_config_build_called(mock_agent: Agent[Any]) -> None: with patch.object(GenericCapabilityConfig, "build") as mock_build: mock_build.return_value = MagicMock() - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() await mock_agent.get_agentlet(None, None, None) @@ -642,9 +642,9 @@ async def test_from_config_capabilities_not_duplicated() -> None: """ from pydantic_ai.capabilities import Instrumentation - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.model_configs import TestModelConfig - from agentpool_config.capabilities import GenericCapabilityConfig + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.model_configs import TestModelConfig + from wolfharness_config.capabilities import GenericCapabilityConfig cap_config = GenericCapabilityConfig( type="pydantic_ai.capabilities.Instrumentation", @@ -659,7 +659,7 @@ async def test_from_config_capabilities_not_duplicated() -> None: agent = Agent.from_config(config) - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() await agent.get_agentlet(None, None, None) @@ -693,9 +693,9 @@ async def test_config_capabilities_visible_before_get_agentlet() -> None: """ from pydantic_ai.capabilities import Instrumentation - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.model_configs import TestModelConfig - from agentpool_config.capabilities import GenericCapabilityConfig + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.model_configs import TestModelConfig + from wolfharness_config.capabilities import GenericCapabilityConfig cap_config = GenericCapabilityConfig( type="pydantic_ai.capabilities.Instrumentation", @@ -732,9 +732,9 @@ async def test_no_duplicate_external_capabilities_after_get_agentlet() -> None: """ from pydantic_ai.capabilities import Instrumentation - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.model_configs import TestModelConfig - from agentpool_config.capabilities import GenericCapabilityConfig + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.model_configs import TestModelConfig + from wolfharness_config.capabilities import GenericCapabilityConfig cap_config = GenericCapabilityConfig( type="pydantic_ai.capabilities.Instrumentation", @@ -756,7 +756,7 @@ async def test_no_duplicate_external_capabilities_after_get_agentlet() -> None: f"found {count_before}." ) - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() await agent.get_agentlet(None, None, None) @@ -779,9 +779,9 @@ async def test_no_external_capability_growth_across_multiple_get_agentlet_calls( """ from pydantic_ai.capabilities import Instrumentation - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.model_configs import TestModelConfig - from agentpool_config.capabilities import GenericCapabilityConfig + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.model_configs import TestModelConfig + from wolfharness_config.capabilities import GenericCapabilityConfig cap_config = GenericCapabilityConfig( type="pydantic_ai.capabilities.Instrumentation", @@ -796,7 +796,7 @@ async def test_no_external_capability_growth_across_multiple_get_agentlet_calls( agent = Agent.from_config(config) - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() # Call get_agentlet() three times (simulating three turns) @@ -816,12 +816,12 @@ async def test_no_external_capability_growth_across_multiple_get_agentlet_calls( # Also verify the overall _external_capabilities list didn't grow # (it should contain the config capability + any session/worker providers) # The key invariant: len after N calls == len after 1 call - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() await agent.get_agentlet(None, None, None) len_after_4th = len(agent._external_capabilities) - with patch("agentpool.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: + with patch("wolfharness.agents.native_agent.agent.PydanticAgent") as mock_pydantic_agent: mock_pydantic_agent.return_value = MagicMock() await agent.get_agentlet(None, None, None) len_after_5th = len(agent._external_capabilities) diff --git a/tests/agents/native_agent/test_inject_prompt_cross_task.py b/tests/agents/native_agent/test_inject_prompt_cross_task.py index f4071626c..9ba1bcfd4 100644 --- a/tests/agents/native_agent/test_inject_prompt_cross_task.py +++ b/tests/agents/native_agent/test_inject_prompt_cross_task.py @@ -18,14 +18,14 @@ from pydantic_ai.models.test import TestModel, TestStreamedResponse import pytest -from agentpool import Agent -from agentpool.agents.base_agent import _current_run_ctx_var -from agentpool.agents.events import StreamCompleteEvent -from agentpool.orchestrator.core import SessionState +from wolfharness import Agent +from wolfharness.agents.base_agent import _current_run_ctx_var +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.orchestrator.core import SessionState if TYPE_CHECKING: - from agentpool.agents.context import AgentRunContext + from wolfharness.agents.context import AgentRunContext # --------------------------------------------------------------------------- @@ -107,7 +107,7 @@ def _mock_session_pool(agent: Agent, run_ctx: AgentRunContext) -> None: """Mock agent_pool.session_pool so get_active_run_context() returns run_ctx.""" from unittest.mock import AsyncMock - from agentpool.orchestrator.run import RunHandle + from wolfharness.orchestrator.run import RunHandle session_state = SessionState(session_id="test-session", agent_name="test") session_state.current_run_id = run_ctx.run_id @@ -388,7 +388,7 @@ async def test_hook_manager_consumes_cross_task_injection_with_session_pool( when SessionPool fallback is available. """ - from agentpool.agents.native_agent.hook_manager import NativeAgentHookManager + from wolfharness.agents.native_agent.hook_manager import NativeAgentHookManager stream_started = asyncio.Event() captured_run_ctx: list[AgentRunContext] = [] diff --git a/tests/agents/native_agent/test_instructions_format.py b/tests/agents/native_agent/test_instructions_format.py index 3fc6d51a9..ecf3a9590 100644 --- a/tests/agents/native_agent/test_instructions_format.py +++ b/tests/agents/native_agent/test_instructions_format.py @@ -12,15 +12,15 @@ from pydantic_ai import Agent as PydanticAgent, RunContext import pytest -from agentpool.agents.context import AgentContext -from agentpool.agents.native_agent import Agent -from agentpool.agents.sys_prompts import SystemPrompts -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.prompts.instructions import ( +from wolfharness.agents.context import AgentContext +from wolfharness.agents.native_agent import Agent +from wolfharness.agents.sys_prompts import SystemPrompts +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.prompts.instructions import ( InstructionFunc, PydanticAIInstruction, ) -from agentpool.utils.context_wrapping import wrap_instruction +from wolfharness.utils.context_wrapping import wrap_instruction pytestmark = pytest.mark.unit diff --git a/tests/agents/native_agent/test_interrupt.py b/tests/agents/native_agent/test_interrupt.py index 1595f331c..beaaa4f41 100644 --- a/tests/agents/native_agent/test_interrupt.py +++ b/tests/agents/native_agent/test_interrupt.py @@ -25,9 +25,9 @@ from pydantic_ai.models.test import TestModel, TestStreamedResponse import pytest -from agentpool import Agent -from agentpool.agents.events import StreamCompleteEvent -from agentpool.orchestrator.core import SessionState +from wolfharness import Agent +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.orchestrator.core import SessionState if TYPE_CHECKING: @@ -107,7 +107,7 @@ async def fast_agent() -> Agent[None]: def _mock_session_pool(agent: Agent, run_ctx: Any) -> None: """Mock agent_pool.session_pool so _get_session_run_ctx() returns run_ctx.""" - from agentpool.orchestrator.run import RunHandle + from wolfharness.orchestrator.run import RunHandle session_state = SessionState(session_id="test-session", agent_name="test") session_state.current_run_id = run_ctx.run_id @@ -153,7 +153,7 @@ async def test_interrupt_without_run_ctx_sets_cancelled_flag(slow_agent: Agent[N After removing _active_run_ctx, cross-task access requires SessionPool fallback. """ - from agentpool.agents.base_agent import _current_run_ctx_var + from wolfharness.agents.base_agent import _current_run_ctx_var stream_started = asyncio.Event() captured_run_ctx: list[Any] = [] @@ -208,7 +208,7 @@ async def test_interrupt_without_run_ctx_cancels_stream_task(slow_agent: Agent[N The stream loop checks run_ctx.cancelled and breaks, so the task completes normally (not via CancelledError). """ - from agentpool.agents.base_agent import _current_run_ctx_var + from wolfharness.agents.base_agent import _current_run_ctx_var stream_started = asyncio.Event() captured_run_ctx: list[Any] = [] @@ -268,7 +268,7 @@ async def test_interrupt_with_run_ctx_still_works(fast_agent: Agent[None]) -> No The fix must not break the existing code path where run_ctx is provided. """ - from agentpool.agents.base_agent import _current_run_ctx_var + from wolfharness.agents.base_agent import _current_run_ctx_var stream_started = asyncio.Event() captured_run_ctx = None @@ -312,7 +312,7 @@ async def test_interrupt_cancels_iteration_task(slow_agent: Agent[None]) -> None After the fix: iteration_task is stored as self._iteration_task and directly cancelled by _interrupt(). """ - from agentpool.agents.base_agent import _current_run_ctx_var + from wolfharness.agents.base_agent import _current_run_ctx_var stream_started = asyncio.Event() interrupt_done = asyncio.Event() @@ -424,7 +424,7 @@ async def test_opencode_abort_flow_stops_agent(slow_agent: Agent[None]) -> None: Cross-task access requires SessionPool fallback (since _active_run_ctx was removed). """ - from agentpool.agents.base_agent import _current_run_ctx_var + from wolfharness.agents.base_agent import _current_run_ctx_var stream_started = asyncio.Event() events_received: list[Any] = [] diff --git a/tests/agents/native_agent/test_native_turn_hooks.py b/tests/agents/native_agent/test_native_turn_hooks.py index 9e2814faa..bd2045b1d 100644 --- a/tests/agents/native_agent/test_native_turn_hooks.py +++ b/tests/agents/native_agent/test_native_turn_hooks.py @@ -11,11 +11,11 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events.events import StreamCompleteEvent -from agentpool.agents.native_agent.turn import NativeTurn -from agentpool.hooks import AgentHooks, CallableHook, HookResult +from wolfharness import Agent +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events.events import StreamCompleteEvent +from wolfharness.agents.native_agent.turn import NativeTurn +from wolfharness.hooks import AgentHooks, CallableHook, HookResult # --------------------------------------------------------------------------- diff --git a/tests/agents/native_agent/test_process_history_capability.py b/tests/agents/native_agent/test_process_history_capability.py index 0ff836eee..cd130fe9b 100644 --- a/tests/agents/native_agent/test_process_history_capability.py +++ b/tests/agents/native_agent/test_process_history_capability.py @@ -11,7 +11,7 @@ from pydantic_ai.tools import RunContext import pytest -from agentpool.agents.native_agent.process_history_capability import ( +from wolfharness.agents.native_agent.process_history_capability import ( ProcessHistoryAdapter, _is_run_context_annotation, ) diff --git a/tests/agents/native_agent/test_step_error_metadata.py b/tests/agents/native_agent/test_step_error_metadata.py index 09b42cd8d..b22d5ba1b 100644 --- a/tests/agents/native_agent/test_step_error_metadata.py +++ b/tests/agents/native_agent/test_step_error_metadata.py @@ -4,7 +4,7 @@ import pytest -from agentpool.agents.events.events import RunErrorEvent, StepErrorMetadata +from wolfharness.agents.events.events import RunErrorEvent, StepErrorMetadata @pytest.mark.unit diff --git a/tests/agents/native_agent/test_step_usage.py b/tests/agents/native_agent/test_step_usage.py index cdbd4eeed..6889e7514 100644 --- a/tests/agents/native_agent/test_step_usage.py +++ b/tests/agents/native_agent/test_step_usage.py @@ -12,14 +12,14 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events.events import ( +from wolfharness import Agent +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events.events import ( StepUsageEvent, StreamCompleteEvent, ToolCallCompleteEvent, ) -from agentpool.agents.native_agent.turn import NativeTurn +from wolfharness.agents.native_agent.turn import NativeTurn # --------------------------------------------------------------------------- diff --git a/tests/agents/native_agent/test_terminal_events.py b/tests/agents/native_agent/test_terminal_events.py index 3856da34e..5ba781b02 100644 --- a/tests/agents/native_agent/test_terminal_events.py +++ b/tests/agents/native_agent/test_terminal_events.py @@ -19,14 +19,14 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events.events import ( +from wolfharness import Agent +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events.events import ( RunErrorEvent, StepErrorMetadata, StreamCompleteEvent, ) -from agentpool.agents.native_agent.turn import NativeTurn +from wolfharness.agents.native_agent.turn import NativeTurn def _make_mock_agentlet_raising(exc: BaseException) -> MagicMock: diff --git a/tests/agents/native_agent/test_tool_intercept_capability.py b/tests/agents/native_agent/test_tool_intercept_capability.py index e1167c3c2..63570f689 100644 --- a/tests/agents/native_agent/test_tool_intercept_capability.py +++ b/tests/agents/native_agent/test_tool_intercept_capability.py @@ -26,10 +26,10 @@ from pydantic_ai.usage import RunUsage import pytest -from agentpool import Agent -from agentpool.agents.native_agent.tool_intercept import ToolInterceptCapability -from agentpool.hooks import AgentHooks, CallableHook -from agentpool.hooks.base import HookResult +from wolfharness import Agent +from wolfharness.agents.native_agent.tool_intercept import ToolInterceptCapability +from wolfharness.hooks import AgentHooks, CallableHook +from wolfharness.hooks.base import HookResult pytestmark = pytest.mark.unit @@ -230,7 +230,7 @@ async def test_wrap_tool_execute_reraises_run_aborted_error( run. If swallowed here, the LLM receives it as a tool error and continues executing. """ - from agentpool.tasks.exceptions import RunAbortedError + from wolfharness.tasks.exceptions import RunAbortedError cap = make_capability(mock_hook_manager) ctx = make_run_context() @@ -293,7 +293,7 @@ async def test_wrap_tool_execute_reraises_tool_skipped_error( MCP tool_bridge). It signals the tool was skipped, not failed — swallowing it converts a skip signal into a tool error response. """ - from agentpool.tasks.exceptions import ToolSkippedError + from wolfharness.tasks.exceptions import ToolSkippedError cap = make_capability(mock_hook_manager) ctx = make_run_context() diff --git a/tests/agents/native_agent/test_turn.py b/tests/agents/native_agent/test_turn.py index c685a7aeb..12270fcc7 100644 --- a/tests/agents/native_agent/test_turn.py +++ b/tests/agents/native_agent/test_turn.py @@ -18,19 +18,19 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events.events import ( +from wolfharness import Agent +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events.events import ( RunErrorEvent, StreamCompleteEvent, ToolCallCompleteEvent, ) -from agentpool.agents.native_agent.turn import NativeTurn -from agentpool.tasks.exceptions import RunAbortedError +from wolfharness.agents.native_agent.turn import NativeTurn +from wolfharness.tasks.exceptions import RunAbortedError if TYPE_CHECKING: - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool def _make_mock_agentlet_raising(exc: BaseException) -> MagicMock: @@ -108,7 +108,7 @@ def fake_is_terminal(tool: Tool[Any]) -> bool: events: list[Any] = [] with patch( - "agentpool.agents.native_agent.turn.is_terminal_tool", + "wolfharness.agents.native_agent.turn.is_terminal_tool", side_effect=fake_is_terminal, ): events.extend([event async for event in turn.execute()]) diff --git a/tests/agents/run_concurrent_tests.py b/tests/agents/run_concurrent_tests.py index c9883589f..869ef4c97 100644 --- a/tests/agents/run_concurrent_tests.py +++ b/tests/agents/run_concurrent_tests.py @@ -13,11 +13,11 @@ import time -# Add agentpool to path +# Add wolfharness to path sys.path.insert(0, str(Path(__file__).parent.parent.parent / "src")) -from agentpool import Agent -from agentpool.agents.events import StreamCompleteEvent +from wolfharness import Agent +from wolfharness.agents.events import StreamCompleteEvent async def run_baseline_test(): # noqa: PLR0915 diff --git a/tests/agents/test_agent_basics.py b/tests/agents/test_agent_basics.py index ef7ecbf25..5b64c417c 100644 --- a/tests/agents/test_agent_basics.py +++ b/tests/agents/test_agent_basics.py @@ -9,8 +9,8 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, ChatMessage -from agentpool.agents.events import StreamCompleteEvent +from wolfharness import Agent, ChatMessage +from wolfharness.agents.events import StreamCompleteEvent SIMPLE_PROMPT = "Hello, how are you?" diff --git a/tests/agents/test_base_agent_api.py b/tests/agents/test_base_agent_api.py index bbcc226af..407e5277a 100644 --- a/tests/agents/test_base_agent_api.py +++ b/tests/agents/test_base_agent_api.py @@ -9,9 +9,9 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool.agents.base_agent import BaseAgent, _current_run_ctx_var -from agentpool.agents.context import AgentRunContext -from agentpool.orchestrator.core import SessionState +from wolfharness.agents.base_agent import BaseAgent, _current_run_ctx_var +from wolfharness.agents.context import AgentRunContext +from wolfharness.orchestrator.core import SessionState pytestmark = pytest.mark.integration @@ -22,7 +22,7 @@ from pydantic_ai.messages import ModelMessage - from agentpool.orchestrator.turn import Turn + from wolfharness.orchestrator.turn import Turn # --------------------------------------------------------------------------- @@ -113,7 +113,7 @@ def agent() -> _TestAgent: def _mock_session_pool(agent: _TestAgent, run_ctx: AgentRunContext) -> None: """Mock agent_pool.session_pool so _get_session_run_ctx() returns run_ctx.""" - from agentpool.orchestrator.run import RunHandle + from wolfharness.orchestrator.run import RunHandle session_state = SessionState(session_id="test-session", agent_name="test") session_state.current_run_id = run_ctx.run_id @@ -275,7 +275,7 @@ async def test_is_turn_active_true_with_current_run_ctx(agent: _TestAgent) -> No def test_is_turn_active_false_after_clearing_session_run_ctx(agent: _TestAgent) -> None: """After clearing session.current_run_id, is_turn_active() returns False.""" - from agentpool.orchestrator.run import RunHandle + from wolfharness.orchestrator.run import RunHandle run_ctx = AgentRunContext() session_state = SessionState(session_id="test-session", agent_name="test") @@ -340,8 +340,8 @@ async def test_is_turn_active_during_run_stream() -> None: We verify this by providing a tool that inspects the agent state mid-turn. """ - from agentpool import Agent - from agentpool.agents.events import StreamCompleteEvent + from wolfharness import Agent + from wolfharness.agents.events import StreamCompleteEvent turn_active_values: list[bool] = [] @@ -363,8 +363,8 @@ async def check_turn() -> str: @pytest.mark.asyncio async def test_get_active_run_context_during_run_stream() -> None: """get_active_run_context() returns a non-None context while inside run_stream.""" - from agentpool import Agent - from agentpool.agents.events import StreamCompleteEvent + from wolfharness import Agent + from wolfharness.agents.events import StreamCompleteEvent contexts: list[AgentRunContext | None] = [] diff --git a/tests/agents/test_base_agent_run_v2.py b/tests/agents/test_base_agent_run_v2.py index ff6f10b24..22d6de228 100644 --- a/tests/agents/test_base_agent_run_v2.py +++ b/tests/agents/test_base_agent_run_v2.py @@ -11,18 +11,18 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import RunErrorEvent, RunStartedEvent, StreamCompleteEvent -from agentpool.agents.native_agent.agent import Agent -from agentpool.lifecycle import DirectChannel, MemoryJournal -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventBus, SessionState -from agentpool.orchestrator.run import RunHandle -from agentpool.orchestrator.turn import Turn +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import RunErrorEvent, RunStartedEvent, StreamCompleteEvent +from wolfharness.agents.native_agent.agent import Agent +from wolfharness.lifecycle import DirectChannel, MemoryJournal +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventBus, SessionState +from wolfharness.orchestrator.run import RunHandle +from wolfharness.orchestrator.turn import Turn if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit @@ -253,7 +253,7 @@ async def test_run_stream_breaks_on_stream_complete(minimal_pool: AgentPool) -> stream.receive() after the run completes because the session remains open and EndOfStream is never raised. """ - from agentpool.orchestrator.core import SessionController + from wolfharness.orchestrator.core import SessionController controller = SessionController(pool=minimal_pool) event_bus = EventBus() @@ -305,7 +305,7 @@ def test_no_duplicate_stream_complete_in_run_once() -> None: NativeTurn.execute() already yields StreamCompleteEvent as its terminal event. Publishing it again results in duplicate events on the EventBus. """ - import agentpool.agents.native_agent.agent as agent_module + import wolfharness.agents.native_agent.agent as agent_module source = inspect.getsource(agent_module.Agent._execute_node) # After the fix, there should be no explicit StreamCompleteEvent publish. @@ -327,7 +327,7 @@ def test_no_duplicate_stream_complete_in_stream_events() -> None: NativeTurn.execute() already yields StreamCompleteEvent as its terminal event. Publishing it again results in duplicate events on the EventBus. """ - import agentpool.agents.native_agent.agent as agent_module + import wolfharness.agents.native_agent.agent as agent_module source = inspect.getsource(agent_module.Agent._stream_events) import re @@ -346,7 +346,7 @@ def test_base_agent_imports_are_runtime_available() -> None: Gemini claimed they were only in TYPE_CHECKING, but they are actually imported at module level (line 23 of base_agent.py). """ - import agentpool.agents.base_agent as base_module + import wolfharness.agents.base_agent as base_module # Verify the classes are accessible as attributes (runtime import) assert hasattr(base_module, "StreamCompleteEvent"), ( @@ -363,7 +363,7 @@ def test_execute_node_handles_run_error_event() -> None: Without this, if turn.execute() yields RunErrorEvent and returns early, turn.final_message raises RuntimeError, masking the original error. """ - import agentpool.agents.native_agent.agent as agent_module + import wolfharness.agents.native_agent.agent as agent_module source = inspect.getsource(agent_module.Agent._execute_node) assert "RunErrorEvent" in source, ( @@ -379,7 +379,7 @@ def test_stream_events_handles_run_error_event() -> None: Same issue as _execute_node — if turn fails, final_message is not set. """ - import agentpool.agents.native_agent.agent as agent_module + import wolfharness.agents.native_agent.agent as agent_module source = inspect.getsource(agent_module.Agent._stream_events) assert "RunErrorEvent" in source, ( diff --git a/tests/agents/test_capability_hooks_graph.py b/tests/agents/test_capability_hooks_graph.py index aa2c5bec9..fbb5157e4 100644 --- a/tests/agents/test_capability_hooks_graph.py +++ b/tests/agents/test_capability_hooks_graph.py @@ -17,8 +17,8 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool.agents.native_agent.agent import Agent -from agentpool.delegation import BaseTeam +from wolfharness.agents.native_agent.agent import Agent +from wolfharness.delegation import BaseTeam class _NodeHookTrackerCapability(AbstractCapability[Any]): diff --git a/tests/agents/test_capability_hooks_standalone.py b/tests/agents/test_capability_hooks_standalone.py index 9d5784435..94c8b9ed7 100644 --- a/tests/agents/test_capability_hooks_standalone.py +++ b/tests/agents/test_capability_hooks_standalone.py @@ -19,8 +19,8 @@ from pydantic_ai.capabilities import AbstractCapability import pytest -from agentpool.agents.native_agent.agent import Agent -from agentpool.models.agents import NativeAgentConfig +from wolfharness.agents.native_agent.agent import Agent +from wolfharness.models.agents import NativeAgentConfig class HookTrackerCapability(AbstractCapability[Any]): diff --git a/tests/agents/test_contextvar_concurrency.py b/tests/agents/test_contextvar_concurrency.py index 95ab06078..56b1518c4 100644 --- a/tests/agents/test_contextvar_concurrency.py +++ b/tests/agents/test_contextvar_concurrency.py @@ -23,7 +23,7 @@ def test_current_run_ctx_var_exists(): # Check it's a ContextVar from contextvars import ContextVar - from agentpool.agents.base_agent import _current_run_ctx_var + from wolfharness.agents.base_agent import _current_run_ctx_var assert isinstance(_current_run_ctx_var, ContextVar) @@ -35,8 +35,8 @@ def test_current_run_ctx_var_exists(): def test_contextvar_isolation(): """Test that ContextVar provides proper isolation between contexts.""" - from agentpool.agents.base_agent import _current_run_ctx_var - from agentpool.agents.context import AgentRunContext + from wolfharness.agents.base_agent import _current_run_ctx_var + from wolfharness.agents.context import AgentRunContext # Create two different run contexts ctx1 = AgentRunContext(session_id="session1") @@ -67,8 +67,8 @@ async def main(): def test_contextvar_with_tasks(): """Test ContextVar behavior with sequential asyncio tasks.""" - from agentpool.agents.base_agent import _current_run_ctx_var - from agentpool.agents.context import AgentRunContext + from wolfharness.agents.base_agent import _current_run_ctx_var + from wolfharness.agents.context import AgentRunContext results = [] @@ -104,8 +104,8 @@ async def main(): def test_contextvar_context_manager(): """Test ContextVar usage with context manager pattern.""" - from agentpool.agents.base_agent import _current_run_ctx_var - from agentpool.agents.context import AgentRunContext + from wolfharness.agents.base_agent import _current_run_ctx_var + from wolfharness.agents.context import AgentRunContext # Save current value old_value = _current_run_ctx_var.get() @@ -129,7 +129,7 @@ def test_contextvar_context_manager(): def test_no_instance_variable(): """Test that _current_run_ctx is NOT an instance variable.""" - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent # Create a mock agent instance class MockAgent(BaseAgent): @@ -156,12 +156,12 @@ def __init__(self): def test_background_run_ctx_unchanged(): """Test that _background_run_ctx is still an instance variable (unchanged).""" - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent # Create a minimal agent instance class TestAgent(BaseAgent): def create_turn(self, prompts, run_ctx, message_history): - from agentpool.orchestrator.turn import Turn + from wolfharness.orchestrator.turn import Turn class _EmptyTurn(Turn): async def execute(self): @@ -185,8 +185,8 @@ async def execute(self): def test_concurrent_runs_isolation(): """Test that concurrent agent runs have isolated contexts (RFC-0021).""" - from agentpool.agents.base_agent import _current_run_ctx_var - from agentpool.agents.context import AgentRunContext + from wolfharness.agents.base_agent import _current_run_ctx_var + from wolfharness.agents.context import AgentRunContext async def simulate_run(run_id: int): # Simulate setting up a run context diff --git a/tests/agents/test_create_child_session.py b/tests/agents/test_create_child_session.py index 99f1eb8ea..d4cc98106 100644 --- a/tests/agents/test_create_child_session.py +++ b/tests/agents/test_create_child_session.py @@ -10,9 +10,9 @@ import pytest -from agentpool.agents.context import AgentContext -from agentpool.sessions import SessionData -from agentpool_storage.memory_provider.provider import MemoryStorageProvider +from wolfharness.agents.context import AgentContext +from wolfharness.sessions import SessionData +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider pytestmark = pytest.mark.integration @@ -65,7 +65,7 @@ async def mock_create_child_session( session_id: str | None = None, **kwargs: object, ) -> MagicMock: - from agentpool.utils.identifiers import generate_session_id + from wolfharness.utils.identifiers import generate_session_id child_sid = session_id or generate_session_id() parent_data = None diff --git a/tests/agents/test_create_turn.py b/tests/agents/test_create_turn.py index f37a1c9e4..9b2ce2bce 100644 --- a/tests/agents/test_create_turn.py +++ b/tests/agents/test_create_turn.py @@ -7,10 +7,10 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentRunContext -from agentpool.agents.native_agent.agent import Agent -from agentpool.agents.native_agent.turn import NativeTurn +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.native_agent.agent import Agent +from wolfharness.agents.native_agent.turn import NativeTurn @pytest.mark.unit @@ -73,14 +73,14 @@ def test_acp_adapter_satisfies_protocol() -> None: import inspect from acp.agent.acp_agent_api import ACPAgentAPI - from agentpool.agents.acp_agent.turn import ACPClientProtocol + from wolfharness.agents.acp_agent.turn import ACPClientProtocol # ACPAgentAPI must have stream_events and get_messages methods assert hasattr(ACPAgentAPI, "stream_events"), "ACPAgentAPI must have stream_events()" assert hasattr(ACPAgentAPI, "get_messages"), "ACPAgentAPI must have get_messages()" # create_turn must not contain cast or TODO - import agentpool.agents.acp_agent.acp_agent as acp_module + import wolfharness.agents.acp_agent.acp_agent as acp_module source = inspect.getsource(acp_module.ACPAgent.create_turn) assert "cast" not in source, "create_turn must not use cast — adapter is complete" @@ -89,8 +89,8 @@ def test_acp_adapter_satisfies_protocol() -> None: # ACPAgentAPI must satisfy ACPClientProtocol at runtime from unittest.mock import MagicMock - from agentpool.agents.acp_agent.client_handler import TimeoutableEvent - from agentpool.agents.acp_agent.session_state import ACPSessionState + from wolfharness.agents.acp_agent.client_handler import TimeoutableEvent + from wolfharness.agents.acp_agent.session_state import ACPSessionState api = ACPAgentAPI( MagicMock(), @@ -104,7 +104,7 @@ def test_acp_adapter_satisfies_protocol() -> None: def test_acp_turn_uses_run_ctx_run_id() -> None: """ACPTurn.execute() must use self._run_ctx.run_id, not generate uuid4.""" - import agentpool.agents.acp_agent.turn as turn_module + import wolfharness.agents.acp_agent.turn as turn_module source = inspect.getsource(turn_module.ACPTurn.execute) assert "self._run_ctx.run_id" in source, ( @@ -121,7 +121,7 @@ def test_acp_turn_no_redundant_run_started_event() -> None: RunHandle.start() already publishes RunStartedEvent before calling turn.execute(). Yielding it again causes duplicate events. """ - import agentpool.agents.acp_agent.turn as turn_module + import wolfharness.agents.acp_agent.turn as turn_module source = inspect.getsource(turn_module.ACPTurn.execute) # Check that RunStartedEvent is not yielded in the execute method body @@ -136,7 +136,7 @@ def test_acp_turn_no_redundant_run_started_event() -> None: def test_acp_turn_no_unused_initial_message_history() -> None: """ACPTurn must not store _initial_message_history (dead code).""" - import agentpool.agents.acp_agent.turn as turn_module + import wolfharness.agents.acp_agent.turn as turn_module source = inspect.getsource(turn_module.ACPTurn.__init__) assert "_initial_message_history" not in source, ( @@ -151,7 +151,7 @@ def test_acp_turn_no_unused_initial_message_history() -> None: def test_acp_turn_accepts_agent_name() -> None: """ACPTurn.__init__ must accept and store agent_name parameter.""" - import agentpool.agents.acp_agent.turn as turn_module + import wolfharness.agents.acp_agent.turn as turn_module source = inspect.getsource(turn_module.ACPTurn.__init__) assert "agent_name" in source, ( @@ -162,7 +162,7 @@ def test_acp_turn_accepts_agent_name() -> None: def test_acp_turn_run_error_event_includes_agent_name() -> None: """ACPTurn.execute() must pass agent_name to RunErrorEvent yields.""" - import agentpool.agents.acp_agent.turn as turn_module + import wolfharness.agents.acp_agent.turn as turn_module source = inspect.getsource(turn_module.ACPTurn.execute) assert "agent_name=self._agent_name" in source, ( diff --git a/tests/agents/test_delegation_depth_error.py b/tests/agents/test_delegation_depth_error.py index b057d8ae0..25f7a2a80 100644 --- a/tests/agents/test_delegation_depth_error.py +++ b/tests/agents/test_delegation_depth_error.py @@ -4,7 +4,7 @@ import pytest -from agentpool.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError +from wolfharness.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError pytestmark = pytest.mark.unit @@ -62,7 +62,7 @@ def test_delegation_depth_error_catchable_as_runtime_error() -> None: def test_import_from_agents_init() -> None: """DelegationDepthError and MAX_DELEGATION_DEPTH should be importable from agents package.""" - import agentpool.agents as agents_mod + import wolfharness.agents as agents_mod assert agents_mod.DelegationDepthError is DelegationDepthError assert agents_mod.MAX_DELEGATION_DEPTH is MAX_DELEGATION_DEPTH diff --git a/tests/agents/test_deprecation_warnings.py b/tests/agents/test_deprecation_warnings.py index 3e6c0355b..a8b8585e2 100644 --- a/tests/agents/test_deprecation_warnings.py +++ b/tests/agents/test_deprecation_warnings.py @@ -19,7 +19,7 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, AgentPool +from wolfharness import Agent, AgentPool pytestmark = pytest.mark.integration diff --git a/tests/agents/test_external_agent_event_sequence.py b/tests/agents/test_external_agent_event_sequence.py index 3e3dfe458..9c6142ec1 100644 --- a/tests/agents/test_external_agent_event_sequence.py +++ b/tests/agents/test_external_agent_event_sequence.py @@ -24,8 +24,8 @@ from pydantic_ai import RunContext # noqa: TC002 import pytest -from agentpool import Agent, AgentPool, AgentsManifest, NativeAgentConfig -from agentpool.agents.events import StreamCompleteEvent, ToolCallCompleteEvent +from wolfharness import Agent, AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness.agents.events import StreamCompleteEvent, ToolCallCompleteEvent # Mark all tests in this module as integration tests @@ -125,7 +125,7 @@ def extract_key_events(events: list[Any]) -> list[str]: @pytest.fixture def acp_agent_config_with_tool(tmp_path: Path) -> tuple[Any, Path]: """Create ACPAgent config with echo tool via config file.""" - from agentpool.models.acp_agents import ACPAgentConfig + from wolfharness.models.acp_agents import ACPAgentConfig config_yaml = """ agents: @@ -142,7 +142,7 @@ def acp_agent_config_with_tool(tmp_path: Path) -> tuple[Any, Path]: command="uv", args=[ "run", - "agentpool", + "wolfharness", "serve-acp", str(config_file), "--agent", @@ -215,7 +215,7 @@ async def test_native_agent_event_sequence(): async def test_acp_agent_event_sequence(acp_agent_config_with_tool: tuple[Any, Path]): """Test ACPAgent emits events in expected sequence.""" - from agentpool.agents.acp_agent import ACPAgent + from wolfharness.agents.acp_agent import ACPAgent config, _ = acp_agent_config_with_tool collector = EventCollector() @@ -242,7 +242,7 @@ async def test_event_sequence_consistency_across_agents( acp_agent_config_with_tool: tuple[Any, Path], ): """Test that native Agent and ACPAgent emit consistent key event sequences.""" - from agentpool.agents.acp_agent import ACPAgent + from wolfharness.agents.acp_agent import ACPAgent # Collect from native agent native_collector = EventCollector() diff --git a/tests/agents/test_import_corrections.py b/tests/agents/test_import_corrections.py index a6ead9847..10956d835 100644 --- a/tests/agents/test_import_corrections.py +++ b/tests/agents/test_import_corrections.py @@ -15,12 +15,12 @@ def test_runusage_imports(): """Test that RunUsage is imported from pydantic_ai.usage, not pydantic_ai.""" files_to_check = [ - "src/agentpool_storage/sql_provider/sql_provider.py", - "src/agentpool_storage/file_provider/provider.py", + "src/wolfharness_storage/sql_provider/sql_provider.py", + "src/wolfharness_storage/file_provider/provider.py", "tests/test_history.py", "tests/mcp_client/test_client_conversion.py", - "src/agentpool_storage/sql_provider/utils.py", - "src/agentpool_storage/claude_provider/converters.py", + "src/wolfharness_storage/sql_provider/utils.py", + "src/wolfharness_storage/claude_provider/converters.py", ] root = Path(__file__).parent.parent.parent diff --git a/tests/agents/test_native_agent_streaming_cancellation.py b/tests/agents/test_native_agent_streaming_cancellation.py index 1e56b5e5b..5ccbdb7d0 100644 --- a/tests/agents/test_native_agent_streaming_cancellation.py +++ b/tests/agents/test_native_agent_streaming_cancellation.py @@ -22,10 +22,10 @@ from pydantic_ai.models.test import TestModel, TestStreamedResponse import pytest -from agentpool import Agent -from agentpool.agents.base_agent import _current_run_ctx_var -from agentpool.agents.events import StreamCompleteEvent -from agentpool.orchestrator.core import SessionState +from wolfharness import Agent +from wolfharness.agents.base_agent import _current_run_ctx_var +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.orchestrator.core import SessionState if TYPE_CHECKING: @@ -86,7 +86,7 @@ async def slow_agent() -> AsyncGenerator[Agent[None]]: def _mock_session_pool(agent: Agent[Any], run_ctx: Any) -> None: """Mock agent_pool.session_pool so _get_session_run_ctx() returns run_ctx.""" - from agentpool.orchestrator.run import RunHandle + from wolfharness.orchestrator.run import RunHandle session_state = SessionState(session_id="test-session", agent_name="test") session_state.current_run_id = run_ctx.run_id diff --git a/tests/agents/test_native_agent_streaming_ordering.py b/tests/agents/test_native_agent_streaming_ordering.py index 458d4f239..433d7f745 100644 --- a/tests/agents/test_native_agent_streaming_ordering.py +++ b/tests/agents/test_native_agent_streaming_ordering.py @@ -10,8 +10,8 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.events import StreamCompleteEvent +from wolfharness import Agent +from wolfharness.agents.events import StreamCompleteEvent TEST_RESPONSE = "I am a test response" diff --git a/tests/agents/test_native_agent_streaming_realtime.py b/tests/agents/test_native_agent_streaming_realtime.py index b4ef277aa..9b2ca3eaa 100644 --- a/tests/agents/test_native_agent_streaming_realtime.py +++ b/tests/agents/test_native_agent_streaming_realtime.py @@ -19,8 +19,8 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.events import StreamCompleteEvent +from wolfharness import Agent +from wolfharness.agents.events import StreamCompleteEvent # --------------------------------------------------------------------------- diff --git a/tests/agents/test_run_stream_depth.py b/tests/agents/test_run_stream_depth.py index 281f9a1aa..31eb4b7be 100644 --- a/tests/agents/test_run_stream_depth.py +++ b/tests/agents/test_run_stream_depth.py @@ -4,7 +4,7 @@ import pytest -from agentpool.agents.context import AgentRunContext +from wolfharness.agents.context import AgentRunContext pytestmark = pytest.mark.unit @@ -44,7 +44,7 @@ def test_agent_run_context_terminal_tool_state_default() -> None: def test_terminal_tool_metadata_marks_run_completion() -> None: """Terminal-tool behavior should be declared by metadata, not by tool name.""" - from agentpool.tools.base import TERMINAL_TOOL_METADATA_KEY, has_terminal_tool_metadata + from wolfharness.tools.base import TERMINAL_TOOL_METADATA_KEY, has_terminal_tool_metadata assert has_terminal_tool_metadata({TERMINAL_TOOL_METADATA_KEY: "true"}) assert not has_terminal_tool_metadata({"name": "attempt_completion"}) @@ -59,7 +59,7 @@ def test_run_stream_accepts_depth_param() -> None: """ import inspect - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent sig = inspect.signature(BaseAgent.run_stream) assert "depth" in sig.parameters @@ -70,7 +70,7 @@ def test_run_accepts_depth_param() -> None: """BaseAgent.run() should accept depth parameter without TypeError.""" import inspect - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent sig = inspect.signature(BaseAgent.run) assert "depth" in sig.parameters diff --git a/tests/agents/test_run_stream_direct_gating.py b/tests/agents/test_run_stream_direct_gating.py index bf92bc758..8da9ea486 100644 --- a/tests/agents/test_run_stream_direct_gating.py +++ b/tests/agents/test_run_stream_direct_gating.py @@ -12,8 +12,8 @@ import pytest -from agentpool.agents.base_agent import BaseAgent -from agentpool.orchestrator.turn import Turn +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.orchestrator.turn import Turn pytestmark = pytest.mark.unit @@ -22,8 +22,8 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool.agents.context import AgentRunContext - from agentpool.agents.events import RichAgentStreamEvent + from wolfharness.agents.context import AgentRunContext + from wolfharness.agents.events import RichAgentStreamEvent # --------------------------------------------------------------------------- diff --git a/tests/agents/test_runusage_corrections.py b/tests/agents/test_runusage_corrections.py index a8a5d138e..2d330f5dd 100644 --- a/tests/agents/test_runusage_corrections.py +++ b/tests/agents/test_runusage_corrections.py @@ -19,7 +19,7 @@ from pydantic_ai.usage import RequestUsage, RunUsage # noqa: E402 -from agentpool.messaging.messages import TokenCost # noqa: E402 +from wolfharness.messaging.messages import TokenCost # noqa: E402 pytestmark = pytest.mark.unit diff --git a/tests/agents/test_session_id_deprecation.py b/tests/agents/test_session_id_deprecation.py index d939d40d1..a43af16fb 100644 --- a/tests/agents/test_session_id_deprecation.py +++ b/tests/agents/test_session_id_deprecation.py @@ -6,7 +6,7 @@ import pytest -from agentpool.agents.context import AgentRunContext +from wolfharness.agents.context import AgentRunContext pytestmark = pytest.mark.unit diff --git a/tests/agents/test_signatures_context_binding.py b/tests/agents/test_signatures_context_binding.py index ff18f9ec8..fb56eb336 100644 --- a/tests/agents/test_signatures_context_binding.py +++ b/tests/agents/test_signatures_context_binding.py @@ -5,10 +5,10 @@ import pytest -from agentpool import Agent -from agentpool.agents.context import AgentContext -from agentpool.utils.inspection import get_fn_name -from agentpool.utils.signatures import create_bound_callable +from wolfharness import Agent +from wolfharness.agents.context import AgentContext +from wolfharness.utils.inspection import get_fn_name +from wolfharness.utils.signatures import create_bound_callable pytestmark = pytest.mark.unit @@ -290,7 +290,7 @@ def test_invalid_callable_signature(self): bad_callable.__name__ = "bad_callable" with ( patch( - "agentpool.utils.signatures.inspect.signature", + "wolfharness.utils.signatures.inspect.signature", side_effect=ValueError("no signature"), ), pytest.raises(ValueError, match="Cannot inspect signature"), diff --git a/tests/benchmark/test_graph_performance.py b/tests/benchmark/test_graph_performance.py index 9bfdb34e7..8097fe894 100644 --- a/tests/benchmark/test_graph_performance.py +++ b/tests/benchmark/test_graph_performance.py @@ -21,16 +21,16 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, BaseTeam -from agentpool.agents.events import RunStartedEvent -from agentpool.delegation.graph_team import build_team_graph +from wolfharness import Agent, BaseTeam +from wolfharness.agents.events import RunStartedEvent +from wolfharness.delegation.graph_team import build_team_graph pytestmark = pytest.mark.unit if TYPE_CHECKING: - from agentpool.messaging import ChatMessage + from wolfharness.messaging import ChatMessage # Threshold: graph-based must be within 40% of direct execution. diff --git a/tests/capabilities/background_task/integration/test_background_task_concurrency_stress.py b/tests/capabilities/background_task/integration/test_background_task_concurrency_stress.py index ef7f1583e..0415a6cb0 100644 --- a/tests/capabilities/background_task/integration/test_background_task_concurrency_stress.py +++ b/tests/capabilities/background_task/integration/test_background_task_concurrency_stress.py @@ -25,16 +25,16 @@ if TYPE_CHECKING: from collections.abc import Callable -from agentpool import ChatMessage -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentContext -from agentpool.agents.events import StreamCompleteEvent -from agentpool.capabilities.background_task.capability import ( +from wolfharness import ChatMessage +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentContext +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.capabilities.background_task.capability import ( BackgroundTaskCapability, ) -from agentpool.capabilities.background_task.manager import TERMINAL_STATES, BackgroundTaskManager -from agentpool.capabilities.background_task.types import BackgroundTask -from agentpool.delegation import AgentPool +from wolfharness.capabilities.background_task.manager import TERMINAL_STATES, BackgroundTaskManager +from wolfharness.capabilities.background_task.types import BackgroundTask +from wolfharness.delegation import AgentPool # --------------------------------------------------------------------------- @@ -443,7 +443,7 @@ async def _capturing_task_async(self_inner, *args, **kwargs): with ( patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_team_001", ), patch.object( diff --git a/tests/capabilities/background_task/integration/test_background_task_e2e.py b/tests/capabilities/background_task/integration/test_background_task_e2e.py index f9cc74062..4b335a6f5 100644 --- a/tests/capabilities/background_task/integration/test_background_task_e2e.py +++ b/tests/capabilities/background_task/integration/test_background_task_e2e.py @@ -20,19 +20,19 @@ from pydantic_ai.models.function import AgentInfo, FunctionModel import pytest -from agentpool import Agent, AgentContext, ChatMessage -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import StreamCompleteEvent -from agentpool.capabilities.background_task import ( +from wolfharness import Agent, AgentContext, ChatMessage +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.capabilities.background_task import ( BackgroundTaskCapability as BackgroundTaskProvider, ) -from agentpool.capabilities.background_task.capability import ( +from wolfharness.capabilities.background_task.capability import ( BackgroundTaskCapability, ) -from agentpool.capabilities.background_task.manager import BackgroundTaskManager -from agentpool.capabilities.background_task.types import BackgroundTask -from agentpool.delegation import AgentPool -from agentpool.tools.exceptions import ToolError +from wolfharness.capabilities.background_task.manager import BackgroundTaskManager +from wolfharness.capabilities.background_task.types import BackgroundTask +from wolfharness.delegation import AgentPool +from wolfharness.tools.exceptions import ToolError def _wrap_in_run_context(agent_ctx): @@ -562,7 +562,7 @@ async def test_shutdown_clears_empty_manager(): @pytest.mark.integration async def test_background_task_provider_importable_from_package(): """Test that BackgroundTaskCapability is importable from the capabilities package.""" - from agentpool.capabilities.background_task import ( + from wolfharness.capabilities.background_task import ( BackgroundTaskCapability as Imported, ) diff --git a/tests/capabilities/background_task/resource_providers/test_background_task_cancellation_regression.py b/tests/capabilities/background_task/resource_providers/test_background_task_cancellation_regression.py index 5df7f8917..02df52673 100644 --- a/tests/capabilities/background_task/resource_providers/test_background_task_cancellation_regression.py +++ b/tests/capabilities/background_task/resource_providers/test_background_task_cancellation_regression.py @@ -21,16 +21,16 @@ from pydantic_ai import RunContext import pytest -from agentpool import ChatMessage -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentContext -from agentpool.agents.events import StreamCompleteEvent -from agentpool.capabilities.background_task.capability import ( +from wolfharness import ChatMessage +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentContext +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.capabilities.background_task.capability import ( BackgroundTaskCapability, ) -from agentpool.capabilities.background_task.manager import BackgroundTaskManager -from agentpool.capabilities.background_task.types import BackgroundTask -from agentpool.delegation import AgentPool +from wolfharness.capabilities.background_task.manager import BackgroundTaskManager +from wolfharness.capabilities.background_task.types import BackgroundTask +from wolfharness.delegation import AgentPool pytestmark = pytest.mark.anyio @@ -297,7 +297,7 @@ async def test_parallel_background_tasks_via_provider_all_complete(self): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value=f"bg_parl{i:02d}", ): result = await capability._task( @@ -359,7 +359,7 @@ async def test_blocking_on_task_a_does_not_cancel_task_b(self): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_task_a01", ): await capability._task( @@ -376,7 +376,7 @@ async def _slow_stream_b(**kwargs): mock_node.run_stream = MagicMock(return_value=_slow_stream_b()) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_task_b01", ): await capability._task( @@ -422,7 +422,7 @@ async def _delayed_stream(**kwargs): mock_node.run_stream = MagicMock(return_value=_delayed_stream()) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value=f"bg_concur_{task_label}", ): await capability._task( @@ -482,7 +482,7 @@ async def test_blocking_output_while_third_task_running(self): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_three_a", ): await capability._task( @@ -499,7 +499,7 @@ async def _stream_b(**kwargs): mock_node.run_stream = MagicMock(return_value=_stream_b()) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_three_b", ): await capability._task( @@ -516,7 +516,7 @@ async def _stream_c(**kwargs): mock_node.run_stream = MagicMock(return_value=_stream_c()) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_three_c", ): await capability._task( @@ -565,7 +565,7 @@ async def test_blocking_waiter_unregister_does_not_affect_other_tasks(self): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_waiter01", ): await capability._task( @@ -582,7 +582,7 @@ async def _stream_2(**kwargs): mock_node.run_stream = MagicMock(return_value=_stream_2()) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_waiter02", ): await capability._task( diff --git a/tests/capabilities/background_task/resource_providers/test_background_task_completion_notification.py b/tests/capabilities/background_task/resource_providers/test_background_task_completion_notification.py index 18e482360..d863279ea 100644 --- a/tests/capabilities/background_task/resource_providers/test_background_task_completion_notification.py +++ b/tests/capabilities/background_task/resource_providers/test_background_task_completion_notification.py @@ -28,16 +28,16 @@ from pydantic_ai import RunContext import pytest -from agentpool import ChatMessage -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentContext -from agentpool.agents.events import StreamCompleteEvent -from agentpool.capabilities.background_task.capability import ( +from wolfharness import ChatMessage +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentContext +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.capabilities.background_task.capability import ( BackgroundTaskCapability, ) -from agentpool.capabilities.background_task.manager import BackgroundTaskManager -from agentpool.capabilities.background_task.types import BackgroundTask, TaskHandle -from agentpool.delegation import AgentPool +from wolfharness.capabilities.background_task.manager import BackgroundTaskManager +from wolfharness.capabilities.background_task.types import BackgroundTask, TaskHandle +from wolfharness.delegation import AgentPool pytestmark = pytest.mark.anyio @@ -212,7 +212,7 @@ async def test_no_inject_when_blocking_waiter_present(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_a1b2c3d4", ): result_text = await capability._task( @@ -271,7 +271,7 @@ async def test_inject_when_no_blocking_waiter(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_noblock99", ): await capability._task( @@ -321,7 +321,7 @@ async def test_nonblocking_output_does_not_suppress_inject(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_nonblock1", ): await capability._task( @@ -377,7 +377,7 @@ async def test_waiter_unregistered_after_blocking_returns(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_unreg001", ): await capability._task( @@ -433,7 +433,7 @@ async def test_inject_prompt_queues_and_triggers_auto_resume(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_autoresume01", ): await capability._task( @@ -502,7 +502,7 @@ async def test_auto_resume_triggered_when_inject_prompt_returns_false(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_autoresume02", ): await capability._task( @@ -566,7 +566,7 @@ async def test_inject_prompt_safe_when_no_run_context(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_noctx001", ): await capability._task( @@ -658,7 +658,7 @@ async def test_debounce_window_no_notification_before_timeout(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_debounce01", ): await capability._task( @@ -723,7 +723,7 @@ async def test_multiple_tasks_batched_in_debounce_window(): task_ids = [] with ( patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", side_effect=["bg_batch01", "bg_batch02"], ), ): diff --git a/tests/capabilities/background_task/resource_providers/test_background_task_history_isolation.py b/tests/capabilities/background_task/resource_providers/test_background_task_history_isolation.py index f940de955..fd9c8bc04 100644 --- a/tests/capabilities/background_task/resource_providers/test_background_task_history_isolation.py +++ b/tests/capabilities/background_task/resource_providers/test_background_task_history_isolation.py @@ -30,15 +30,15 @@ from pydantic_ai import RunContext import pytest -from agentpool import ChatMessage -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentContext -from agentpool.agents.events import StreamCompleteEvent -from agentpool.capabilities.background_task.capability import ( +from wolfharness import ChatMessage +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentContext +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.capabilities.background_task.capability import ( BackgroundTaskCapability, ) -from agentpool.delegation import AgentPool -from agentpool.messaging import MessageHistory +from wolfharness.delegation import AgentPool +from wolfharness.messaging import MessageHistory pytestmark = pytest.mark.anyio @@ -233,7 +233,7 @@ def _capturing_run_stream(*args: Any, **kwargs: Any) -> Any: node.run_stream = MagicMock(side_effect=_capturing_run_stream) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_isoasyn1", ): await capability._task( @@ -320,7 +320,7 @@ def _capturing_run_stream(*args: Any, **kwargs: Any) -> Any: for i in range(2): with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value=f"bg_parl{i:02d}", ): await capability._task( @@ -362,7 +362,7 @@ async def test_node_conversation_not_polluted_by_async_task(self) -> None: ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_nopoll1", ): await capability._task( @@ -418,7 +418,7 @@ def _capturing_run_stream(*args: Any, **kwargs: Any) -> Any: for i in range(2): with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value=f"bg_sid{i:02d}", ): await capability._task( @@ -485,7 +485,7 @@ def _capturing_run_stream(*args: Any, **kwargs: Any) -> Any: for i in range(2): with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value=f"bg_dep{i:02d}", ): await capability._task( diff --git a/tests/capabilities/background_task/resource_providers/test_background_task_provider.py b/tests/capabilities/background_task/resource_providers/test_background_task_provider.py index c7bda95f2..bcf39c785 100644 --- a/tests/capabilities/background_task/resource_providers/test_background_task_provider.py +++ b/tests/capabilities/background_task/resource_providers/test_background_task_provider.py @@ -13,12 +13,12 @@ from pydantic_ai import RunContext import pytest -from agentpool import Agent, AgentContext -from agentpool.agents.base_agent import BaseAgent -from agentpool.capabilities.background_task.capability import BackgroundTaskCapability -from agentpool.capabilities.background_task.manager import BackgroundTaskManager -from agentpool.delegation import AgentPool -from agentpool.tools.exceptions import ToolError +from wolfharness import Agent, AgentContext +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.capabilities.background_task.capability import BackgroundTaskCapability +from wolfharness.capabilities.background_task.manager import BackgroundTaskManager +from wolfharness.delegation import AgentPool +from wolfharness.tools.exceptions import ToolError # --------------------------------------------------------------------------- diff --git a/tests/capabilities/background_task/resource_providers/test_background_task_provider_async_events.py b/tests/capabilities/background_task/resource_providers/test_background_task_provider_async_events.py index 4107433e6..446b2d184 100644 --- a/tests/capabilities/background_task/resource_providers/test_background_task_provider_async_events.py +++ b/tests/capabilities/background_task/resource_providers/test_background_task_provider_async_events.py @@ -24,19 +24,19 @@ from pydantic_ai.messages import TextPartDelta import pytest -from agentpool import ChatMessage -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentContext -from agentpool.agents.events import ( +from wolfharness import ChatMessage +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentContext +from wolfharness.agents.events import ( PartDeltaEvent, RunFailedEvent, StreamCompleteEvent, SubAgentEvent, ) -from agentpool.capabilities.background_task.capability import ( +from wolfharness.capabilities.background_task.capability import ( BackgroundTaskCapability, ) -from agentpool.delegation import AgentPool +from wolfharness.delegation import AgentPool pytestmark = pytest.mark.anyio @@ -230,7 +230,7 @@ async def test_async_task_does_not_emit_subagent_events(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_asevnt01", ): await capability._task( @@ -278,7 +278,7 @@ async def test_async_task_does_not_emit_stream_complete_on_finish(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_asynct01", ): await capability._task( @@ -323,7 +323,7 @@ async def _error_stream(**kwargs): mock_node.run_stream = MagicMock(return_value=_error_stream()) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_asynct01", ): await capability._task( @@ -363,7 +363,7 @@ async def test_async_task_preserves_filesystem_writing(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_fswrt001", ): await capability._task( @@ -408,7 +408,7 @@ async def test_async_task_writes_part_delta_to_filesystem(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_delta001", ): await capability._task( @@ -452,7 +452,7 @@ async def test_async_task_returns_immediately(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_quick0001", ): result = await capability._task( @@ -500,7 +500,7 @@ async def _slow_stream(**kwargs): mock_node.run_stream = MagicMock(return_value=_slow_stream()) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_parend01", ): await capability._task( @@ -538,7 +538,7 @@ async def _slow_stream(**kwargs): @pytest.mark.unit async def test_async_task_emits_spawn_session_start(): """Verify that create_child_session() is called with spawn_mechanism='task' - so that SpawnSessionStart is auto-emitted by the agentpool framework. + so that SpawnSessionStart is auto-emitted by the wolfharness framework. """ capability = BackgroundTaskCapability(schemas=None) pool = _make_mock_pool() @@ -553,7 +553,7 @@ async def test_async_task_emits_spawn_session_start(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_spawn01", ): await capability._task( @@ -596,7 +596,7 @@ async def test_async_task_completion_callback_injects_prompt(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_inject01", ): await capability._task( diff --git a/tests/capabilities/background_task/resource_providers/test_background_task_provider_execution.py b/tests/capabilities/background_task/resource_providers/test_background_task_provider_execution.py index b70cf7530..8ee02c569 100644 --- a/tests/capabilities/background_task/resource_providers/test_background_task_provider_execution.py +++ b/tests/capabilities/background_task/resource_providers/test_background_task_provider_execution.py @@ -13,10 +13,10 @@ from pydantic_ai import RunContext import pytest -from agentpool import ChatMessage -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentContext -from agentpool.agents.events import ( +from wolfharness import ChatMessage +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentContext +from wolfharness.agents.events import ( RunErrorEvent, RunFailedEvent, StreamCompleteEvent, @@ -24,14 +24,14 @@ ToolCallCompleteEvent, ToolCallStartEvent, ) -from agentpool.capabilities.background_task.capability import ( +from wolfharness.capabilities.background_task.capability import ( MAX_DELEGATION_DEPTH, BackgroundTaskCapability, _generate_task_id, ) -from agentpool.capabilities.background_task.types import BackgroundTask -from agentpool.delegation import AgentPool, BaseTeam -from agentpool.tools.exceptions import ToolError +from wolfharness.capabilities.background_task.types import BackgroundTask +from wolfharness.delegation import AgentPool, BaseTeam +from wolfharness.tools.exceptions import ToolError # --------------------------------------------------------------------------- @@ -285,7 +285,7 @@ async def test_task_delegation_depth_limit(): @pytest.mark.unit async def test_task_sync_emits_spawn_session_start(): """Test that create_child_session is called with spawn_mechanism='task' - so SpawnSessionStart is auto-emitted by the agentpool framework. + so SpawnSessionStart is auto-emitted by the wolfharness framework. """ capability = BackgroundTaskCapability(schemas=None) pool = _make_mock_pool() @@ -459,7 +459,8 @@ async def test_task_creates_child_session(): @pytest.mark.unit @patch( - "agentpool.capabilities.background_task.capability.load_skill_for_node", new_callable=AsyncMock + "wolfharness.capabilities.background_task.capability.load_skill_for_node", + new_callable=AsyncMock, ) async def test_task_injects_skills(mock_load_skill): """Test that task injects skills into the formatted prompt.""" @@ -550,7 +551,7 @@ async def test_task_async_returns_formatted_text(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_testtask", ): result = await capability._task( @@ -588,7 +589,7 @@ async def test_task_async_registers_background_task(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_regtest1", ): await capability._task( @@ -630,7 +631,7 @@ async def test_task_async_creates_task_directory(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_dirtst01", ): await capability._task( @@ -651,7 +652,7 @@ async def test_task_async_creates_task_directory(): @pytest.mark.unit async def test_task_async_emits_spawn_session_start(): """Test that async path calls create_child_session with spawn_mechanism='task' - so SpawnSessionStart is auto-emitted by the agentpool framework. + so SpawnSessionStart is auto-emitted by the wolfharness framework. """ capability = BackgroundTaskCapability(schemas=None) pool = _make_mock_pool() @@ -666,7 +667,7 @@ async def test_task_async_emits_spawn_session_start(): ) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_spawnt01", ): await capability._task( @@ -818,7 +819,7 @@ async def test_task_extracts_model_id_from_base_agent(): """Test that task calls create_child_session correctly for BaseAgent nodes. Model ID extraction was removed — SpawnSessionStart (including model_id) - is now auto-emitted by create_child_session() in the agentpool framework. + is now auto-emitted by create_child_session() in the wolfharness framework. """ capability = BackgroundTaskCapability(schemas=None) pool = _make_mock_pool() diff --git a/tests/capabilities/background_task/resource_providers/test_background_task_provider_output_cancel.py b/tests/capabilities/background_task/resource_providers/test_background_task_provider_output_cancel.py index 67a82bfe4..bffd8c87a 100644 --- a/tests/capabilities/background_task/resource_providers/test_background_task_provider_output_cancel.py +++ b/tests/capabilities/background_task/resource_providers/test_background_task_provider_output_cancel.py @@ -10,13 +10,13 @@ import pytest from upathtools.filesystems.isolated_memory_fs import IsolatedMemoryFileSystem -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentContext -from agentpool.capabilities.background_task.capability import ( +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentContext +from wolfharness.capabilities.background_task.capability import ( BackgroundTaskCapability, ) -from agentpool.capabilities.background_task.types import BackgroundTask, TaskStatus -from agentpool.tools.exceptions import ToolError +from wolfharness.capabilities.background_task.types import BackgroundTask, TaskStatus +from wolfharness.tools.exceptions import ToolError def _wrap_in_run_context(agent_ctx): diff --git a/tests/capabilities/background_task/test_background_output_edge_cases.py b/tests/capabilities/background_task/test_background_output_edge_cases.py index 074cdef3b..0f8d552d6 100644 --- a/tests/capabilities/background_task/test_background_output_edge_cases.py +++ b/tests/capabilities/background_task/test_background_output_edge_cases.py @@ -18,13 +18,13 @@ import pytest from upathtools.filesystems.isolated_memory_fs import IsolatedMemoryFileSystem -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentContext -from agentpool.capabilities.background_task.capability import ( +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentContext +from wolfharness.capabilities.background_task.capability import ( BackgroundTaskCapability, ) -from agentpool.capabilities.background_task.manager import BackgroundTaskManager -from agentpool.capabilities.background_task.types import BackgroundTask +from wolfharness.capabilities.background_task.manager import BackgroundTaskManager +from wolfharness.capabilities.background_task.types import BackgroundTask class _NullWaitManager(BackgroundTaskManager): diff --git a/tests/capabilities/background_task/test_background_task_capability.py b/tests/capabilities/background_task/test_background_task_capability.py index 0c1441534..bdb45ff58 100644 --- a/tests/capabilities/background_task/test_background_task_capability.py +++ b/tests/capabilities/background_task/test_background_task_capability.py @@ -12,14 +12,21 @@ from pydantic_ai.toolsets import FunctionToolset from pydantic_graph import End -from agentpool.agents.context import AgentContext -from agentpool.capabilities.background_task import BackgroundTaskCapability -import agentpool.capabilities.background_task.capability as btc_module -from agentpool.capabilities.background_task.capability import ForceRetrievalMode +from wolfharness.agents.context import AgentContext +from wolfharness.capabilities.background_task import BackgroundTaskCapability +import wolfharness.capabilities.background_task.capability as btc_module +from wolfharness.capabilities.background_task.capability import ForceRetrievalMode -CONFIG_DIR = Path(__file__).resolve().parents[3] / "config" -TASK_SCHEMA_PATH = str(CONFIG_DIR / "tools" / "task.yaml") +SCHEMAS_DIR = ( + Path(__file__).resolve().parents[3] + / "src" + / "wolfharness" + / "capabilities" + / "background_task" + / "schemas" +) +TASK_SCHEMA_PATH = str(SCHEMAS_DIR / "task.yaml") @runtime_checkable @@ -650,7 +657,7 @@ async def test_steer_task_interrupt_calls_steer(): async def test_steer_task_raises_error_for_unknown_task(): """_steer_task should raise ToolError when task_id is not found.""" - from agentpool.tools.exceptions import ToolError + from wolfharness.tools.exceptions import ToolError capability = BackgroundTaskCapability() @@ -695,7 +702,7 @@ async def test_steer_task_returns_message_for_terminal_task(): async def test_steer_task_raises_error_when_no_session_pool(): """_steer_task should raise ToolError when SessionPool is unavailable.""" - from agentpool.tools.exceptions import ToolError + from wolfharness.tools.exceptions import ToolError capability = BackgroundTaskCapability() diff --git a/tests/capabilities/background_task/test_error_propagation.py b/tests/capabilities/background_task/test_error_propagation.py index 749329153..fa439168a 100644 --- a/tests/capabilities/background_task/test_error_propagation.py +++ b/tests/capabilities/background_task/test_error_propagation.py @@ -19,12 +19,12 @@ import pytest -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentContext -from agentpool.capabilities.background_task.capability import ( +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentContext +from wolfharness.capabilities.background_task.capability import ( BackgroundTaskCapability, ) -from agentpool.capabilities.background_task.manager import BackgroundTaskManager +from wolfharness.capabilities.background_task.manager import BackgroundTaskManager # --------------------------------------------------------------------------- @@ -99,7 +99,7 @@ def _make_agent_context(pool: MagicMock) -> MagicMock: @pytest.mark.unit @patch( - "agentpool.capabilities.background_task.capability.load_skill_for_node", + "wolfharness.capabilities.background_task.capability.load_skill_for_node", new_callable=AsyncMock, ) async def test_load_skill_exception_propagates_uncaught(mock_load_skill: AsyncMock) -> None: @@ -175,7 +175,7 @@ async def test_mkdirs_exception_propagates_from_task_async() -> None: ctx.internal_fs.mkdirs = MagicMock(side_effect=OSError("disk full")) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_mkdir01", ): result = await capability._task( diff --git a/tests/capabilities/background_task/test_manager.py b/tests/capabilities/background_task/test_manager.py index 094f7aad2..dfd0c2346 100644 --- a/tests/capabilities/background_task/test_manager.py +++ b/tests/capabilities/background_task/test_manager.py @@ -6,7 +6,7 @@ import contextlib import time -from agentpool.capabilities.background_task import BackgroundTask, BackgroundTaskManager +from wolfharness.capabilities.background_task import BackgroundTask, BackgroundTaskManager # --------------------------------------------------------------------------- diff --git a/tests/capabilities/background_task/test_manager_state_and_cleanup.py b/tests/capabilities/background_task/test_manager_state_and_cleanup.py index acc1ff627..ca60506ef 100644 --- a/tests/capabilities/background_task/test_manager_state_and_cleanup.py +++ b/tests/capabilities/background_task/test_manager_state_and_cleanup.py @@ -18,7 +18,7 @@ import pytest -from agentpool.capabilities.background_task import BackgroundTask, BackgroundTaskManager +from wolfharness.capabilities.background_task import BackgroundTask, BackgroundTaskManager # --------------------------------------------------------------------------- diff --git a/tests/capabilities/background_task/test_notification_batcher.py b/tests/capabilities/background_task/test_notification_batcher.py index 91a2e56b0..73fe2ce55 100644 --- a/tests/capabilities/background_task/test_notification_batcher.py +++ b/tests/capabilities/background_task/test_notification_batcher.py @@ -16,8 +16,8 @@ import pytest -from agentpool.capabilities.background_task.notification import NotificationBatcher -from agentpool.capabilities.background_task.types import BackgroundTask +from wolfharness.capabilities.background_task.notification import NotificationBatcher +from wolfharness.capabilities.background_task.types import BackgroundTask # Flush delivery runs via anyio TimerHandle callbacks, so tests must run under diff --git a/tests/capabilities/background_task/test_run_and_stream_errors.py b/tests/capabilities/background_task/test_run_and_stream_errors.py index 100840baa..912a7d21d 100644 --- a/tests/capabilities/background_task/test_run_and_stream_errors.py +++ b/tests/capabilities/background_task/test_run_and_stream_errors.py @@ -25,10 +25,10 @@ from pydantic_ai import RunContext import pytest -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.context import AgentContext -from agentpool.agents.events import RunErrorEvent -from agentpool.capabilities.background_task.capability import ( +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.context import AgentContext +from wolfharness.agents.events import RunErrorEvent +from wolfharness.capabilities.background_task.capability import ( BackgroundTaskCapability, _generate_task_id, ) @@ -193,7 +193,7 @@ async def test_run_and_stream_swallows_exception_and_marks_completed(): pool.session_pool.send_message = AsyncMock(side_effect=ValueError("connection lost")) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_err001", ): await capability._task( @@ -247,7 +247,7 @@ async def test_run_and_stream_end_of_stream_no_terminal_event(): pool.session_pool.send_message = AsyncMock(return_value=MagicMock()) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_eos001", ): await capability._task( @@ -299,11 +299,11 @@ async def test_run_and_stream_send_message_returns_none(): with ( patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_none01", ), patch( - "agentpool.capabilities.background_task.capability.logger", + "wolfharness.capabilities.background_task.capability.logger", ) as mock_logger, ): await capability._task( @@ -361,7 +361,7 @@ async def test_run_and_stream_writes_error_on_run_error_event(): pool.session_pool.send_message = AsyncMock(return_value=MagicMock()) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_reer01", ): await capability._task( @@ -413,7 +413,7 @@ async def test_run_and_stream_writes_cancelled_on_cancelled_error(): pool.session_pool.send_message = AsyncMock(return_value=MagicMock()) with patch( - "agentpool.capabilities.background_task.capability._generate_task_id", + "wolfharness.capabilities.background_task.capability._generate_task_id", return_value="bg_cancel01", ): await capability._task( diff --git a/tests/capabilities/background_task/test_session_task_state.py b/tests/capabilities/background_task/test_session_task_state.py index 74513df3d..d7cedcb63 100644 --- a/tests/capabilities/background_task/test_session_task_state.py +++ b/tests/capabilities/background_task/test_session_task_state.py @@ -35,10 +35,10 @@ import anyio import pytest -from agentpool.capabilities.background_task.capability import ( +from wolfharness.capabilities.background_task.capability import ( BackgroundTaskCapability, ) -from agentpool.capabilities.background_task.types import BackgroundTask, SessionTaskState +from wolfharness.capabilities.background_task.types import BackgroundTask, SessionTaskState # --------------------------------------------------------------------------- @@ -147,7 +147,7 @@ class _MockRunContext: """A lightweight mock AgentRunContext. Real AgentRunContext cannot be imported in this test directory due to - the ``tests/agentpool/__init__.py`` shadowing the ``agentpool`` package. + the ``tests/wolfharness/__init__.py`` shadowing the ``wolfharness`` package. This mock provides the attributes needed by the capability: ``child_done_events``, ``_run_handle``, ``session_id``, ``run_id``. """ diff --git a/tests/capabilities/background_task/test_types.py b/tests/capabilities/background_task/test_types.py index b1e61a96f..2cb2a6cf5 100644 --- a/tests/capabilities/background_task/test_types.py +++ b/tests/capabilities/background_task/test_types.py @@ -7,8 +7,8 @@ import pytest -from agentpool.capabilities.background_task import BackgroundTask, TaskHandle, TaskStatus -from agentpool.capabilities.background_task.types import TaskStatus as TaskStatusFromTypes +from wolfharness.capabilities.background_task import BackgroundTask, TaskHandle, TaskStatus +from wolfharness.capabilities.background_task.types import TaskStatus as TaskStatusFromTypes def test_background_task_defaults() -> None: diff --git a/tests/capabilities/dcp/test_edge_cases.py b/tests/capabilities/dcp/test_edge_cases.py index 9767d7b74..98939bced 100644 --- a/tests/capabilities/dcp/test_edge_cases.py +++ b/tests/capabilities/dcp/test_edge_cases.py @@ -22,17 +22,17 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool.capabilities.dcp.block_store import CompressionBlockStore -from agentpool.capabilities.dcp.capability import DynamicContextPruningCapability -from agentpool.capabilities.dcp.state import ( +from wolfharness.capabilities.dcp.block_store import CompressionBlockStore +from wolfharness.capabilities.dcp.capability import DynamicContextPruningCapability +from wolfharness.capabilities.dcp.state import ( CompressionBlock, DCPState, PruneAction, WatermarkLevel, ) -from agentpool.capabilities.dcp.strategies import _is_pruned, _prune_part -from agentpool.capabilities.tool_output_budget import ToolOutputBudgetCapability -from agentpool_config.capabilities import ( +from wolfharness.capabilities.dcp.strategies import _is_pruned, _prune_part +from wolfharness.capabilities.tool_output_budget import ToolOutputBudgetCapability +from wolfharness_config.capabilities import ( GenericCapabilityConfig, ) @@ -206,7 +206,7 @@ async def test_protected_pattern_matches_nothing_all_prunable() -> None: # Build prunable list to verify "read" is not protected. state = cap._get_dcp_state(ctx) - from agentpool.capabilities.dcp.prunable_list import build_prunable_list + from wolfharness.capabilities.dcp.prunable_list import build_prunable_list build_prunable_list([msg1, msg2, msg3], state, cap._config) # "read" should appear in tool_id_list since "nonexistent_*" doesn't match it. @@ -233,7 +233,7 @@ async def test_star_glob_protects_all_tools() -> None: ctx = _make_run_context(messages=[msg1, msg2, msg3]) state = cap._get_dcp_state(ctx) - from agentpool.capabilities.dcp.prunable_list import build_prunable_list + from wolfharness.capabilities.dcp.prunable_list import build_prunable_list build_prunable_list([msg1, msg2, msg3], state, cap._config) # Since "*" is a literal string in protected_tools (not a glob), it won't @@ -326,7 +326,7 @@ async def test_decompress_on_non_pruned_tool_returns_error() -> None: is unavailable. We provide a real ``SessionData`` mock so the state lookup succeeds and the decompress logic can run. """ - from agentpool.sessions.models import SessionData + from wolfharness.sessions.models import SessionData cap = DynamicContextPruningCapability() @@ -560,7 +560,7 @@ def test_dynamic_context_type_raises_error() -> None: which tries to import ``dynamic_context`` as a module path — that fails. """ # "dynamic_context" is not a known built-in type. - from agentpool_config.capabilities import is_known_capability_type + from wolfharness_config.capabilities import is_known_capability_type assert not is_known_capability_type("dynamic_context") diff --git a/tests/capabilities/dcp/test_integration.py b/tests/capabilities/dcp/test_integration.py index 76280fb36..2a944e559 100644 --- a/tests/capabilities/dcp/test_integration.py +++ b/tests/capabilities/dcp/test_integration.py @@ -30,16 +30,16 @@ from pydantic_ai.usage import RequestUsage import pytest -from agentpool.capabilities.dcp.capability import DynamicContextPruningCapability -from agentpool.capabilities.dcp.state import ( +from wolfharness.capabilities.dcp.capability import DynamicContextPruningCapability +from wolfharness.capabilities.dcp.state import ( DCPState, DistillTarget, PruneAction, WatermarkLevel, ) -from agentpool.capabilities.dcp.strategies import _is_pruned -from agentpool.capabilities.dcp.tools import decompress_tool -from agentpool.sessions.models import SessionData +from wolfharness.capabilities.dcp.strategies import _is_pruned +from wolfharness.capabilities.dcp.tools import decompress_tool +from wolfharness.sessions.models import SessionData pytestmark = pytest.mark.integration @@ -861,7 +861,7 @@ async def test_prune_then_decompress_same_turn() -> None: because prune_tool applies the action to state.current_messages immediately. """ - from agentpool.capabilities.dcp.tools import decompress_tool, prune_tool + from wolfharness.capabilities.dcp.tools import decompress_tool, prune_tool session_data, state = _make_session_with_state() ctx = _make_run_context(session_data=session_data) @@ -896,7 +896,7 @@ async def test_distill_then_decompress_same_turn() -> None: because distill_tool applies the action to state.current_messages immediately. """ - from agentpool.capabilities.dcp.tools import decompress_tool, distill_tool + from wolfharness.capabilities.dcp.tools import decompress_tool, distill_tool session_data, state = _make_session_with_state() ctx = _make_run_context(session_data=session_data) diff --git a/tests/capabilities/dcp/test_unit.py b/tests/capabilities/dcp/test_unit.py index e12a8811a..3847a8935 100644 --- a/tests/capabilities/dcp/test_unit.py +++ b/tests/capabilities/dcp/test_unit.py @@ -23,22 +23,22 @@ ) import pytest -from agentpool.capabilities.dcp.block_store import CompressionBlockStore -from agentpool.capabilities.dcp.config import DCPConfig -from agentpool.capabilities.dcp.nudge import build_nudge_text -from agentpool.capabilities.dcp.prunable_list import ( +from wolfharness.capabilities.dcp.block_store import CompressionBlockStore +from wolfharness.capabilities.dcp.config import DCPConfig +from wolfharness.capabilities.dcp.nudge import build_nudge_text +from wolfharness.capabilities.dcp.prunable_list import ( META_TOOL_NAMES, build_prunable_list, inject_prunable_list, ) -from agentpool.capabilities.dcp.state import ( +from wolfharness.capabilities.dcp.state import ( CompressionBlock, DCPState, DistillTarget, PruneAction, WatermarkLevel, ) -from agentpool.capabilities.dcp.strategies import ( +from wolfharness.capabilities.dcp.strategies import ( PrunableState, _dedup_exact, _is_pruned, @@ -46,17 +46,17 @@ _strip_thinking_content, purge_failed_tool_inputs, ) -from agentpool.capabilities.dcp.token_utils import ( +from wolfharness.capabilities.dcp.token_utils import ( calculate_context_pressure, estimate_tokens, ) -from agentpool.capabilities.dcp.tools import ( +from wolfharness.capabilities.dcp.tools import ( decompress_tool, distill_tool, prune_tool, ) -from agentpool.capabilities.dcp.watermark import WatermarkStateMachine -from agentpool.sessions.models import SessionData +from wolfharness.capabilities.dcp.watermark import WatermarkStateMachine +from wolfharness.sessions.models import SessionData pytestmark = pytest.mark.unit diff --git a/tests/capabilities/test_agent_context.py b/tests/capabilities/test_agent_context.py index 6a83eb92b..686ad6653 100644 --- a/tests/capabilities/test_agent_context.py +++ b/tests/capabilities/test_agent_context.py @@ -16,9 +16,9 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator -from agentpool.capabilities.agent_context import AgentContextDeps -from agentpool.capabilities.delegation import AgentNotFoundError, DelegationService -from agentpool.host.context import HostContext, RunScope +from wolfharness.capabilities.agent_context import AgentContextDeps +from wolfharness.capabilities.delegation import AgentNotFoundError, DelegationService +from wolfharness.host.context import HostContext, RunScope pytestmark = pytest.mark.unit @@ -91,7 +91,7 @@ def _make_session_state() -> Any: def _make_agent_registry() -> Any: """Build an AgentRegistry-like object for testing.""" - from agentpool.host.registry import AgentRegistry + from wolfharness.host.registry import AgentRegistry return AgentRegistry() @@ -231,7 +231,7 @@ def test_agent_context_team_mode_config_defaults_none() -> None: @pytest.mark.unit def test_agent_context_team_mode_config_accepts_instance() -> None: """AgentContextDeps accepts a TeamModeConfig instance.""" - from agentpool_config.team_mode import TeamModeConfig + from wolfharness_config.team_mode import TeamModeConfig config = TeamModeConfig(enabled=True, member_eligible=["translator"]) ctx = AgentContextDeps( @@ -255,7 +255,7 @@ def test_agent_context_team_mode_config_accepts_instance() -> None: def test_resolve_agent_context_from_deps_direct() -> None: """resolve_agent_context_from_deps returns deps when it is directly an AgentContextDeps.""" - from agentpool.capabilities.agent_context import resolve_agent_context_from_deps + from wolfharness.capabilities.agent_context import resolve_agent_context_from_deps agent_ctx = _make_agent_context() result = resolve_agent_context_from_deps(agent_ctx) @@ -264,8 +264,8 @@ def test_resolve_agent_context_from_deps_direct() -> None: def test_resolve_agent_context_from_deps_runtime_context() -> None: """resolve_agent_context_from_deps unwraps .data from RuntimeAgentContext.""" - from agentpool.agents.context import AgentContext as RuntimeAgentContext - from agentpool.capabilities.agent_context import resolve_agent_context_from_deps + from wolfharness.agents.context import AgentContext as RuntimeAgentContext + from wolfharness.capabilities.agent_context import resolve_agent_context_from_deps agent_ctx = _make_agent_context() runtime_ctx = RuntimeAgentContext(node=MagicMock()) @@ -277,7 +277,7 @@ def test_resolve_agent_context_from_deps_runtime_context() -> None: def test_resolve_agent_context_from_deps_none() -> None: """resolve_agent_context_from_deps raises RuntimeError when deps is None.""" - from agentpool.capabilities.agent_context import resolve_agent_context_from_deps + from wolfharness.capabilities.agent_context import resolve_agent_context_from_deps with pytest.raises( RuntimeError, match=r"TestCap requires AgentContextDeps as deps\. Got: None" @@ -287,8 +287,8 @@ def test_resolve_agent_context_from_deps_none() -> None: def test_resolve_agent_context_from_deps_runtime_ctx_none_data() -> None: """resolve_agent_context_from_deps raises RuntimeError when .data is None.""" - from agentpool.agents.context import AgentContext as RuntimeAgentContext - from agentpool.capabilities.agent_context import resolve_agent_context_from_deps + from wolfharness.agents.context import AgentContext as RuntimeAgentContext + from wolfharness.capabilities.agent_context import resolve_agent_context_from_deps runtime_ctx = RuntimeAgentContext(node=MagicMock()) runtime_ctx.data = None @@ -301,7 +301,7 @@ def test_resolve_agent_context_from_deps_runtime_ctx_none_data() -> None: def test_resolve_agent_context_from_deps_neither_type() -> None: """resolve_agent_context_from_deps raises RuntimeError for unknown deps type.""" - from agentpool.capabilities.agent_context import resolve_agent_context_from_deps + from wolfharness.capabilities.agent_context import resolve_agent_context_from_deps with pytest.raises(RuntimeError, match=r"TestCap requires AgentContextDeps as deps\. Got: str"): resolve_agent_context_from_deps("not a context", capability_name="TestCap") diff --git a/tests/capabilities/test_agent_context_resources_unused.py b/tests/capabilities/test_agent_context_resources_unused.py index 5cdf3e17d..e963b370b 100644 --- a/tests/capabilities/test_agent_context_resources_unused.py +++ b/tests/capabilities/test_agent_context_resources_unused.py @@ -44,7 +44,7 @@ def test_no_agent_context_resources_reads() -> None: indicate a read, excluding: - Import statements - Comments/docstrings - - The agentpool_sync module (unrelated 'resources' attribute) + - The wolfharness_sync module (unrelated 'resources' attribute) - Dataclass field definitions """ # Look for patterns like `.resources.list()`, `.resources.read(`, etc. diff --git a/tests/capabilities/test_code_mode_capability.py b/tests/capabilities/test_code_mode_capability.py index 399146b13..9ce3f4f31 100644 --- a/tests/capabilities/test_code_mode_capability.py +++ b/tests/capabilities/test_code_mode_capability.py @@ -9,8 +9,8 @@ from pydantic_ai.toolsets import FunctionToolset import pytest -from agentpool.capabilities.code_mode_capability import CodeModeCapability -from agentpool.tools.base import FunctionTool +from wolfharness.capabilities.code_mode_capability import CodeModeCapability +from wolfharness.tools.base import FunctionTool pytestmark = pytest.mark.unit diff --git a/tests/capabilities/test_combined_toolset.py b/tests/capabilities/test_combined_toolset.py index 5528babb8..fd9b93da4 100644 --- a/tests/capabilities/test_combined_toolset.py +++ b/tests/capabilities/test_combined_toolset.py @@ -10,10 +10,10 @@ from pydantic_ai.toolsets import CombinedToolset, FunctionToolset import pytest -from agentpool.capabilities.change_event import ChangeEvent -from agentpool.capabilities.combined_toolset import CombinedToolsetCapability -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.tools.base import Tool +from wolfharness.capabilities.change_event import ChangeEvent +from wolfharness.capabilities.combined_toolset import CombinedToolsetCapability +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.tools.base import Tool pytestmark = pytest.mark.unit @@ -67,7 +67,7 @@ def name(self) -> str: def get_toolset(self) -> Any: if not self._tools: return None - from agentpool.tools.tool_wrapping import wrap_tool_for_pydantic_ai + from wolfharness.tools.tool_wrapping import wrap_tool_for_pydantic_ai pa_tools = [wrap_tool_for_pydantic_ai(tool) for tool in self._tools] return FunctionToolset(pa_tools, id=self._name) diff --git a/tests/capabilities/test_extension_registry.py b/tests/capabilities/test_extension_registry.py index 851de035b..d044d518e 100644 --- a/tests/capabilities/test_extension_registry.py +++ b/tests/capabilities/test_extension_registry.py @@ -16,8 +16,8 @@ import pytest -from agentpool.capabilities.change_event import ChangeEvent -from agentpool.capabilities.extension_registry import ( +from wolfharness.capabilities.change_event import ChangeEvent +from wolfharness.capabilities.extension_registry import ( CircularCompositionError, ExtensionRegistry, Scope, @@ -50,7 +50,7 @@ def __init__(self, name: str = "skill_cap", skills: dict[str, str] | None = None self._skills = skills or {"test-skill": "skill content"} async def list_skills(self) -> list[Any]: - from agentpool.capabilities.resource_protocols import SkillEntry + from wolfharness.capabilities.resource_protocols import SkillEntry return [ SkillEntry(name=n, description=d, uri=f"skill://{n}") for n, d in self._skills.items() @@ -79,17 +79,17 @@ async def list_tools(self) -> list[Any]: return [] async def call_tool(self, name: str, args: dict[str, Any]) -> Any: - from agentpool.capabilities.resource_protocols import ToolResult + from wolfharness.capabilities.resource_protocols import ToolResult return ToolResult(content="tool result") async def list_resources(self) -> list[Any]: - from agentpool.capabilities.resource_protocols import ResourceEntry + from wolfharness.capabilities.resource_protocols import ResourceEntry return [ResourceEntry(uri=u, name=n) for u, n in self._resources.items()] async def read_resource(self, uri: str) -> list[Any] | None: - from agentpool.capabilities.resource_protocols import TextResourceContent + from wolfharness.capabilities.resource_protocols import TextResourceContent content = self._resources.get(uri) if content is None: @@ -126,12 +126,12 @@ def __init__(self, name: str = "cmd_cap") -> None: super().__init__(name) async def list_commands(self) -> list[Any]: - from agentpool.capabilities.resource_protocols import CommandEntry + from wolfharness.capabilities.resource_protocols import CommandEntry return [CommandEntry(name="test-cmd", description="Test command")] async def get_command(self, name: str) -> Any: - from agentpool.capabilities.resource_protocols import CommandEntry + from wolfharness.capabilities.resource_protocols import CommandEntry if name == "test-cmd": return CommandEntry(name=name, description="Test command") @@ -145,7 +145,7 @@ def __init__(self, name: str = "template_cap") -> None: super().__init__(name) async def list_resource_templates(self) -> list[Any]: - from agentpool.capabilities.resource_protocols import ResourceTemplateEntry + from wolfharness.capabilities.resource_protocols import ResourceTemplateEntry return [ ResourceTemplateEntry( @@ -161,7 +161,7 @@ async def complete_resource_template( argument: Any, context: dict[str, str] | None = None, ) -> Any: - from agentpool.capabilities.resource_protocols import CompletionResult + from wolfharness.capabilities.resource_protocols import CompletionResult return CompletionResult(values=["completion1", "completion2"]) @@ -408,7 +408,7 @@ class TestURIRouting: @pytest.mark.asyncio async def test_resolve_skill_uri(self) -> None: - from agentpool.skills.skill import Skill + from wolfharness.skills.skill import Skill reg = ExtensionRegistry() skill_cap = FakeSkillResource(skills={"my-skill": "skill content here"}) diff --git a/tests/capabilities/test_extension_registry_errors.py b/tests/capabilities/test_extension_registry_errors.py index cd1e8b369..b09e35839 100644 --- a/tests/capabilities/test_extension_registry_errors.py +++ b/tests/capabilities/test_extension_registry_errors.py @@ -12,7 +12,7 @@ import pytest -from agentpool.capabilities.extension_registry import ( +from wolfharness.capabilities.extension_registry import ( ExtensionRegistry, Scope, ScopeLevel, @@ -37,7 +37,7 @@ def name(self) -> str: return self._name async def list_skills(self) -> list: - from agentpool.capabilities.resource_protocols import SkillEntry + from wolfharness.capabilities.resource_protocols import SkillEntry entries = [] for name, content in self._skills.items(): @@ -71,7 +71,7 @@ async def list_tools(self) -> list: return [] async def call_tool(self, name: str, args: dict[str, Any]) -> Any: - from agentpool.capabilities.resource_protocols import ToolResult + from wolfharness.capabilities.resource_protocols import ToolResult self._call_count += 1 if self._call_count <= self._timeout_count: @@ -115,7 +115,7 @@ async def test_corrupted_skill_not_resolvable(self) -> None: @pytest.mark.asyncio async def test_good_skill_still_resolvable(self) -> None: """Non-corrupted skills still resolve correctly.""" - from agentpool.skills.skill import Skill + from wolfharness.skills.skill import Skill reg = ExtensionRegistry() cap = CorruptSkillResource() @@ -159,7 +159,7 @@ async def test_other_capabilities_continue_working(self) -> None: class GoodMcpResource(TimeoutMcpResource): async def call_tool(self, name: str, args: dict[str, Any]) -> Any: - from agentpool.capabilities.resource_protocols import ToolResult + from wolfharness.capabilities.resource_protocols import ToolResult return ToolResult(content="good server working") diff --git a/tests/capabilities/test_extension_registry_integration.py b/tests/capabilities/test_extension_registry_integration.py index 315bad643..c3b9e1f6a 100644 --- a/tests/capabilities/test_extension_registry_integration.py +++ b/tests/capabilities/test_extension_registry_integration.py @@ -8,7 +8,7 @@ import pytest -from agentpool.capabilities.extension_registry import ( +from wolfharness.capabilities.extension_registry import ( ExtensionRegistry, Scope, ScopeLevel, @@ -30,7 +30,7 @@ def name(self) -> str: return self._name async def list_skills(self) -> list: - from agentpool.capabilities.resource_protocols import SkillEntry + from wolfharness.capabilities.resource_protocols import SkillEntry return [ SkillEntry(name=n, description=d, uri=f"skill://{n}") for n, d in self._skills.items() @@ -112,7 +112,7 @@ async def test_resolve_uri_session_scoped(self) -> None: Scope(level=ScopeLevel.SESSION, session_id="ses2"), ) - from agentpool.skills.skill import Skill + from wolfharness.skills.skill import Skill assert isinstance(result1, Skill) assert result1.instructions == "Session 1 content" diff --git a/tests/capabilities/test_filtered_toolset.py b/tests/capabilities/test_filtered_toolset.py index 3ba292819..f5946aa36 100644 --- a/tests/capabilities/test_filtered_toolset.py +++ b/tests/capabilities/test_filtered_toolset.py @@ -8,9 +8,9 @@ from pydantic_ai.toolsets import FilteredToolset import pytest -from agentpool.capabilities.filtered_toolset import FilteredToolsetCapability -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.tools.base import Tool +from wolfharness.capabilities.filtered_toolset import FilteredToolsetCapability +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.tools.base import Tool pytestmark = pytest.mark.unit @@ -196,7 +196,7 @@ async def test_get_toolset_wraps_concrete_toolset() -> None: tool_a = _make_test_tool("tool_a") tool_b = _make_test_tool("tool_b") - from agentpool.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability inner = FunctionToolsetCapability([tool_a, tool_b], name="test") @@ -219,7 +219,7 @@ async def test_concrete_toolset_filter_excludes_tools() -> None: tool_b = _make_test_tool("tool_b") tool_c = _make_test_tool("tool_c") - from agentpool.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability inner = FunctionToolsetCapability([tool_a, tool_b, tool_c], name="test") @@ -240,7 +240,7 @@ async def filter_func(_ctx: Any, tool_def: Any) -> bool: @pytest.mark.asyncio async def test_concrete_toolset_returns_none_when_inner_returns_none() -> None: """Concrete toolset path returns None when inner returns None.""" - from agentpool.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability inner = FunctionToolsetCapability(name="empty") @@ -268,7 +268,7 @@ async def test_on_change_delegates_to_wrapped() -> None: @pytest.mark.asyncio -async def test_on_change_returns_none_for_non_agentpool_capability() -> None: +async def test_on_change_returns_none_for_non_wolfharness_capability() -> None: """on_change() returns None when wrapped capability doesn't implement on_change.""" class _BareCapability: diff --git a/tests/capabilities/test_function_toolset.py b/tests/capabilities/test_function_toolset.py index 98e874557..d723f3c19 100644 --- a/tests/capabilities/test_function_toolset.py +++ b/tests/capabilities/test_function_toolset.py @@ -7,8 +7,8 @@ from pydantic_ai.toolsets import FunctionToolset import pytest -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.tools.base import Tool +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.tools.base import Tool pytestmark = pytest.mark.unit diff --git a/tests/capabilities/test_mcp_server_cap.py b/tests/capabilities/test_mcp_server_cap.py index 27543625a..347c781d5 100644 --- a/tests/capabilities/test_mcp_server_cap.py +++ b/tests/capabilities/test_mcp_server_cap.py @@ -21,9 +21,9 @@ from pydantic import AnyUrl import pytest -from agentpool.capabilities.change_event import ChangeEvent -from agentpool.capabilities.mcp_server_cap import McpServerCap -from agentpool.capabilities.resource_protocols import ( +from wolfharness.capabilities.change_event import ChangeEvent +from wolfharness.capabilities.mcp_server_cap import McpServerCap +from wolfharness.capabilities.resource_protocols import ( BlobResourceContent, ChangeObservable, CompletionArgument, @@ -36,7 +36,7 @@ ToolAccess, ToolEntry, ) -from agentpool.mcp_server.message_handler import MCPMessageHandler +from wolfharness.mcp_server.message_handler import MCPMessageHandler pytestmark = pytest.mark.unit @@ -850,8 +850,8 @@ async def callback() -> None: @pytest.mark.anyio async def test_mcpclient_subscribe_resource_delegates_to_session() -> None: """subscribe_resource calls ClientSession.subscribe_resource with AnyUrl.""" - from agentpool.mcp_server.client import MCPClient - from agentpool_config.mcp_server import StdioMCPServerConfig + from wolfharness.mcp_server.client import MCPClient + from wolfharness_config.mcp_server import StdioMCPServerConfig config = StdioMCPServerConfig(command="echo", args=["test"]) client = MCPClient(config) @@ -873,8 +873,8 @@ async def test_mcpclient_subscribe_resource_delegates_to_session() -> None: @pytest.mark.anyio async def test_mcpclient_unsubscribe_resource_delegates_to_session() -> None: """unsubscribe_resource calls ClientSession.unsubscribe_resource with AnyUrl.""" - from agentpool.mcp_server.client import MCPClient - from agentpool_config.mcp_server import StdioMCPServerConfig + from wolfharness.mcp_server.client import MCPClient + from wolfharness_config.mcp_server import StdioMCPServerConfig config = StdioMCPServerConfig(command="echo", args=["test"]) client = MCPClient(config) @@ -896,8 +896,8 @@ async def test_mcpclient_unsubscribe_resource_delegates_to_session() -> None: @pytest.mark.anyio async def test_mcpclient_subscribe_resource_not_connected_raises() -> None: """subscribe_resource raises RuntimeError when not connected.""" - from agentpool.mcp_server.client import MCPClient - from agentpool_config.mcp_server import StdioMCPServerConfig + from wolfharness.mcp_server.client import MCPClient + from wolfharness_config.mcp_server import StdioMCPServerConfig config = StdioMCPServerConfig(command="echo", args=["test"]) client = MCPClient(config) diff --git a/tests/capabilities/test_question_capability.py b/tests/capabilities/test_question_capability.py index 877bfe0df..62131eda4 100644 --- a/tests/capabilities/test_question_capability.py +++ b/tests/capabilities/test_question_capability.py @@ -8,8 +8,8 @@ from pydantic_ai.toolsets import FunctionToolset import pytest -from agentpool.agents.context import AgentContext -from agentpool.capabilities.question import QuestionCapability +from wolfharness.agents.context import AgentContext +from wolfharness.capabilities.question import QuestionCapability def test_get_toolset_returns_function_toolset_without_schemas(): diff --git a/tests/capabilities/test_registry.py b/tests/capabilities/test_registry.py index 981c62f6c..a99fefb9e 100644 --- a/tests/capabilities/test_registry.py +++ b/tests/capabilities/test_registry.py @@ -15,7 +15,7 @@ import pytest -from agentpool.capabilities.registry import ( +from wolfharness.capabilities.registry import ( CapabilityNotFoundError, discover_entry_point_capabilities, resolve_capability_type, @@ -28,7 +28,7 @@ if TYPE_CHECKING: from pydantic_ai.capabilities import AbstractCapability - from agentpool import AgentPool + from wolfharness import AgentPool # ---- Helpers ---- @@ -61,14 +61,14 @@ def _make_fake_entry_points( def test_discover_returns_mapping_from_entry_points() -> None: """discover_entry_point_capabilities returns a name→class mapping.""" - from agentpool.capabilities.function_toolset import FunctionToolsetCapability - from agentpool.capabilities.subagent_capability import SubagentCapability + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.capabilities.subagent_capability import SubagentCapability fake_eps = _make_fake_entry_points( {"function_tools": FunctionToolsetCapability, "subagent": SubagentCapability}, ) with patch( - "agentpool.capabilities.registry.entry_points", + "wolfharness.capabilities.registry.entry_points", return_value=fake_eps, ): result = discover_entry_point_capabilities() @@ -78,7 +78,7 @@ def test_discover_returns_mapping_from_entry_points() -> None: def test_discover_returns_empty_when_no_entry_points() -> None: """discover_entry_point_capabilities returns empty dict when no entry points.""" with patch( - "agentpool.capabilities.registry.entry_points", + "wolfharness.capabilities.registry.entry_points", return_value=[], ): result = discover_entry_point_capabilities() @@ -87,15 +87,15 @@ def test_discover_returns_empty_when_no_entry_points() -> None: def test_discover_first_wins_on_duplicate_names() -> None: """discover_entry_point_capabilities keeps the first entry on duplicate names.""" - from agentpool.capabilities.function_toolset import FunctionToolsetCapability - from agentpool.capabilities.subagent_capability import SubagentCapability + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.capabilities.subagent_capability import SubagentCapability fake_eps = [ _FakeEntryPoint("dup", FunctionToolsetCapability), _FakeEntryPoint("dup", SubagentCapability), ] with patch( - "agentpool.capabilities.registry.entry_points", + "wolfharness.capabilities.registry.entry_points", return_value=fake_eps, ): result = discover_entry_point_capabilities() @@ -133,7 +133,7 @@ def test_capability_not_found_error_with_empty_available() -> None: def test_resolve_capability_type_found() -> None: """resolve_capability_type returns the class when type is registered.""" - from agentpool.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability registry: dict[str, type[AbstractCapability[object]]] = { "function_tools": FunctionToolsetCapability, @@ -158,8 +158,8 @@ def test_resolve_capability_type_not_found_raises() -> None: def test_factory_compile_discovers_entry_point_capabilities(minimal_pool: AgentPool) -> None: """AgentFactory.compile() populates entry_point_capabilities from discovery.""" - from agentpool.capabilities.function_toolset import FunctionToolsetCapability - from agentpool.host.factory import AgentFactory + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.host.factory import AgentFactory fake_eps = _make_fake_entry_points({"function_tools": FunctionToolsetCapability}) @@ -167,10 +167,10 @@ def test_factory_compile_discovers_entry_point_capabilities(minimal_pool: AgentP with ( patch( - "agentpool.capabilities.registry.entry_points", + "wolfharness.capabilities.registry.entry_points", return_value=fake_eps, ), - patch("agentpool.host.registry.AgentRegistry"), + patch("wolfharness.host.registry.AgentRegistry"), ): # compile() iterates manifest.agents — use empty manifest. mock_manifest = MagicMock() @@ -183,9 +183,9 @@ def test_factory_compile_discovers_entry_point_capabilities(minimal_pool: AgentP def test_factory_resolve_capability_type_known(minimal_pool: AgentPool) -> None: """AgentFactory.resolve_capability_type resolves a known type.""" - from agentpool.capabilities.function_toolset import FunctionToolsetCapability - from agentpool.capabilities.subagent_capability import SubagentCapability - from agentpool.host.factory import AgentFactory + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.capabilities.subagent_capability import SubagentCapability + from wolfharness.host.factory import AgentFactory fake_eps = _make_fake_entry_points( {"function_tools": FunctionToolsetCapability, "subagent": SubagentCapability}, @@ -194,10 +194,10 @@ def test_factory_resolve_capability_type_known(minimal_pool: AgentPool) -> None: with ( patch( - "agentpool.capabilities.registry.entry_points", + "wolfharness.capabilities.registry.entry_points", return_value=fake_eps, ), - patch("agentpool.host.registry.AgentRegistry"), + patch("wolfharness.host.registry.AgentRegistry"), ): mock_manifest = MagicMock() mock_manifest.agents = {} @@ -210,18 +210,18 @@ def test_factory_resolve_capability_type_known(minimal_pool: AgentPool) -> None: def test_factory_resolve_capability_type_unknown_raises(minimal_pool: AgentPool) -> None: """AgentFactory.resolve_capability_type raises for unknown type.""" - from agentpool.capabilities.function_toolset import FunctionToolsetCapability - from agentpool.host.factory import AgentFactory + from wolfharness.capabilities.function_toolset import FunctionToolsetCapability + from wolfharness.host.factory import AgentFactory fake_eps = _make_fake_entry_points({"function_tools": FunctionToolsetCapability}) factory = AgentFactory(minimal_pool) with ( patch( - "agentpool.capabilities.registry.entry_points", + "wolfharness.capabilities.registry.entry_points", return_value=fake_eps, ), - patch("agentpool.host.registry.AgentRegistry"), + patch("wolfharness.host.registry.AgentRegistry"), ): mock_manifest = MagicMock() mock_manifest.agents = {} diff --git a/tests/capabilities/test_resource_capability.py b/tests/capabilities/test_resource_capability.py index 8626c0c31..0ce45b9a1 100644 --- a/tests/capabilities/test_resource_capability.py +++ b/tests/capabilities/test_resource_capability.py @@ -11,10 +11,10 @@ from pydantic_ai.toolsets import FunctionToolset import pytest -from agentpool.capabilities.agent_context import AgentContextDeps -from agentpool.capabilities.extension_registry import ExtensionRegistry, Scope, ScopeLevel -from agentpool.capabilities.resource_capability import ResourceCapability -from agentpool.capabilities.resource_protocols import ( +from wolfharness.capabilities.agent_context import AgentContextDeps +from wolfharness.capabilities.extension_registry import ExtensionRegistry, Scope, ScopeLevel +from wolfharness.capabilities.resource_capability import ResourceCapability +from wolfharness.capabilities.resource_protocols import ( BlobResourceContent, CompletionArgument, CompletionResult, @@ -23,7 +23,7 @@ SkillEntry, TextResourceContent, ) -from agentpool.host.context import RunScope +from wolfharness.host.context import RunScope if TYPE_CHECKING: @@ -1039,7 +1039,7 @@ async def test_resolve_agent_context_from_runtime_context() -> None: ctx.deps = agents.context.AgentContext, and our capabilities.agent_context.AgentContextDeps is at ctx.deps.data. """ - from agentpool.agents.context import AgentContext as RuntimeAgentContext + from wolfharness.agents.context import AgentContext as RuntimeAgentContext agent_ctx = _make_agent_context(registry=None) runtime_ctx = RuntimeAgentContext(node=MagicMock()) @@ -1070,7 +1070,7 @@ async def test_resolve_agent_context_none_deps() -> None: async def test_resolve_agent_context_runtime_ctx_none_data() -> None: """_resolve_agent_context raises RuntimeError when RuntimeAgentContext.data is None.""" - from agentpool.agents.context import AgentContext as RuntimeAgentContext + from wolfharness.agents.context import AgentContext as RuntimeAgentContext runtime_ctx = RuntimeAgentContext(node=MagicMock()) runtime_ctx.data = None diff --git a/tests/capabilities/test_resource_registration.py b/tests/capabilities/test_resource_registration.py index 5da44de20..ba5e7ca43 100644 --- a/tests/capabilities/test_resource_registration.py +++ b/tests/capabilities/test_resource_registration.py @@ -14,8 +14,8 @@ import pytest import yamling -from agentpool import AgentPool, AgentsManifest -from agentpool_config.nodes import BaseAgentConfig, ResourceConfig +from wolfharness import AgentPool, AgentsManifest +from wolfharness_config.nodes import BaseAgentConfig, ResourceConfig if TYPE_CHECKING: @@ -124,8 +124,8 @@ async def test_resource_capability_registered_after_enter(minimal_pool): but it should NOT appear in ``get_resource_access()`` results because it is a tool wrapper, not a ``ResourceAccess`` data provider. """ - from agentpool.capabilities.extension_registry import Scope, ScopeLevel - from agentpool.capabilities.resource_capability import ResourceCapability + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.resource_capability import ResourceCapability pool = minimal_pool assert pool.resource_capability is not None diff --git a/tests/capabilities/test_review_fixes.py b/tests/capabilities/test_review_fixes.py index f0ca81935..7b3707eea 100644 --- a/tests/capabilities/test_review_fixes.py +++ b/tests/capabilities/test_review_fixes.py @@ -15,7 +15,7 @@ import pytest -from agentpool.capabilities.mcp_server_cap import McpServerCap +from wolfharness.capabilities.mcp_server_cap import McpServerCap pytestmark = pytest.mark.unit @@ -24,7 +24,7 @@ if TYPE_CHECKING: from typing import Self - from agentpool.capabilities.resource_protocols import SkillEntry + from wolfharness.capabilities.resource_protocols import SkillEntry # --------------------------------------------------------------------------- @@ -225,8 +225,8 @@ class TestMatcherFnBackwardCompat: @pytest.mark.asyncio async def test_two_arg_matcher_fn_receives_skill_names(self) -> None: """Matcher functions expecting (messages, skill_names) should work.""" - from agentpool.capabilities.skill_manager_cap import SkillManagerCap - from agentpool.skills.skill import Skill + from wolfharness.capabilities.skill_manager_cap import SkillManagerCap + from wolfharness.skills.skill import Skill # Create a minimal skill skill = MagicMock(spec=Skill) @@ -269,7 +269,7 @@ def matcher_2arg(messages: Any, skill_names: list[str]) -> list[str]: @pytest.mark.asyncio async def test_one_arg_matcher_fn_still_works(self) -> None: """Single-arg matcher functions should continue to work.""" - from agentpool.capabilities.skill_manager_cap import SkillManagerCap + from wolfharness.capabilities.skill_manager_cap import SkillManagerCap skill = MagicMock() skill.name = "test-skill" @@ -322,13 +322,13 @@ async def test_resolve_uri_with_provider_routes_to_correct_cap(self) -> None: With D9, provider segment is removed. skill://shared-name iterates all caps and returns the first match. """ - from agentpool.capabilities.extension_registry import ( + from wolfharness.capabilities.extension_registry import ( ExtensionRegistry, Scope, ScopeLevel, ) - from agentpool.capabilities.resource_protocols import SkillEntry - from agentpool.skills.skill import Skill + from wolfharness.capabilities.resource_protocols import SkillEntry + from wolfharness.skills.skill import Skill class NamedSkillCap: """Fake SkillResource with a configurable serialization name.""" @@ -369,13 +369,13 @@ async def skill_exists(self, name: str) -> bool: @pytest.mark.asyncio async def test_resolve_uri_without_provider_iterates_all(self) -> None: """skill://name without provider should iterate all (backward compat).""" - from agentpool.capabilities.extension_registry import ( + from wolfharness.capabilities.extension_registry import ( ExtensionRegistry, Scope, ScopeLevel, ) - from agentpool.capabilities.resource_protocols import SkillEntry - from agentpool.skills.skill import Skill + from wolfharness.capabilities.resource_protocols import SkillEntry + from wolfharness.skills.skill import Skill class NamedSkillCap: def __init__(self, ser_name: str, skills: dict[str, str]) -> None: diff --git a/tests/capabilities/test_runloop_delegation_review.py b/tests/capabilities/test_runloop_delegation_review.py index 91d7183a9..3129089d9 100644 --- a/tests/capabilities/test_runloop_delegation_review.py +++ b/tests/capabilities/test_runloop_delegation_review.py @@ -14,12 +14,12 @@ import pytest -from agentpool.agents.events.events import StreamCompleteEvent -from agentpool.capabilities.runloop_delegation import RunLoopDelegationService -from agentpool.host.context import HostContext -from agentpool.host.registry import AgentRegistry -from agentpool.orchestrator.core import EventBus -from agentpool.orchestrator.run import RunHandle +from wolfharness.agents.events.events import StreamCompleteEvent +from wolfharness.capabilities.runloop_delegation import RunLoopDelegationService +from wolfharness.host.context import HostContext +from wolfharness.host.registry import AgentRegistry +from wolfharness.orchestrator.core import EventBus +from wolfharness.orchestrator.run import RunHandle pytestmark = pytest.mark.unit diff --git a/tests/capabilities/test_runloop_injection.py b/tests/capabilities/test_runloop_injection.py index 40f15fd99..96c128581 100644 --- a/tests/capabilities/test_runloop_injection.py +++ b/tests/capabilities/test_runloop_injection.py @@ -11,13 +11,13 @@ import pytest -from agentpool.agents.context import AgentRunContext -from agentpool.capabilities.agent_context import AgentContextDeps -from agentpool.capabilities.delegation import DelegationService -from agentpool.capabilities.runloop_delegation import RunLoopDelegationService -from agentpool.host.context import HostContext, RunScope -from agentpool.host.registry import AgentRegistry -from agentpool.orchestrator.run import RunHandle +from wolfharness.agents.context import AgentRunContext +from wolfharness.capabilities.agent_context import AgentContextDeps +from wolfharness.capabilities.delegation import DelegationService +from wolfharness.capabilities.runloop_delegation import RunLoopDelegationService +from wolfharness.host.context import HostContext, RunScope +from wolfharness.host.registry import AgentRegistry +from wolfharness.orchestrator.run import RunHandle pytestmark = pytest.mark.unit @@ -163,7 +163,7 @@ def test_delegation_service_lists_agents() -> None: def test_delegation_service_raises_for_unknown_agent() -> None: """Test that RunLoopDelegationService raises for unknown agents.""" - from agentpool.capabilities.delegation import AgentNotFoundError + from wolfharness.capabilities.delegation import AgentNotFoundError host = _make_host_context() registry = AgentRegistry() diff --git a/tests/capabilities/test_session_pool_get_client.py b/tests/capabilities/test_session_pool_get_client.py index 8590e14ab..af0ea0fe4 100644 --- a/tests/capabilities/test_session_pool_get_client.py +++ b/tests/capabilities/test_session_pool_get_client.py @@ -14,8 +14,8 @@ import pytest -from agentpool.mcp_server.session_pool import SessionConnectionPool -from agentpool_config.mcp_server import StdioMCPServerConfig +from wolfharness.mcp_server.session_pool import SessionConnectionPool +from wolfharness_config.mcp_server import StdioMCPServerConfig pytestmark = pytest.mark.unit @@ -40,11 +40,11 @@ async def test_get_client_returns_connected_client() -> None: with ( patch( - "agentpool.mcp_server.session_pool._create_transport", + "wolfharness.mcp_server.session_pool._create_transport", return_value=MagicMock(), ), patch( - "agentpool.mcp_server.client.MCPClient", + "wolfharness.mcp_server.client.MCPClient", return_value=mock_client_instance, ), ): @@ -84,11 +84,11 @@ def fake_create_transport(cfg: Any) -> Any: with ( patch( - "agentpool.mcp_server.session_pool._create_transport", + "wolfharness.mcp_server.session_pool._create_transport", side_effect=fake_create_transport, ), patch( - "agentpool.mcp_server.client.MCPClient", + "wolfharness.mcp_server.client.MCPClient", side_effect=[mock_client_1, mock_client_2], ), ): @@ -132,11 +132,11 @@ def fake_create_transport(cfg: Any) -> Any: with ( patch( - "agentpool.mcp_server.session_pool._create_transport", + "wolfharness.mcp_server.session_pool._create_transport", side_effect=fake_create_transport, ), patch( - "agentpool.mcp_server.client.MCPClient", + "wolfharness.mcp_server.client.MCPClient", side_effect=[mock_client_1, mock_client_2], ), ): diff --git a/tests/capabilities/test_skill_manager_cap_integration.py b/tests/capabilities/test_skill_manager_cap_integration.py index e7a8f6eba..dd9d2a5e9 100644 --- a/tests/capabilities/test_skill_manager_cap_integration.py +++ b/tests/capabilities/test_skill_manager_cap_integration.py @@ -15,12 +15,12 @@ from pydantic_ai.capabilities import AbstractCapability import pytest -from agentpool.capabilities.resource_protocols import ( +from wolfharness.capabilities.resource_protocols import ( SkillEntry, SkillResource, ) -from agentpool.capabilities.skill_manager_cap import SkillManagerCap -from agentpool.skills.skill import Skill +from wolfharness.capabilities.skill_manager_cap import SkillManagerCap +from wolfharness.skills.skill import Skill pytestmark = pytest.mark.unit @@ -467,7 +467,7 @@ async def test_safe_uri_flat_form() -> None: """Skill.safe_uri returns flat skill://{name} for local skills.""" from upathtools import UPath - from agentpool.skills.skill import Skill + from wolfharness.skills.skill import Skill # Local filesystem skill local_skill = Skill( diff --git a/tests/capabilities/test_skill_manager_cap_tools.py b/tests/capabilities/test_skill_manager_cap_tools.py index b04ba3081..c8e180389 100644 --- a/tests/capabilities/test_skill_manager_cap_tools.py +++ b/tests/capabilities/test_skill_manager_cap_tools.py @@ -3,7 +3,7 @@ Covers ``SkillManagerCap._load_skill_impl`` / ``_list_skills_impl`` and the bare-name helpers (``_load_visible_bare_skill`` / ``_available_skill_names``), which are the real path pydantic-ai agents use (vs. the backward-compat -wrappers in ``agentpool_toolsets/builtin/skills.py``). +wrappers in ``wolfharness_toolsets/builtin/skills.py``). Specifically verifies: - bare-name load of a local skill @@ -22,9 +22,9 @@ import pytest -from agentpool.capabilities.resource_protocols import SkillEntry, SkillResource -from agentpool.capabilities.skill_manager_cap import SkillManagerCap -from agentpool.skills.skill import Skill +from wolfharness.capabilities.resource_protocols import SkillEntry, SkillResource +from wolfharness.capabilities.skill_manager_cap import SkillManagerCap +from wolfharness.skills.skill import Skill pytestmark = pytest.mark.unit @@ -73,7 +73,7 @@ def _local_skill(name: str, desc: str = "local") -> Skill: def _make_ctx(pool: Any, node_name: str | None = None) -> Any: """Build a RunContext-like object with a RuntimeAgentContext deps.""" - from agentpool.agents.context import AgentContext as RuntimeAgentContext + from wolfharness.agents.context import AgentContext as RuntimeAgentContext node = MagicMock() node.name = node_name if node_name is not None else "default-node" diff --git a/tests/capabilities/test_skill_tool_registration.py b/tests/capabilities/test_skill_tool_registration.py index 16167d82f..4f1310e72 100644 --- a/tests/capabilities/test_skill_tool_registration.py +++ b/tests/capabilities/test_skill_tool_registration.py @@ -35,14 +35,14 @@ ) import pytest -from agentpool.capabilities.resource_protocols import ( +from wolfharness.capabilities.resource_protocols import ( SkillEntry, SkillResource, ) -from agentpool.capabilities.skill_manager_cap import SkillManagerCap -from agentpool.skills.skill import Skill -from agentpool.skills.skill_tool_manager import SkillToolManager -from agentpool_config.skills import SkillMcpServerConfig, SkillToolConfig +from wolfharness.capabilities.skill_manager_cap import SkillManagerCap +from wolfharness.skills.skill import Skill +from wolfharness.skills.skill_tool_manager import SkillToolManager +from wolfharness_config.skills import SkillMcpServerConfig, SkillToolConfig pytestmark = pytest.mark.unit @@ -480,7 +480,7 @@ def test_invalid_import_path_graceful_error() -> None: ) manager = SkillToolManager() - with patch("agentpool.capabilities.skill_manager_cap.logger"): + with patch("wolfharness.capabilities.skill_manager_cap.logger"): cap = SkillManagerCap( local_skills={"bad-skill": bad_skill, "good-skill": good_skill}, tool_manager=manager, @@ -518,7 +518,7 @@ def test_mcp_creation_failure_other_skills_unaffected() -> None: ) manager = SkillToolManager() - with patch("agentpool.capabilities.skill_manager_cap.logger"): + with patch("wolfharness.capabilities.skill_manager_cap.logger"): cap = SkillManagerCap( local_skills={ "bad-mcp-skill": bad_mcp_skill, diff --git a/tests/capabilities/test_skill_watcher.py b/tests/capabilities/test_skill_watcher.py index c69b422bb..a7ad6ab89 100644 --- a/tests/capabilities/test_skill_watcher.py +++ b/tests/capabilities/test_skill_watcher.py @@ -12,7 +12,7 @@ import pytest -from agentpool.capabilities.skill_watcher import SkillFilesystemWatcher +from wolfharness.capabilities.skill_watcher import SkillFilesystemWatcher pytestmark = pytest.mark.unit diff --git a/tests/capabilities/test_subagent_capability.py b/tests/capabilities/test_subagent_capability.py index 78c0a21cd..bcedf8344 100644 --- a/tests/capabilities/test_subagent_capability.py +++ b/tests/capabilities/test_subagent_capability.py @@ -9,10 +9,10 @@ from pydantic_ai.toolsets import FunctionToolset import pytest -from agentpool.capabilities.agent_context import AgentContextDeps -from agentpool.capabilities.delegation import AgentNotFoundError, DelegationService -from agentpool.capabilities.subagent_capability import SubagentCapability -from agentpool.host.context import RunScope +from wolfharness.capabilities.agent_context import AgentContextDeps +from wolfharness.capabilities.delegation import AgentNotFoundError, DelegationService +from wolfharness.capabilities.subagent_capability import SubagentCapability +from wolfharness.host.context import RunScope pytestmark = pytest.mark.unit @@ -246,7 +246,7 @@ async def test_resolve_agent_context_from_runtime_context() -> None: ctx.deps = agents.context.AgentContext, and our capabilities.agent_context.AgentContextDeps is at ctx.deps.data. """ - from agentpool.agents.context import AgentContext as RuntimeAgentContext + from wolfharness.agents.context import AgentContext as RuntimeAgentContext delegation = FakeDelegationService(agents=["alpha", "beta"]) host = MagicMock() @@ -285,7 +285,7 @@ async def test_resolve_agent_context_none_deps() -> None: async def test_resolve_agent_context_runtime_ctx_none_data() -> None: """_resolve_agent_context raises RuntimeError when RuntimeAgentContext.data is None.""" - from agentpool.agents.context import AgentContext as RuntimeAgentContext + from wolfharness.agents.context import AgentContext as RuntimeAgentContext runtime_ctx = RuntimeAgentContext(node=MagicMock()) runtime_ctx.data = None diff --git a/tests/capabilities/test_tool_display_capability.py b/tests/capabilities/test_tool_display_capability.py index c5e412d9c..dc57d3353 100644 --- a/tests/capabilities/test_tool_display_capability.py +++ b/tests/capabilities/test_tool_display_capability.py @@ -10,11 +10,11 @@ from pydantic_ai.toolsets import RenamedToolset import pytest -from agentpool.capabilities.tool_display_capability import ToolDisplayCapability +from wolfharness.capabilities.tool_display_capability import ToolDisplayCapability if TYPE_CHECKING: - from agentpool.agents.events import DiffContentItem + from wolfharness.agents.events import DiffContentItem pytestmark = pytest.mark.unit diff --git a/tests/capabilities/test_tool_display_integration.py b/tests/capabilities/test_tool_display_integration.py index f41d4b208..a34e86465 100644 --- a/tests/capabilities/test_tool_display_integration.py +++ b/tests/capabilities/test_tool_display_integration.py @@ -15,14 +15,14 @@ from pydantic_ai.toolsets.renamed import RenamedToolset import pytest -from agentpool.capabilities.tool_display_capability import ToolDisplayCapability -from agentpool.capabilities.viking import VikingCapability -from agentpool.capabilities.viking.identity import VikingIdentity -from agentpool_config.capabilities import VikingCapabilityConfig, build_capability +from wolfharness.capabilities.tool_display_capability import ToolDisplayCapability +from wolfharness.capabilities.viking import VikingCapability +from wolfharness.capabilities.viking.identity import VikingIdentity +from wolfharness_config.capabilities import VikingCapabilityConfig, build_capability if TYPE_CHECKING: - from agentpool.agents.events import DiffContentItem + from wolfharness.agents.events import DiffContentItem pytestmark = pytest.mark.integration diff --git a/tests/capabilities/test_tool_display_rich.py b/tests/capabilities/test_tool_display_rich.py index f39ce6dca..32c60d0d2 100644 --- a/tests/capabilities/test_tool_display_rich.py +++ b/tests/capabilities/test_tool_display_rich.py @@ -15,7 +15,7 @@ from pydantic_ai.tools import ToolDefinition import pytest -from agentpool.capabilities.tool_display_capability import ( +from wolfharness.capabilities.tool_display_capability import ( ToolDisplayCapability, _parse_locations, _unwrap_result, @@ -23,7 +23,7 @@ if TYPE_CHECKING: - from agentpool.agents.events import TextContentItem + from wolfharness.agents.events import TextContentItem pytestmark = pytest.mark.unit @@ -302,7 +302,7 @@ async def test_read_tool_gets_rich_not_diff(self) -> None: # rich target takes precedence: exactly one tool_call_progress (rich content) assert events.tool_call_progress.await_count == 1 - from agentpool.agents.events import TextContentItem + from wolfharness.agents.events import TextContentItem items = events.tool_call_progress.await_args.kwargs["items"] assert len(items) == 1 @@ -329,7 +329,7 @@ async def test_write_tool_gets_diff_not_rich(self) -> None: ) assert events.tool_call_progress.await_count == 1 - from agentpool.agents.events import DiffContentItem + from wolfharness.agents.events import DiffContentItem items = events.tool_call_progress.await_args.kwargs["items"] assert len(items) == 1 diff --git a/tests/capabilities/test_tool_display_semantics.py b/tests/capabilities/test_tool_display_semantics.py index bbbf0b185..044973c78 100644 --- a/tests/capabilities/test_tool_display_semantics.py +++ b/tests/capabilities/test_tool_display_semantics.py @@ -22,11 +22,11 @@ from pydantic_ai.toolsets import AbstractToolset, RenamedToolset import pytest -from agentpool.capabilities.tool_display_capability import ToolDisplayCapability +from wolfharness.capabilities.tool_display_capability import ToolDisplayCapability if TYPE_CHECKING: - from agentpool.agents.events import DiffContentItem + from wolfharness.agents.events import DiffContentItem pytestmark = pytest.mark.unit diff --git a/tests/capabilities/test_transport_reuse.py b/tests/capabilities/test_transport_reuse.py index d92076f77..044ea6781 100644 --- a/tests/capabilities/test_transport_reuse.py +++ b/tests/capabilities/test_transport_reuse.py @@ -11,9 +11,9 @@ import pytest -from agentpool.capabilities.mcp_server_cap import McpServerCap -from agentpool.mcp_server.session_pool import SessionConnectionPool -from agentpool_config.mcp_server import StdioMCPServerConfig +from wolfharness.capabilities.mcp_server_cap import McpServerCap +from wolfharness.mcp_server.session_pool import SessionConnectionPool +from wolfharness_config.mcp_server import StdioMCPServerConfig pytestmark = pytest.mark.unit @@ -44,11 +44,11 @@ def fake_create_transport(cfg: Any) -> Any: with ( patch( - "agentpool.mcp_server.session_pool._create_transport", + "wolfharness.mcp_server.session_pool._create_transport", side_effect=fake_create_transport, ), patch( - "agentpool.mcp_server.client.MCPClient", + "wolfharness.mcp_server.client.MCPClient", side_effect=[mock_client_1, mock_client_2], ), ): @@ -92,11 +92,11 @@ def fake_create_transport(cfg: Any) -> Any: with ( patch( - "agentpool.mcp_server.session_pool._create_transport", + "wolfharness.mcp_server.session_pool._create_transport", side_effect=fake_create_transport, ), patch( - "agentpool.mcp_server.client.MCPClient", + "wolfharness.mcp_server.client.MCPClient", side_effect=[mock_client_1, mock_client_2], ), ): diff --git a/tests/capabilities/viking/conftest.py b/tests/capabilities/viking/conftest.py index 9574f017d..9daedffb2 100644 --- a/tests/capabilities/viking/conftest.py +++ b/tests/capabilities/viking/conftest.py @@ -13,7 +13,7 @@ import pytest -from agentpool.capabilities.viking import VikingCapability +from wolfharness.capabilities.viking import VikingCapability def build_mock_client() -> AsyncMock: diff --git a/tests/capabilities/viking/test_viking.py b/tests/capabilities/viking/test_viking.py index 6e459efe7..d707912f8 100644 --- a/tests/capabilities/viking/test_viking.py +++ b/tests/capabilities/viking/test_viking.py @@ -17,27 +17,27 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool.capabilities.viking import VikingCapability, _normalize_search_results -from agentpool.capabilities.viking.identity import VikingIdentity, _try_decode_api_key -from agentpool.capabilities.viking.profile import ( +from wolfharness.capabilities.viking import VikingCapability, _normalize_search_results +from wolfharness.capabilities.viking.identity import VikingIdentity, _try_decode_api_key +from wolfharness.capabilities.viking.profile import ( _derive_context_hint, _format_profile_block, ) -from agentpool.capabilities.viking.recall import ( +from wolfharness.capabilities.viking.recall import ( _extract_latest_user_prompt, _format_recall_block, _inject_system_message, _rank_and_dedup, ) -from agentpool.capabilities.viking.tools import build_tools -from agentpool.capabilities.viking.utils import ( +from wolfharness.capabilities.viking.tools import build_tools +from wolfharness.capabilities.viking.utils import ( add_line_numbers, format_ls_entries, format_search_results, is_viking_uri, truncate_text, ) -from agentpool_config.capabilities import VikingCapabilityConfig +from wolfharness_config.capabilities import VikingCapabilityConfig pytestmark = pytest.mark.unit @@ -154,7 +154,7 @@ def test_discriminator_works(self) -> None: """The 'type' field discriminator correctly identifies VikingCapabilityConfig.""" import typing - from agentpool_config.capabilities import BuiltinCapabilityConfig + from wolfharness_config.capabilities import BuiltinCapabilityConfig cfg = VikingCapabilityConfig() assert cfg.type == "viking" @@ -2159,7 +2159,7 @@ class TestResourceAccessProtocol: def test_isinstance_resource_access(self, viking_cap: VikingCapability) -> None: """VikingCapability should be recognized as ResourceAccess.""" - from agentpool.capabilities.resource_protocols import ResourceAccess + from wolfharness.capabilities.resource_protocols import ResourceAccess assert isinstance(viking_cap, ResourceAccess) @@ -2315,44 +2315,44 @@ def test_supports_modality_no_caps(self) -> None: assert cap._supports_modality("audio/mpeg") is False def test_supports_modality_image(self) -> None: - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities cap = VikingCapability(model_capabilities=ModelCapabilities(image_input=True)) assert cap._supports_modality("image/png") is True assert cap._supports_modality("image/jpeg") is True def test_supports_modality_image_false(self) -> None: - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities cap = VikingCapability(model_capabilities=ModelCapabilities(image_input=False)) assert cap._supports_modality("image/png") is False def test_supports_modality_audio(self) -> None: - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities cap = VikingCapability(model_capabilities=ModelCapabilities(audio_input=True)) assert cap._supports_modality("audio/mpeg") is True def test_supports_modality_video(self) -> None: - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities cap = VikingCapability(model_capabilities=ModelCapabilities(video_input=True)) assert cap._supports_modality("video/mp4") is True def test_supports_modality_document(self) -> None: - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities cap = VikingCapability(model_capabilities=ModelCapabilities(document_input=True)) assert cap._supports_modality("application/pdf") is True def test_supports_modality_unknown(self) -> None: - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities cap = VikingCapability(model_capabilities=ModelCapabilities(image_input=True)) assert cap._supports_modality("application/zip") is False def test_guess_extension_known(self) -> None: - from agentpool.capabilities.viking import _guess_extension + from wolfharness.capabilities.viking import _guess_extension assert _guess_extension("image/png") == "png" assert _guess_extension("image/jpeg") == "jpg" @@ -2361,7 +2361,7 @@ def test_guess_extension_known(self) -> None: assert _guess_extension("application/pdf") == "pdf" def test_guess_extension_unknown(self) -> None: - from agentpool.capabilities.viking import _guess_extension + from wolfharness.capabilities.viking import _guess_extension assert _guess_extension("application/zip") == "bin" @@ -2404,7 +2404,7 @@ async def test_before_model_request_text_only_model( UserPromptPart, ) - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities cap = VikingCapability( multimodal_bridge=True, @@ -2439,7 +2439,7 @@ async def test_before_model_request_multimodal_with_url( UserPromptPart, ) - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities cap = VikingCapability( multimodal_bridge=True, @@ -2471,7 +2471,7 @@ async def test_before_model_request_multimodal_no_url( UserPromptPart, ) - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities cap = VikingCapability( multimodal_bridge=True, @@ -2496,7 +2496,7 @@ async def test_before_model_request_upload_failure( UserPromptPart, ) - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities cap = VikingCapability( multimodal_bridge=True, @@ -2559,7 +2559,7 @@ async def test_upload_binary_no_client(self) -> None: assert uri is None async def test_for_run_preserves_model_capabilities(self) -> None: - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities caps = ModelCapabilities(image_input=True) cap = VikingCapability(model_capabilities=caps, multimodal_bridge=True) @@ -4177,7 +4177,7 @@ class TestCompaction: def test_estimate_tokens_ascii(self) -> None: """ASCII text: chars / 4.""" - from agentpool.capabilities.viking.compaction import _estimate_tokens + from wolfharness.capabilities.viking.compaction import _estimate_tokens assert _estimate_tokens("") == 0 assert _estimate_tokens("hello") == 1 # 5 // 4 = 1 @@ -4186,7 +4186,7 @@ def test_estimate_tokens_ascii(self) -> None: def test_estimate_tokens_cjk(self) -> None: """CJK characters count as 1 token each.""" - from agentpool.capabilities.viking.compaction import _estimate_tokens + from wolfharness.capabilities.viking.compaction import _estimate_tokens # Each CJK char is 1 token assert _estimate_tokens("你好") == 2 @@ -4196,14 +4196,14 @@ def test_estimate_tokens_cjk(self) -> None: def test_estimate_tokens_mixed(self) -> None: """Mixed ASCII + CJK: ASCII at 4:1, CJK at 1:1.""" - from agentpool.capabilities.viking.compaction import _estimate_tokens + from wolfharness.capabilities.viking.compaction import _estimate_tokens # 2 CJK chars (2 tokens) + 8 ASCII chars (2 tokens) = 4 assert _estimate_tokens("你好abcdefgh") == 4 def test_estimate_tokens_empty(self) -> None: """Empty string returns 0.""" - from agentpool.capabilities.viking.compaction import _estimate_tokens + from wolfharness.capabilities.viking.compaction import _estimate_tokens assert _estimate_tokens("") == 0 @@ -4213,7 +4213,7 @@ def test_split_archivable_basic(self) -> None: """Split messages keeping last N turns.""" from pydantic_ai.messages import ModelRequest, ModelResponse, TextPart, UserPromptPart - from agentpool.capabilities.viking.compaction import _split_archivable + from wolfharness.capabilities.viking.compaction import _split_archivable # 4 user turns, keep last 2 messages: list[Any] = [] @@ -4235,7 +4235,7 @@ def test_split_archivable_keep_all_when_fewer_turns(self) -> None: """Keep all messages when fewer turns than keep_recent_turns.""" from pydantic_ai.messages import ModelRequest, UserPromptPart - from agentpool.capabilities.viking.compaction import _split_archivable + from wolfharness.capabilities.viking.compaction import _split_archivable messages = [ ModelRequest(parts=[UserPromptPart(content="Turn 1")]), @@ -4249,7 +4249,7 @@ def test_split_archivable_keep_zero(self) -> None: """keep_recent_turns=0 means all messages are archivable.""" from pydantic_ai.messages import ModelRequest, UserPromptPart - from agentpool.capabilities.viking.compaction import _split_archivable + from wolfharness.capabilities.viking.compaction import _split_archivable messages = [ ModelRequest(parts=[UserPromptPart(content="Turn 1")]), @@ -4261,7 +4261,7 @@ def test_split_archivable_keep_zero(self) -> None: def test_split_archivable_empty(self) -> None: """Empty messages list returns empty tuple.""" - from agentpool.capabilities.viking.compaction import _split_archivable + from wolfharness.capabilities.viking.compaction import _split_archivable archivable, keep = _split_archivable([], keep_recent_turns=3) assert archivable == [] @@ -4273,7 +4273,7 @@ def test_serialize_messages_basic(self) -> None: """Serialize messages as markdown with role headers.""" from pydantic_ai.messages import ModelRequest, ModelResponse, TextPart, UserPromptPart - from agentpool.capabilities.viking.compaction import _serialize_messages + from wolfharness.capabilities.viking.compaction import _serialize_messages messages = [ ModelRequest(parts=[UserPromptPart(content="Hello there")]), @@ -4287,7 +4287,7 @@ def test_serialize_messages_basic(self) -> None: def test_serialize_messages_empty(self) -> None: """Empty messages produce empty string.""" - from agentpool.capabilities.viking.compaction import _serialize_messages + from wolfharness.capabilities.viking.compaction import _serialize_messages assert _serialize_messages([]) == "" @@ -4297,7 +4297,7 @@ def test_summarize_messages_basic(self) -> None: """Summary contains first 200 chars of each message.""" from pydantic_ai.messages import ModelRequest, ModelResponse, TextPart, UserPromptPart - from agentpool.capabilities.viking.compaction import _summarize_messages + from wolfharness.capabilities.viking.compaction import _summarize_messages messages = [ ModelRequest(parts=[UserPromptPart(content="What is Python?")]), @@ -4311,7 +4311,7 @@ def test_summarize_messages_truncation(self) -> None: """Summary truncates long content to 200 chars.""" from pydantic_ai.messages import ModelRequest, UserPromptPart - from agentpool.capabilities.viking.compaction import _summarize_messages + from wolfharness.capabilities.viking.compaction import _summarize_messages long_text = "x" * 300 messages = [ @@ -4324,7 +4324,7 @@ def test_summarize_messages_truncation(self) -> None: def test_summarize_messages_empty(self) -> None: """Empty messages produce empty string.""" - from agentpool.capabilities.viking.compaction import _summarize_messages + from wolfharness.capabilities.viking.compaction import _summarize_messages assert _summarize_messages([]) == "" @@ -4652,7 +4652,7 @@ class TestAutoIngest: def test_sanitize_strips_recall_block(self) -> None: """_sanitize_message replaces with placeholder.""" - from agentpool.capabilities.viking.ingest import _sanitize_message + from wolfharness.capabilities.viking.ingest import _sanitize_message content = "Hello secret data world" result = _sanitize_message(content) @@ -4664,7 +4664,7 @@ def test_sanitize_strips_recall_block(self) -> None: def test_sanitize_strips_profile_block(self) -> None: """_sanitize_message replaces with placeholder.""" - from agentpool.capabilities.viking.ingest import _sanitize_message + from wolfharness.capabilities.viking.ingest import _sanitize_message content = "Context: user profile data end" result = _sanitize_message(content) @@ -4674,7 +4674,7 @@ def test_sanitize_strips_profile_block(self) -> None: def test_sanitize_strips_both_blocks(self) -> None: """_sanitize_message strips both recall and profile blocks.""" - from agentpool.capabilities.viking.ingest import _sanitize_message + from wolfharness.capabilities.viking.ingest import _sanitize_message content = ( "recall data" @@ -4688,7 +4688,7 @@ def test_sanitize_strips_both_blocks(self) -> None: def test_sanitize_multiline_blocks(self) -> None: """_sanitize_message handles multi-line XML blocks.""" - from agentpool.capabilities.viking.ingest import _sanitize_message + from wolfharness.capabilities.viking.ingest import _sanitize_message content = ( "\n \n data\n rest" @@ -4700,7 +4700,7 @@ def test_sanitize_multiline_blocks(self) -> None: def test_sanitize_disabled_returns_original(self) -> None: """When enabled=False, content is returned unchanged.""" - from agentpool.capabilities.viking.ingest import _sanitize_message + from wolfharness.capabilities.viking.ingest import _sanitize_message content = "keep this" result = _sanitize_message(content, enabled=False) @@ -4708,7 +4708,7 @@ def test_sanitize_disabled_returns_original(self) -> None: def test_sanitize_no_xml_blocks(self) -> None: """Content without XML blocks is returned unchanged.""" - from agentpool.capabilities.viking.ingest import _sanitize_message + from wolfharness.capabilities.viking.ingest import _sanitize_message content = "just plain text without any xml blocks" result = _sanitize_message(content) @@ -4716,7 +4716,7 @@ def test_sanitize_no_xml_blocks(self) -> None: def test_sanitize_empty_string(self) -> None: """Empty string returns empty string.""" - from agentpool.capabilities.viking.ingest import _sanitize_message + from wolfharness.capabilities.viking.ingest import _sanitize_message assert _sanitize_message("") == "" @@ -4726,7 +4726,7 @@ def test_extract_conversation_pairs_basic(self) -> None: """Extracts user+assistant pairs from messages.""" from pydantic_ai.messages import ModelRequest, ModelResponse, TextPart, UserPromptPart - from agentpool.capabilities.viking.ingest import _extract_conversation_pairs + from wolfharness.capabilities.viking.ingest import _extract_conversation_pairs messages = [ ModelRequest(parts=[UserPromptPart(content="What is X?")]), @@ -4741,7 +4741,7 @@ def test_extract_conversation_pairs_cursor_tracking(self) -> None: """Only extracts messages after start_idx.""" from pydantic_ai.messages import ModelRequest, ModelResponse, TextPart, UserPromptPart - from agentpool.capabilities.viking.ingest import _extract_conversation_pairs + from wolfharness.capabilities.viking.ingest import _extract_conversation_pairs messages = [ ModelRequest(parts=[UserPromptPart(content="old question")]), @@ -4758,7 +4758,7 @@ def test_extract_conversation_pairs_no_new_messages(self) -> None: """Returns empty list when start_idx >= len(messages).""" from pydantic_ai.messages import ModelRequest, UserPromptPart - from agentpool.capabilities.viking.ingest import _extract_conversation_pairs + from wolfharness.capabilities.viking.ingest import _extract_conversation_pairs messages = [ModelRequest(parts=[UserPromptPart(content="hello")])] result = _extract_conversation_pairs(messages, start_idx=1) @@ -4768,7 +4768,7 @@ def test_extract_conversation_pairs_multiple_turns(self) -> None: """Extracts multiple user+assistant turns.""" from pydantic_ai.messages import ModelRequest, ModelResponse, TextPart, UserPromptPart - from agentpool.capabilities.viking.ingest import _extract_conversation_pairs + from wolfharness.capabilities.viking.ingest import _extract_conversation_pairs messages = [ ModelRequest(parts=[UserPromptPart(content="Q1")]), @@ -4789,7 +4789,7 @@ def test_extract_conversation_pairs_skips_non_text_content(self) -> None: """Skips UserPromptPart with list (multimodal) content.""" from pydantic_ai.messages import ModelRequest, ModelResponse, TextPart, UserPromptPart - from agentpool.capabilities.viking.ingest import _extract_conversation_pairs + from wolfharness.capabilities.viking.ingest import _extract_conversation_pairs messages = [ ModelRequest(parts=[UserPromptPart(content=["image_data", "text"])]), @@ -4804,7 +4804,7 @@ def test_extract_conversation_pairs_skips_non_text_content(self) -> None: def test_extract_conversation_pairs_empty_messages(self) -> None: """Empty messages list returns empty list.""" - from agentpool.capabilities.viking.ingest import _extract_conversation_pairs + from wolfharness.capabilities.viking.ingest import _extract_conversation_pairs assert _extract_conversation_pairs([], start_idx=0) == [] @@ -5214,9 +5214,9 @@ def test_config_auto_ingest_sanitize_default(self) -> None: assert cfg.auto_ingest_sanitize is True def test_config_auto_ingest_source_type_default(self) -> None: - """VikingCapabilityConfig has auto_ingest_source_type='agentpool' by default.""" + """VikingCapabilityConfig has auto_ingest_source_type='wolfharness' by default.""" cfg = VikingCapabilityConfig() - assert cfg.auto_ingest_source_type == "agentpool" + assert cfg.auto_ingest_source_type == "wolfharness" def test_config_auto_ingest_keep_recent_turns_default(self) -> None: """VikingCapabilityConfig has auto_ingest_keep_recent_turns=0 by default.""" diff --git a/tests/capabilities/viking/test_viking_e2e.py b/tests/capabilities/viking/test_viking_e2e.py index 84da4c27e..1cc5f00c0 100644 --- a/tests/capabilities/viking/test_viking_e2e.py +++ b/tests/capabilities/viking/test_viking_e2e.py @@ -35,8 +35,8 @@ from pydantic_ai.messages import ToolReturn import pytest -from agentpool.capabilities.viking import VikingCapability -from agentpool.capabilities.viking.tools import build_tools +from wolfharness.capabilities.viking import VikingCapability +from wolfharness.capabilities.viking.tools import build_tools if TYPE_CHECKING: @@ -468,7 +468,7 @@ async def test_resource_access_workflow( viking_cap.resources_uri = test_dir viking_cap.resource_read_level = "read" try: - from agentpool.capabilities.resource_protocols import TextResourceContent + from wolfharness.capabilities.resource_protocols import TextResourceContent # read_resource result = await viking_cap.read_resource(resource_uri) @@ -508,7 +508,7 @@ async def test_multimodal_bridge( from pydantic_ai.models import ModelRequestContext from pydantic_ai.models.test import TestModel - from agentpool_config.model_capabilities import ModelCapabilities + from wolfharness_config.model_capabilities import ModelCapabilities cap = VikingCapability( mode="all", diff --git a/tests/capabilities/viking/test_viking_integration.py b/tests/capabilities/viking/test_viking_integration.py index 2824d3184..e6f42d0d8 100644 --- a/tests/capabilities/viking/test_viking_integration.py +++ b/tests/capabilities/viking/test_viking_integration.py @@ -26,10 +26,10 @@ import pytest import yamling -from agentpool.capabilities.viking import VikingCapability -from agentpool.capabilities.viking.identity import VikingIdentity -from agentpool.capabilities.viking.tools import build_tools -from agentpool_config.capabilities import VikingCapabilityConfig, build_capability +from wolfharness.capabilities.viking import VikingCapability +from wolfharness.capabilities.viking.identity import VikingIdentity +from wolfharness.capabilities.viking.tools import build_tools +from wolfharness_config.capabilities import VikingCapabilityConfig, build_capability pytestmark = pytest.mark.integration @@ -98,7 +98,7 @@ def _build_cap_from_config( def test_yaml_config_loading_viking_all() -> None: """YAML config with type=viking, mode=all produces VikingCapabilityConfig.""" - from agentpool import AgentsManifest + from wolfharness import AgentsManifest yaml_str = """ agents: @@ -121,7 +121,7 @@ def test_yaml_config_loading_viking_all() -> None: def test_yaml_config_loading_viking_retrieve() -> None: """YAML config with mode=retrieve produces VikingCapabilityConfig with that mode.""" - from agentpool import AgentsManifest + from wolfharness import AgentsManifest yaml_str = """ agents: @@ -141,7 +141,7 @@ def test_yaml_config_loading_viking_retrieve() -> None: def test_yaml_config_loading_viking_with_fields() -> None: """YAML config with all fields populated parses correctly.""" - from agentpool import AgentsManifest + from wolfharness import AgentsManifest yaml_str = """ agents: @@ -174,7 +174,7 @@ def test_yaml_config_loading_viking_with_fields() -> None: def test_yaml_config_loading_default_mode() -> None: """YAML config without mode defaults to 'all'.""" - from agentpool import AgentsManifest + from wolfharness import AgentsManifest yaml_str = """ agents: @@ -503,7 +503,7 @@ def test_resource_read_level_read() -> None: def test_resource_read_level_yaml_parsing() -> None: """YAML config with resource_read_level parses correctly.""" - from agentpool import AgentsManifest + from wolfharness import AgentsManifest yaml_str = """ agents: diff --git a/tests/cli/test_cli.py b/tests/cli/test_cli.py index 42e6549da..135ff3f25 100644 --- a/tests/cli/test_cli.py +++ b/tests/cli/test_cli.py @@ -7,8 +7,8 @@ import pytest from typer.testing import CliRunner -from agentpool_cli.__main__ import cli -from agentpool_cli.agent import agent_cli +from wolfharness_cli.__main__ import cli +from wolfharness_cli.agent import agent_cli pytestmark = pytest.mark.unit @@ -43,11 +43,11 @@ def setup_environment(): """Disable logging and mock config store for all tests.""" # Disable logging - logging.getLogger("agentpool").setLevel(logging.CRITICAL) + logging.getLogger("wolfharness").setLevel(logging.CRITICAL) logging.getLogger("yamling").setLevel(logging.CRITICAL) # Mock ConfigStore - with mock.patch("agentpool_cli.agent.agent_store") as mock_store: + with mock.patch("wolfharness_cli.agent.agent_store") as mock_store: # Setup basic mock behavior mock_store.get_active.return_value = None mock_store.get_config.side_effect = KeyError("Not found") @@ -70,7 +70,7 @@ def test_list_agents_command(config_file: Path): assert "test_agent" in result.stdout -@mock.patch("agentpool_cli.agent.agent_store") +@mock.patch("wolfharness_cli.agent.agent_store") def test_add_agent_command(mock_store: mock.MagicMock, tmp_path: Path, config_file: Path): """Test that add command runs successfully.""" result = runner.invoke(agent_cli, ["add", "test", str(config_file)]) @@ -79,7 +79,7 @@ def test_add_agent_command(mock_store: mock.MagicMock, tmp_path: Path, config_fi mock_store.add_config.assert_called_once_with("test", str(config_file)) -@mock.patch("agentpool_cli.agent.agent_store") +@mock.patch("wolfharness_cli.agent.agent_store") def test_set_agent_command(mock_store: mock.MagicMock, config_file: Path): """Test that set command runs.""" # Configure mock to simulate existing config diff --git a/tests/cli/test_cli_config_path_resolution.py b/tests/cli/test_cli_config_path_resolution.py index 305942c8c..6ff1a2469 100644 --- a/tests/cli/test_cli_config_path_resolution.py +++ b/tests/cli/test_cli_config_path_resolution.py @@ -22,8 +22,8 @@ import pytest -from agentpool.models.manifest import AgentsManifest -from agentpool_config.context import CONFIG_DIR, ConfigContextManager +from wolfharness.models.manifest import AgentsManifest +from wolfharness_config.context import CONFIG_DIR, ConfigContextManager pytestmark = pytest.mark.unit @@ -108,7 +108,7 @@ def test_serve_opencode_resolves_paths_relative_to_config( os.chdir(cwd_outside_config) # Import and test the resolution logic - from agentpool_config.resolution import resolve_config + from wolfharness_config.resolution import resolve_config resolved = resolve_config(explicit_path=str(config_path)) @@ -147,7 +147,7 @@ def test_serve_opencode_without_context_resolves_to_cwd( try: os.chdir(cwd_outside_config) - from agentpool_config.resolution import resolve_config + from wolfharness_config.resolution import resolve_config resolved = resolve_config(explicit_path=str(config_path)) @@ -185,7 +185,7 @@ def test_serve_acp_resolves_paths_relative_to_config( try: os.chdir(cwd_outside_config) - from agentpool_config.resolution import resolve_config + from wolfharness_config.resolution import resolve_config resolved = resolve_config(explicit_path=str(config_path)) diff --git a/tests/cli/test_commands.py b/tests/cli/test_commands.py index 31b9bf21f..73c8b65e0 100644 --- a/tests/cli/test_commands.py +++ b/tests/cli/test_commands.py @@ -8,8 +8,8 @@ import pytest -from agentpool.utils.inspection import get_fn_name -from agentpool_config.commands import ( +from wolfharness.utils.inspection import get_fn_name +from wolfharness_config.commands import ( CallableCommandConfig, FileCommandConfig, StaticCommandConfig, diff --git a/tests/cli/test_serve_acp_streamable_http.py b/tests/cli/test_serve_acp_streamable_http.py index cf7c85984..94ce41cc9 100644 --- a/tests/cli/test_serve_acp_streamable_http.py +++ b/tests/cli/test_serve_acp_streamable_http.py @@ -16,7 +16,7 @@ import typer as t from typer.testing import CliRunner -from agentpool_cli.serve_acp import acp_command +from wolfharness_cli.serve_acp import acp_command if TYPE_CHECKING: @@ -64,8 +64,8 @@ def test_default_transport_is_stdio( ) -> None: """Default --transport should create StdioTransport.""" with ( - patch("agentpool_server.acp_server.ACPServer.from_config") as mock_from_config, - patch("agentpool_cli.serve_acp.asyncio.run"), + patch("wolfharness_server.acp_server.ACPServer.from_config") as mock_from_config, + patch("wolfharness_cli.serve_acp.asyncio.run"), ): mock_server = MagicMock() mock_from_config.return_value = mock_server @@ -86,8 +86,8 @@ def test_transport_streamable_http_creates_acp_websocket_transport( ) -> None: """--transport streamable-http should create ACPWebSocketTransport.""" with ( - patch("agentpool_server.acp_server.ACPServer.from_config") as mock_from_config, - patch("agentpool_cli.serve_acp.asyncio.run"), + patch("wolfharness_server.acp_server.ACPServer.from_config") as mock_from_config, + patch("wolfharness_cli.serve_acp.asyncio.run"), ): mock_server = MagicMock() mock_from_config.return_value = mock_server @@ -107,8 +107,8 @@ def test_transport_streamable_http_with_custom_host_and_port( ) -> None: """--host and --port should be passed to ACPWebSocketTransport.""" with ( - patch("agentpool_server.acp_server.ACPServer.from_config") as mock_from_config, - patch("agentpool_cli.serve_acp.asyncio.run"), + patch("wolfharness_server.acp_server.ACPServer.from_config") as mock_from_config, + patch("wolfharness_cli.serve_acp.asyncio.run"), ): mock_server = MagicMock() mock_from_config.return_value = mock_server @@ -140,8 +140,8 @@ def test_transport_streamable_http_uses_default_host_port( ) -> None: """ACPWebSocketTransport should use default host/port when not specified.""" with ( - patch("agentpool_server.acp_server.ACPServer.from_config") as mock_from_config, - patch("agentpool_cli.serve_acp.asyncio.run"), + patch("wolfharness_server.acp_server.ACPServer.from_config") as mock_from_config, + patch("wolfharness_cli.serve_acp.asyncio.run"), ): mock_server = MagicMock() mock_from_config.return_value = mock_server @@ -161,8 +161,8 @@ def test_transport_websocket_emits_deprecation_warning( ) -> None: """--transport websocket should emit DeprecationWarning.""" with ( - patch("agentpool_server.acp_server.ACPServer.from_config") as mock_from_config, - patch("agentpool_cli.serve_acp.asyncio.run"), + patch("wolfharness_server.acp_server.ACPServer.from_config") as mock_from_config, + patch("wolfharness_cli.serve_acp.asyncio.run"), ): mock_server = MagicMock() mock_from_config.return_value = mock_server @@ -182,8 +182,8 @@ def test_transport_websocket_uses_ws_host_and_ws_port( ) -> None: """--ws-host and --ws-port should be passed to WebSocketTransport.""" with ( - patch("agentpool_server.acp_server.ACPServer.from_config") as mock_from_config, - patch("agentpool_cli.serve_acp.asyncio.run"), + patch("wolfharness_server.acp_server.ACPServer.from_config") as mock_from_config, + patch("wolfharness_cli.serve_acp.asyncio.run"), ): mock_server = MagicMock() mock_from_config.return_value = mock_server @@ -221,8 +221,8 @@ def test_short_options_for_host_and_port( ) -> None: """-h and -p should work as short options for --host and --port.""" with ( - patch("agentpool_server.acp_server.ACPServer.from_config") as mock_from_config, - patch("agentpool_cli.serve_acp.asyncio.run"), + patch("wolfharness_server.acp_server.ACPServer.from_config") as mock_from_config, + patch("wolfharness_cli.serve_acp.asyncio.run"), ): mock_server = MagicMock() mock_from_config.return_value = mock_server @@ -258,8 +258,8 @@ def test_agent_option_is_passed_through( ) -> None: """--agent option should be passed to ACPServer.from_config.""" with ( - patch("agentpool_server.acp_server.ACPServer.from_config") as mock_from_config, - patch("agentpool_cli.serve_acp.asyncio.run"), + patch("wolfharness_server.acp_server.ACPServer.from_config") as mock_from_config, + patch("wolfharness_cli.serve_acp.asyncio.run"), ): mock_server = MagicMock() mock_from_config.return_value = mock_server @@ -279,8 +279,8 @@ def test_debug_messages_option_is_passed_through( ) -> None: """--debug-messages option should be passed to ACPServer.from_config.""" with ( - patch("agentpool_server.acp_server.ACPServer.from_config") as mock_from_config, - patch("agentpool_cli.serve_acp.asyncio.run"), + patch("wolfharness_server.acp_server.ACPServer.from_config") as mock_from_config, + patch("wolfharness_cli.serve_acp.asyncio.run"), ): mock_server = MagicMock() mock_from_config.return_value = mock_server diff --git a/tests/commands/test_commands_integration.py b/tests/commands/test_commands_integration.py index ef9c08802..16e33d818 100644 --- a/tests/commands/test_commands_integration.py +++ b/tests/commands/test_commands_integration.py @@ -7,9 +7,9 @@ import pytest from slashed import CommandStore -from agentpool import AgentPool, AgentsManifest -from agentpool.messaging.context import NodeContext -from agentpool_commands.prompts import ShowPromptCommand +from wolfharness import AgentPool, AgentsManifest +from wolfharness.messaging.context import NodeContext +from wolfharness_commands.prompts import ShowPromptCommand pytestmark = pytest.mark.unit diff --git a/tests/compat/test_compat.py b/tests/compat/test_compat.py index 5b3ac4d8a..d772ecdf1 100644 --- a/tests/compat/test_compat.py +++ b/tests/compat/test_compat.py @@ -14,8 +14,8 @@ import pytest -from agentpool.hooks.agent_hooks import AgentHooks -from agentpool.utils.context_wrapping import wrap_instruction +from wolfharness.hooks.agent_hooks import AgentHooks +from wolfharness.utils.context_wrapping import wrap_instruction pytestmark = pytest.mark.unit @@ -38,7 +38,7 @@ def test_agent_hooks_still_works() -> None: def test_mcp_manager_still_works() -> None: """MCPManager initializes and accepts server configs.""" - from agentpool.mcp_server.manager import MCPManager + from wolfharness.mcp_server.manager import MCPManager mm = MCPManager() assert mm.name == "mcp" @@ -48,7 +48,7 @@ def test_mcp_manager_still_works() -> None: def test_resolve_history_processors_still_works() -> None: """_resolve_history_processors with _warn=False returns list.""" - from agentpool.agents.native_agent.agent import Agent + from wolfharness.agents.native_agent.agent import Agent agent = Agent.__new__(Agent) agent._resolved_history_processors = None @@ -85,7 +85,7 @@ def simple_instruction() -> str: def test_resolve_history_processors_emits_deprecation_warning() -> None: """_resolve_history_processors emits DeprecationWarning with v0.5.0 and alternative.""" - from agentpool.agents.native_agent.agent import Agent + from wolfharness.agents.native_agent.agent import Agent agent = Agent.__new__(Agent) agent._resolved_history_processors = None diff --git a/tests/compat/test_no_deprecation_warnings.py b/tests/compat/test_no_deprecation_warnings.py index 7816ec640..01c22d2ca 100644 --- a/tests/compat/test_no_deprecation_warnings.py +++ b/tests/compat/test_no_deprecation_warnings.py @@ -11,12 +11,12 @@ import pytest -from agentpool.hooks.agent_hooks import AgentHooks -from agentpool.mcp_server.manager import MCPManager -from agentpool.messaging import ChatMessage -from agentpool.messaging.connection_manager import ConnectionManager -from agentpool.messaging.messagenode import MessageNode -from agentpool.utils.context_wrapping import wrap_instruction +from wolfharness.hooks.agent_hooks import AgentHooks +from wolfharness.mcp_server.manager import MCPManager +from wolfharness.messaging import ChatMessage +from wolfharness.messaging.connection_manager import ConnectionManager +from wolfharness.messaging.messagenode import MessageNode +from wolfharness.utils.context_wrapping import wrap_instruction pytestmark = pytest.mark.unit diff --git a/tests/config/__init__.py b/tests/config/__init__.py index d45ef6812..1872757ba 100644 --- a/tests/config/__init__.py +++ b/tests/config/__init__.py @@ -1 +1 @@ -"""Tests for agentpool_config package.""" +"""Tests for wolfharness_config package.""" diff --git a/tests/config/test_capabilities_yaml.py b/tests/config/test_capabilities_yaml.py index 68b58f2a6..292d14bfc 100644 --- a/tests/config/test_capabilities_yaml.py +++ b/tests/config/test_capabilities_yaml.py @@ -4,8 +4,8 @@ import pytest -from agentpool import AgentsManifest, NativeAgentConfig -from agentpool_config.capabilities import ( +from wolfharness import AgentsManifest, NativeAgentConfig +from wolfharness_config.capabilities import ( EntryPointCapabilityConfig, GenericCapabilityConfig, LoopDetectionCapabilityConfig, diff --git a/tests/config/test_config_resources.py b/tests/config/test_config_resources.py index ff2483e0f..49cac1c45 100644 --- a/tests/config/test_config_resources.py +++ b/tests/config/test_config_resources.py @@ -6,8 +6,8 @@ import pytest -from agentpool import config_resources -from agentpool.models.manifest import AgentsManifest +from wolfharness import config_resources +from wolfharness.models.manifest import AgentsManifest pytestmark = pytest.mark.unit diff --git a/tests/config/test_deferred_wiring.py b/tests/config/test_deferred_wiring.py index 32fe32c2f..f6548fe98 100644 --- a/tests/config/test_deferred_wiring.py +++ b/tests/config/test_deferred_wiring.py @@ -33,7 +33,7 @@ def test_base_tool_config_has_deferred_fields(self): Checks deferred, deferred_kind, deferred_strategy, deferred_placeholder, deferred_timeout fields. """ - from agentpool_config.tools import BaseToolConfig + from wolfharness_config.tools import BaseToolConfig # Check fields exist and have correct defaults fields = BaseToolConfig.model_fields @@ -57,7 +57,7 @@ def test_base_tool_config_has_deferred_fields(self): def test_deferred_fields_have_json_schema_annotations(self): """Deferred fields should have Field titles for YAML auto-completion.""" - from agentpool_config.tools import BaseToolConfig + from wolfharness_config.tools import BaseToolConfig schema = BaseToolConfig.model_json_schema() props = schema["properties"] @@ -74,7 +74,7 @@ class TestDeferredToolWiring: def test_import_tool_default_not_deferred(self): """ImportToolConfig with default settings produces non-deferred tool.""" - from agentpool_config.tools import ImportToolConfig + from wolfharness_config.tools import ImportToolConfig config = ImportToolConfig(import_path=f"{__name__}:tool_conf") tool = config.get_tool() @@ -83,7 +83,7 @@ def test_import_tool_default_not_deferred(self): def test_import_tool_deferred_true(self): """ImportToolConfig with deferred=True produces deferred tool.""" - from agentpool_config.tools import ImportToolConfig + from wolfharness_config.tools import ImportToolConfig config = ImportToolConfig( import_path=f"{__name__}:tool_conf", @@ -95,7 +95,7 @@ def test_import_tool_deferred_true(self): def test_import_tool_deferred_kind_unapproved(self): """deferred_kind='unapproved' forces strategy='block'.""" - from agentpool_config.tools import ImportToolConfig + from wolfharness_config.tools import ImportToolConfig config = ImportToolConfig( import_path=f"{__name__}:tool_conf", @@ -110,7 +110,7 @@ def test_import_tool_deferred_kind_unapproved(self): def test_import_tool_deferred_strategy_continue(self): """deferred_strategy='continue' with deferred_kind='external'.""" - from agentpool_config.tools import ImportToolConfig + from wolfharness_config.tools import ImportToolConfig config = ImportToolConfig( import_path=f"{__name__}:tool_conf", @@ -125,7 +125,7 @@ def test_import_tool_deferred_strategy_continue(self): def test_import_tool_deferred_placeholder_custom(self): """Custom deferred_placeholder is passed through.""" - from agentpool_config.tools import ImportToolConfig + from wolfharness_config.tools import ImportToolConfig config = ImportToolConfig( import_path=f"{__name__}:tool_conf", @@ -138,7 +138,7 @@ def test_import_tool_deferred_placeholder_custom(self): def test_import_tool_deferred_timeout_string(self): """deferred_timeout as a string '30s' is parsed to timedelta(seconds=30).""" - from agentpool_config.tools import ImportToolConfig + from wolfharness_config.tools import ImportToolConfig config = ImportToolConfig( import_path=f"{__name__}:tool_conf", @@ -151,7 +151,7 @@ def test_import_tool_deferred_timeout_string(self): def test_import_tool_deferred_timeout_timedelta(self): """deferred_timeout as timedelta is passed through directly.""" - from agentpool_config.tools import ImportToolConfig + from wolfharness_config.tools import ImportToolConfig config = ImportToolConfig( import_path=f"{__name__}:tool_conf", @@ -164,7 +164,7 @@ def test_import_tool_deferred_timeout_timedelta(self): def test_import_tool_deferred_timeout_none(self): """deferred_timeout=None means no timeout.""" - from agentpool_config.tools import ImportToolConfig + from wolfharness_config.tools import ImportToolConfig config = ImportToolConfig( import_path=f"{__name__}:tool_conf", @@ -177,7 +177,7 @@ def test_import_tool_deferred_timeout_none(self): def test_import_tool_deferred_fields_are_all_kwargs_passthrough(self): """All deferred fields should pass through to Tool() via kwargs.""" - from agentpool_config.tools import ImportToolConfig + from wolfharness_config.tools import ImportToolConfig config = ImportToolConfig( import_path=f"{__name__}:tool_conf", @@ -198,8 +198,8 @@ def test_import_tool_deferred_fields_are_all_kwargs_passthrough(self): def test_invalid_combination_raises_tool_error(self): """deferred_kind='unapproved' with strategy='continue' should raise ToolError.""" - from agentpool.tools.exceptions import ToolError - from agentpool_config.tools import ImportToolConfig + from wolfharness.tools.exceptions import ToolError + from wolfharness_config.tools import ImportToolConfig config = ImportToolConfig( import_path=f"{__name__}:tool_conf", @@ -217,7 +217,7 @@ class TestCheckpointConfigWiring: def test_session_pool_config_has_checkpoint_field(self): """SessionPoolConfig should have a checkpoint field accepting CheckpointConfig.""" - from agentpool_config.session_pool import SessionPoolConfig + from wolfharness_config.session_pool import SessionPoolConfig fields = SessionPoolConfig.model_fields assert "checkpoint" in fields @@ -225,15 +225,15 @@ def test_session_pool_config_has_checkpoint_field(self): def test_session_pool_config_default_checkpoint_is_none(self): """Default SessionPoolConfig should have checkpoint=None.""" - from agentpool_config.session_pool import SessionPoolConfig + from wolfharness_config.session_pool import SessionPoolConfig config = SessionPoolConfig() assert config.checkpoint is None def test_session_pool_config_with_checkpoint_enabled(self): """SessionPoolConfig with checkpoint enabled.""" - from agentpool_config.durable import CheckpointConfig - from agentpool_config.session_pool import SessionPoolConfig + from wolfharness_config.durable import CheckpointConfig + from wolfharness_config.session_pool import SessionPoolConfig config = SessionPoolConfig( checkpoint=CheckpointConfig(enabled=True), @@ -243,8 +243,8 @@ def test_session_pool_config_with_checkpoint_enabled(self): def test_session_pool_config_with_checkpoint_disabled(self): """SessionPoolConfig with checkpoint disabled.""" - from agentpool_config.durable import CheckpointConfig - from agentpool_config.session_pool import SessionPoolConfig + from wolfharness_config.durable import CheckpointConfig + from wolfharness_config.session_pool import SessionPoolConfig config = SessionPoolConfig( checkpoint=CheckpointConfig(enabled=False), @@ -254,7 +254,7 @@ def test_session_pool_config_with_checkpoint_disabled(self): def test_checkpoint_field_json_schema(self): """Checkpoint field should have JSON schema annotations.""" - from agentpool_config.session_pool import SessionPoolConfig + from wolfharness_config.session_pool import SessionPoolConfig schema = SessionPoolConfig.model_json_schema() assert "checkpoint" in schema["properties"] @@ -264,14 +264,14 @@ class TestDeferredToolConfigExists: """Verify DeferredToolConfig is importable.""" def test_deferred_tool_config_importable(self): - """DeferredToolConfig can be imported from agentpool_config.durable.""" - from agentpool_config.durable import DeferredToolConfig + """DeferredToolConfig can be imported from wolfharness_config.durable.""" + from wolfharness_config.durable import DeferredToolConfig assert DeferredToolConfig is not None def test_deferred_tool_config_defaults(self): """DeferredToolConfig has correct defaults.""" - from agentpool_config.durable import DeferredToolConfig + from wolfharness_config.durable import DeferredToolConfig config = DeferredToolConfig() assert config.enabled is True @@ -284,7 +284,7 @@ class TestYamlSchema: def test_import_tool_config_schema_has_deferred_fields(self): """ImportToolConfig JSON schema should include deferred fields.""" - from agentpool_config.tools import ImportToolConfig + from wolfharness_config.tools import ImportToolConfig schema = ImportToolConfig.model_json_schema() props = schema["properties"] @@ -296,7 +296,7 @@ def test_import_tool_config_schema_has_deferred_fields(self): def test_session_pool_config_schema_has_checkpoint_field(self): """SessionPoolConfig JSON schema should include checkpoint field.""" - from agentpool_config.session_pool import SessionPoolConfig + from wolfharness_config.session_pool import SessionPoolConfig schema = SessionPoolConfig.model_json_schema() assert "checkpoint" in schema["properties"] diff --git a/tests/config/test_durable_config.py b/tests/config/test_durable_config.py index 9392ed366..832dd2507 100644 --- a/tests/config/test_durable_config.py +++ b/tests/config/test_durable_config.py @@ -12,7 +12,7 @@ import pytest import yaml -from agentpool_config.durable import CheckpointConfig, DeferredToolConfig +from wolfharness_config.durable import CheckpointConfig, DeferredToolConfig pytestmark = pytest.mark.unit diff --git a/tests/config/test_entrypoint_capabilities.py b/tests/config/test_entrypoint_capabilities.py index 8573a0b44..e97dd1d8c 100644 --- a/tests/config/test_entrypoint_capabilities.py +++ b/tests/config/test_entrypoint_capabilities.py @@ -3,7 +3,7 @@ Tests that ``type: `` in YAML resolves to the correct :class:`EntryPointCapabilityConfig` and that the config's ``build()`` method instantiates the capability class registered via the -``agentpool.capabilities`` entry-point group. +``wolfharness.capabilities`` entry-point group. """ from __future__ import annotations @@ -13,8 +13,8 @@ import pytest -from agentpool import AgentsManifest, NativeAgentConfig -from agentpool_config.capabilities import ( +from wolfharness import AgentsManifest, NativeAgentConfig +from wolfharness_config.capabilities import ( EntryPointCapabilityConfig, GenericCapabilityConfig, build_capability, @@ -49,7 +49,7 @@ def __init__(self, **kwargs: Any) -> None: } # Patch paths -_DISCOVER_PATH = "agentpool.capabilities.registry.discover_entry_point_capabilities" +_DISCOVER_PATH = "wolfharness.capabilities.registry.discover_entry_point_capabilities" _ENTRY_POINTS_PATH = "importlib.metadata.entry_points" diff --git a/tests/config/test_graph_translation.py b/tests/config/test_graph_translation.py index cf415ec26..b8c1bc304 100644 --- a/tests/config/test_graph_translation.py +++ b/tests/config/test_graph_translation.py @@ -4,7 +4,7 @@ import pytest -from agentpool_config import ( +from wolfharness_config import ( GraphConfig, GraphEdgeConfig, GraphStepConfig, @@ -15,12 +15,12 @@ translate_team_to_graph, translate_teams_to_graphs, ) -from agentpool_config.forward_targets import ( +from wolfharness_config.forward_targets import ( CallableConnectionConfig, FileConnectionConfig, NodeConnectionConfig, ) -from agentpool_config.nodes import NodeConfig +from wolfharness_config.nodes import NodeConfig pytestmark = pytest.mark.unit @@ -284,7 +284,7 @@ class TestConfigTranslation: def test_no_teams_no_connections_returns_none(self) -> None: """No teams or connections returns None.""" - from agentpool_config.nodes import NodeConfig + from wolfharness_config.nodes import NodeConfig agents = { "solo": NodeConfig(name="solo"), @@ -294,7 +294,7 @@ def test_no_teams_no_connections_returns_none(self) -> None: def test_with_teams_produces_graph(self) -> None: """Teams produce a graph config.""" - from agentpool_config.nodes import NodeConfig + from wolfharness_config.nodes import NodeConfig agents = { "analyzer": NodeConfig(name="analyzer"), diff --git a/tests/config/test_instructions_config.py b/tests/config/test_instructions_config.py index 6a6a11952..872badd05 100644 --- a/tests/config/test_instructions_config.py +++ b/tests/config/test_instructions_config.py @@ -13,7 +13,7 @@ class TestProviderInstructionConfig: async def test_valid_config_with_ref(self): """Test valid config with ref field only.""" - from agentpool_config.instructions import ProviderInstructionConfig + from wolfharness_config.instructions import ProviderInstructionConfig config = ProviderInstructionConfig( ref="my_provider", @@ -26,7 +26,7 @@ async def test_valid_config_with_ref(self): async def test_valid_config_with_import_path(self): """Test valid config with import_path field only.""" - from agentpool_config.instructions import ProviderInstructionConfig + from wolfharness_config.instructions import ProviderInstructionConfig config = ProviderInstructionConfig( import_path="my.module.Provider", @@ -39,7 +39,7 @@ async def test_valid_config_with_import_path(self): async def test_valid_config_with_import_path_and_kw_args(self): """Test valid config with import_path and kw_args.""" - from agentpool_config.instructions import ProviderInstructionConfig + from wolfharness_config.instructions import ProviderInstructionConfig config = ProviderInstructionConfig( import_path="my.module.Provider", @@ -53,7 +53,7 @@ async def test_valid_config_with_import_path_and_kw_args(self): async def test_invalid_config_both_ref_and_import_path(self): """Test that config with both ref and import_path raises error.""" - from agentpool_config.instructions import ProviderInstructionConfig + from wolfharness_config.instructions import ProviderInstructionConfig with pytest.raises(ValueError, match="Only one of 'ref' or 'import_path' can be provided"): ProviderInstructionConfig( @@ -63,7 +63,7 @@ async def test_invalid_config_both_ref_and_import_path(self): async def test_invalid_config_neither_ref_nor_import_path(self): """Test that config with neither ref nor import_path raises error.""" - from agentpool_config.instructions import ProviderInstructionConfig + from wolfharness_config.instructions import ProviderInstructionConfig with pytest.raises(ValueError, match="Either 'ref' or 'import_path' must be provided"): ProviderInstructionConfig() diff --git a/tests/config/test_mcp_server_config.py b/tests/config/test_mcp_server_config.py index 49a695872..682d64b90 100644 --- a/tests/config/test_mcp_server_config.py +++ b/tests/config/test_mcp_server_config.py @@ -9,7 +9,7 @@ from pydantic import HttpUrl import pytest -from agentpool_config.mcp_server import ( +from wolfharness_config.mcp_server import ( AcpMCPServerConfig, SSEMCPServerConfig, StdioMCPServerConfig, diff --git a/tests/config/test_path_resolution.py b/tests/config/test_path_resolution.py index da351af35..1a53c716f 100644 --- a/tests/config/test_path_resolution.py +++ b/tests/config/test_path_resolution.py @@ -22,8 +22,8 @@ import pytest from upathtools import UPath -from agentpool_config.context import CONFIG_DIR, ConfigContextManager -from agentpool_config.paths import ( +from wolfharness_config.context import CONFIG_DIR, ConfigContextManager +from wolfharness_config.paths import ( CONFIG_DIR_ENV_VAR, LEGACY_PATHS_ENV_VAR, ConfigPath, diff --git a/tests/config/test_skill_commands.py b/tests/config/test_skill_commands.py index 2401acba4..f360702a4 100644 --- a/tests/config/test_skill_commands.py +++ b/tests/config/test_skill_commands.py @@ -5,7 +5,7 @@ from pydantic import ValidationError import pytest -from agentpool_config.skill_commands import SkillCommandConfig, SkillSlashConfig +from wolfharness_config.skill_commands import SkillCommandConfig, SkillSlashConfig pytestmark = pytest.mark.unit diff --git a/tests/conftest.py b/tests/conftest.py index ddf69326a..c50e9d45a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -11,10 +11,9 @@ import pytest import yamling -from agentpool import Agent, AgentPool, AgentsManifest, NativeAgentConfig - # Import minimal_pool fixture so it's available to all tests without explicit import. from tests.fixtures.minimal_pool import minimal_pool # noqa: F401 +from wolfharness import Agent, AgentPool, AgentsManifest, NativeAgentConfig if TYPE_CHECKING: @@ -255,7 +254,7 @@ def remap_hardcoded_test_models(): """ from unittest.mock import patch - from agentpool.utils import model_helpers + from wolfharness.utils import model_helpers original = model_helpers.infer_model diff --git a/tests/data/test_skills/hello-world/SKILL.md b/tests/data/test_skills/hello-world/SKILL.md index 950bd1745..b065f7b02 100644 --- a/tests/data/test_skills/hello-world/SKILL.md +++ b/tests/data/test_skills/hello-world/SKILL.md @@ -29,7 +29,7 @@ When invoked, respond with a warm, friendly greeting message. Basic greeting: ```bash -agentpool skill hello-world +wolfharness skill hello-world ``` Expected output: diff --git a/tests/data/test_skills/test-with-args/SKILL.md b/tests/data/test_skills/test-with-args/SKILL.md index 9eef21fdf..88804d36c 100644 --- a/tests/data/test_skills/test-with-args/SKILL.md +++ b/tests/data/test_skills/test-with-args/SKILL.md @@ -35,12 +35,12 @@ When invoked with arguments, process them appropriately: With single argument: ```bash -agentpool skill test-with-args "my test input" +wolfharness skill test-with-args "my test input" ``` With multiple arguments: ```bash -agentpool skill test-with-args arg1 arg2 arg3 +wolfharness skill test-with-args arg1 arg2 arg3 ``` Expected output: diff --git a/tests/delegation/test_base_team_stop.py b/tests/delegation/test_base_team_stop.py index 024805683..ef327d4a3 100644 --- a/tests/delegation/test_base_team_stop.py +++ b/tests/delegation/test_base_team_stop.py @@ -7,7 +7,7 @@ import pytest -from agentpool.delegation.base_team import BaseTeam +from wolfharness.delegation.base_team import BaseTeam pytestmark = pytest.mark.unit diff --git a/tests/delegation/test_break_behavior.py b/tests/delegation/test_break_behavior.py index b9641dcb4..ec7452c7e 100644 --- a/tests/delegation/test_break_behavior.py +++ b/tests/delegation/test_break_behavior.py @@ -50,10 +50,10 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, AgentPool -from agentpool.agents.events import StreamCompleteEvent, ToolCallStartEvent -from agentpool.lifecycle import DirectChannel, MemoryJournal -from agentpool.orchestrator.core import SessionPool +from wolfharness import Agent, AgentPool +from wolfharness.agents.events import StreamCompleteEvent, ToolCallStartEvent +from wolfharness.lifecycle import DirectChannel, MemoryJournal +from wolfharness.orchestrator.core import SessionPool pytestmark = pytest.mark.unit diff --git a/tests/delegation/test_cross_provider_session_lifecycle.py b/tests/delegation/test_cross_provider_session_lifecycle.py index c7cc0ecc9..049d71f41 100644 --- a/tests/delegation/test_cross_provider_session_lifecycle.py +++ b/tests/delegation/test_cross_provider_session_lifecycle.py @@ -25,16 +25,16 @@ import pytest -from agentpool import Agent, AgentPool, AgentsManifest, BaseTeam -from agentpool.agents.context import AgentContext, AgentRunContext -from agentpool.agents.events import ( +from wolfharness import Agent, AgentPool, AgentsManifest, BaseTeam +from wolfharness.agents.context import AgentContext, AgentRunContext +from wolfharness.agents.events import ( RunStartedEvent, SpawnSessionStart, SubAgentEvent, ) -from agentpool.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError -from agentpool.sessions import SessionData -from agentpool_storage.memory_provider.provider import MemoryStorageProvider +from wolfharness.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError +from wolfharness.sessions import SessionData +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider pytestmark = pytest.mark.integration @@ -53,7 +53,7 @@ def _make_echo_agent(name: str, response: str = "hello") -> Agent[Any, str]: """Create an Agent that echoes a fixed response via function_to_model.""" from functools import partial - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model async def _echo(_msg: str, *, _response: str = response) -> str: return _response @@ -343,10 +343,10 @@ async def test_depth_increments_per_delegation_level() -> None: async def test_acp_child_session_inherits_parent_project_and_cwd() -> None: """TG-10: ACP child session created via ACPSessionManager with parent_session_id....""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest - from agentpool.orchestrator.core import SessionPool - from agentpool_server.acp_server.session_manager import ACPSessionManager + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest + from wolfharness.orchestrator.core import SessionPool + from wolfharness_server.acp_server.session_manager import ACPSessionManager manifest = AgentsManifest(agents={"acp_agent": NativeAgentConfig(model="test")}) pool = AgentPool(manifest) @@ -363,7 +363,7 @@ def simple_callback(message: str) -> str: # Create parent session with known project_id and cwd parent_cwd = tempfile.gettempdir() - from agentpool_storage.opencode_provider.helpers import compute_project_id + from wolfharness_storage.opencode_provider.helpers import compute_project_id parent_project_id = compute_project_id(parent_cwd) parent_data = SessionData( @@ -379,8 +379,8 @@ def simple_callback(message: str) -> str: mock_acp_agent = MagicMock() with ( - patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls, - patch("agentpool_server.acp_server.session_manager.ClientCapabilities"), + patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls, + patch("wolfharness_server.acp_server.session_manager.ClientCapabilities"), ): mock_session_instance = MagicMock() mock_session_instance.register_update_callback = MagicMock() @@ -412,7 +412,7 @@ def simple_callback(message: str) -> str: async def test_subagent_depth_guard_before_session_creation() -> None: """TG-14: When depth >= MAX_DELEGATION_DEPTH, DelegationDepthError is raised BEFORE....""" - from agentpool_toolsets.builtin.subagent_tools import SubagentTools + from wolfharness_toolsets.builtin.subagent_tools import SubagentTools manifest = AgentsManifest.from_yaml(""" agents: @@ -828,7 +828,7 @@ async def test_child_session_ids_unique_across_providers() -> None: async with AgentPool(manifest) as pool: # Add team to manifest so subagent tool can find it - from agentpool_config.teams import TeamConfig + from wolfharness_config.teams import TeamConfig pool.manifest.teams["work_team"] = TeamConfig(mode="parallel", members=["alpha", "beta"]) inner_team.agent_pool = pool diff --git a/tests/delegation/test_graph_adapter.py b/tests/delegation/test_graph_adapter.py index c5ad5de07..621faba66 100644 --- a/tests/delegation/test_graph_adapter.py +++ b/tests/delegation/test_graph_adapter.py @@ -7,9 +7,9 @@ import pytest -from agentpool.messaging import ChatMessage -from agentpool.messaging.graph_adapter import AgentPoolState, MessageNodeStep -from agentpool.messaging.messagenode import MessageNode +from wolfharness.messaging import ChatMessage +from wolfharness.messaging.graph_adapter import AgentPoolState, MessageNodeStep +from wolfharness.messaging.messagenode import MessageNode pytestmark = pytest.mark.unit @@ -39,7 +39,7 @@ class GraphMessageNodeWithEvents(MessageNode[Any, str]): async def _execute_node(self, *prompts: Any, **kwargs: Any) -> ChatMessage[str]: from pydantic_ai import TextPartDelta - from agentpool.agents.events import PartDeltaEvent + from wolfharness.agents.events import PartDeltaEvent state = kwargs.get("_state") if state is not None: @@ -99,7 +99,7 @@ async def test_message_node_run_stream_uses_graph_iter(): events = [event async for event in node.run_stream("stream_test")] assert len(events) == 1 - from agentpool.agents.events import StreamCompleteEvent + from wolfharness.agents.events import StreamCompleteEvent assert isinstance(events[0], StreamCompleteEvent) assert events[0].message.content == "stream_test" @@ -111,7 +111,7 @@ async def test_message_node_run_stream_drains_event_queue(): node = GraphMessageNodeWithEvents(name="test_events") events = [event async for event in node.run_stream("event_test")] - from agentpool.agents.events import PartDeltaEvent, StreamCompleteEvent + from wolfharness.agents.events import PartDeltaEvent, StreamCompleteEvent assert len(events) == 2 assert isinstance(events[0], PartDeltaEvent) diff --git a/tests/delegation/test_graph_edges.py b/tests/delegation/test_graph_edges.py index 4d9492189..78d712017 100644 --- a/tests/delegation/test_graph_edges.py +++ b/tests/delegation/test_graph_edges.py @@ -18,10 +18,10 @@ # Add src to path for imports sys.path.insert(0, str(Path(__file__).parent.parent.parent / "src")) -from agentpool.messaging import ChatMessage, MessageNode -from agentpool.talk import Talk -from agentpool.talk.graph_edges import TalkEdgeTranslator -from agentpool.utils.time_utils import get_now +from wolfharness.messaging import ChatMessage, MessageNode +from wolfharness.talk import Talk +from wolfharness.talk.graph_edges import TalkEdgeTranslator +from wolfharness.utils.time_utils import get_now pytestmark = pytest.mark.unit @@ -54,7 +54,7 @@ async def run_message(self, message: ChatMessage[Any], **kwargs: Any) -> ChatMes return message async def get_stats(self) -> Any: - from agentpool.talk.stats import MessageStats + from wolfharness.talk.stats import MessageStats return MessageStats() diff --git a/tests/delegation/test_graph_teams.py b/tests/delegation/test_graph_teams.py index 204488634..d5edb78a9 100644 --- a/tests/delegation/test_graph_teams.py +++ b/tests/delegation/test_graph_teams.py @@ -13,24 +13,24 @@ import anyio import pytest -from agentpool import Agent -from agentpool.agents.base_agent import _current_run_ctx_var -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import ( +from wolfharness import Agent +from wolfharness.agents.base_agent import _current_run_ctx_var +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import ( SpawnSessionStart, StreamCompleteEvent, SubAgentEvent, ) -from agentpool.delegation.base_team import BaseTeam -from agentpool.delegation.graph_team import ( +from wolfharness.delegation.base_team import BaseTeam +from wolfharness.delegation.graph_team import ( _MemberOutput, _TeamGraphState, build_team_graph, run_team_graph, ) -from agentpool.messaging import AgentResponse, ChatMessage, TeamResponse -from agentpool.messaging.messagenode import MessageNode -from agentpool.talk import Talk +from wolfharness.messaging import AgentResponse, ChatMessage, TeamResponse +from wolfharness.messaging.messagenode import MessageNode +from wolfharness.talk import Talk pytestmark = pytest.mark.unit @@ -158,7 +158,7 @@ class _FakeAgentPool: def __init__(self, agents: list[Agent[Any, str]]) -> None: from types import SimpleNamespace - from agentpool.mcp_server.manager import MCPManager + from wolfharness.mcp_server.manager import MCPManager self.session_pool = _FakeSessionPool() self.all_agents = {agent.name: agent for agent in agents} diff --git a/tests/delegation/test_pool_get_context.py b/tests/delegation/test_pool_get_context.py index feaecee83..f6a8a855d 100644 --- a/tests/delegation/test_pool_get_context.py +++ b/tests/delegation/test_pool_get_context.py @@ -4,9 +4,9 @@ import pytest -from agentpool.delegation.pool import AgentPool -from agentpool.host.context import HostContext -from agentpool.host.factory import AgentFactory +from wolfharness.delegation.pool import AgentPool +from wolfharness.host.context import HostContext +from wolfharness.host.factory import AgentFactory @pytest.fixture diff --git a/tests/delegation/test_pool_runs.py b/tests/delegation/test_pool_runs.py index eb7827c30..47ffa3205 100644 --- a/tests/delegation/test_pool_runs.py +++ b/tests/delegation/test_pool_runs.py @@ -8,8 +8,8 @@ import pytest -from agentpool import AgentPool, AgentsManifest, NativeAgentConfig -from agentpool.orchestrator import RunHandle +from wolfharness import AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness.orchestrator import RunHandle @pytest.fixture diff --git a/tests/delegation/test_pool_session_integration.py b/tests/delegation/test_pool_session_integration.py index f76cdbc86..dc13c58f3 100644 --- a/tests/delegation/test_pool_session_integration.py +++ b/tests/delegation/test_pool_session_integration.py @@ -8,9 +8,9 @@ import pytest -from agentpool import Agent, AgentPool, AgentsManifest, NativeAgentConfig -from agentpool.orchestrator import SessionPool -from agentpool_config.session_pool import SessionPoolConfig +from wolfharness import Agent, AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness.orchestrator import SessionPool +from wolfharness_config.session_pool import SessionPoolConfig @pytest.fixture diff --git a/tests/delegation/test_pool_skills.py b/tests/delegation/test_pool_skills.py index 126982bc6..d03c70161 100644 --- a/tests/delegation/test_pool_skills.py +++ b/tests/delegation/test_pool_skills.py @@ -11,11 +11,11 @@ import pytest from upathtools import UPath -from agentpool import AgentPool, AgentsManifest, NativeAgentConfig -from agentpool.capabilities.resource_protocols import SkillResource -from agentpool.capabilities.skill_manager_cap import SkillManagerCap -from agentpool.skills.uri_resolver import SkillURIResolver -from agentpool_config.skills import SkillsConfig +from wolfharness import AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness.capabilities.resource_protocols import SkillResource +from wolfharness.capabilities.skill_manager_cap import SkillManagerCap +from wolfharness.skills.uri_resolver import SkillURIResolver +from wolfharness_config.skills import SkillsConfig pytestmark = pytest.mark.integration diff --git a/tests/delegation/test_team_member_skills.py b/tests/delegation/test_team_member_skills.py index 2216d8eda..a4a48933d 100644 --- a/tests/delegation/test_team_member_skills.py +++ b/tests/delegation/test_team_member_skills.py @@ -4,8 +4,8 @@ import pytest -from agentpool import BaseTeam -from agentpool.skills.exceptions import SkillNotFoundError +from wolfharness import BaseTeam +from wolfharness.skills.exceptions import SkillNotFoundError pytestmark = pytest.mark.unit diff --git a/tests/e2e/conftest.py b/tests/e2e/conftest.py index 2e6f4d302..bcc9000f4 100644 --- a/tests/e2e/conftest.py +++ b/tests/e2e/conftest.py @@ -1,7 +1,7 @@ """L4 subprocess E2E test fixtures for AgentPool protocol servers. This conftest provides the ``subprocess_server`` fixture that spawns a real -``agentpool serve-*`` process, waits for it to become healthy, and tears it +``wolfharness serve-*`` process, waits for it to become healthy, and tears it down gracefully on test exit. Design decisions (see ``openspec/changes/layered-testing-infrastructure/design.md``): @@ -45,12 +45,12 @@ # --------------------------------------------------------------------------- -def _agentpool_binary_available() -> bool: - """Check whether the ``agentpool`` CLI binary is on PATH.""" - return shutil.which("agentpool") is not None +def _wolfharness_binary_available() -> bool: + """Check whether the ``wolfharness`` CLI binary is on PATH.""" + return shutil.which("wolfharness") is not None -SKIP_NO_BINARY = not _agentpool_binary_available() +SKIP_NO_BINARY = not _wolfharness_binary_available() SKIP_WINDOWS = sys.platform == "win32" @@ -61,7 +61,7 @@ def _agentpool_binary_available() -> bool: @dataclass class SubprocessServer: - """Handle to a spawned ``agentpool serve-*`` subprocess. + """Handle to a spawned ``wolfharness serve-*`` subprocess. Attributes: process: The asyncio subprocess. @@ -136,7 +136,7 @@ def _build_command( port: Bind port for HTTP servers. extra_args: Additional CLI arguments. """ - cmd: list[str] = ["agentpool", serve_command, str(config_path)] + cmd: list[str] = ["wolfharness", serve_command, str(config_path)] if serve_command == "serve-acp": # ACP defaults to stdio; use streamable-http for HTTP-based e2e. # Caller must pass --transport via extra_args if HTTP is desired. @@ -522,7 +522,7 @@ async def subprocess_server( # noqa: PLR0915 session_e2e_config: Path, allow_model_requests: Any, ) -> AsyncIterator[SubprocessServer]: - """Spawn an ``agentpool serve-*`` subprocess, reusing cached servers when possible. + """Spawn an ``wolfharness serve-*`` subprocess, reusing cached servers when possible. Cache bypass conditions: - ``--no-server-cache`` flag is set @@ -742,7 +742,7 @@ async def _spawn_server( health_path: str = "/", extra_args: list[str] | None = None, ) -> AsyncIterator[SubprocessServer]: - """Spawn an agentpool server subprocess (internal helper for custom fixtures). + """Spawn an wolfharness server subprocess (internal helper for custom fixtures). Args: serve_command: The CLI subcommand (e.g. serve-api). @@ -948,7 +948,7 @@ async def subprocess_server_with_mcp( session_e2e_config_with_mcp: Path, allow_model_requests: Any, ) -> AsyncIterator[SubprocessServer]: - """Spawn an ``agentpool serve-*`` subprocess with the fake MCP server config. + """Spawn an ``wolfharness serve-*`` subprocess with the fake MCP server config. Uses ``_spawn_server`` (non-cached) because the MCP-config variant is unique to MCP status tests and not worth caching. The fake MCP server @@ -987,7 +987,7 @@ async def subprocess_server_with_mcp( @dataclass class ACPWSServerHandle: - """Handle to a spawned ``agentpool serve-acp --transport streamable-http`` server. + """Handle to a spawned ``wolfharness serve-acp --transport streamable-http`` server. Attributes: process: The asyncio subprocess. @@ -1021,7 +1021,7 @@ async def _spawn_acp_ws_server( agent: str = "test_agent", health_timeout: float = 15.0, ) -> AsyncIterator[ACPWSServerHandle]: - """Spawn ``agentpool serve-acp --transport streamable-http`` and wait for health. + """Spawn ``wolfharness serve-acp --transport streamable-http`` and wait for health. Args: config_path: Path to the YAML config file. @@ -1035,7 +1035,7 @@ async def _spawn_acp_ws_server( """ port = allocate_ephemeral_port() cmd: list[str] = [ - "agentpool", + "wolfharness", "serve-acp", str(config_path), "--agent", @@ -1159,6 +1159,6 @@ def verify_no_orphaned_processes( import warnings warnings.warn( - f"{len(orphans)} orphaned agentpool subprocess(es) found and killed at session end.", + f"{len(orphans)} orphaned wolfharness subprocess(es) found and killed at session end.", stacklevel=2, ) diff --git a/tests/e2e/test_acp_concurrent_prompts.py b/tests/e2e/test_acp_concurrent_prompts.py index 33452e4da..f33dd311b 100644 --- a/tests/e2e/test_acp_concurrent_prompts.py +++ b/tests/e2e/test_acp_concurrent_prompts.py @@ -36,7 +36,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] @@ -83,7 +83,7 @@ async def _spawn_acp_server( *, agent: str = "test_agent", ) -> AsyncIterator[_ACPServerHandle]: - """Spawn ``agentpool serve-acp`` and return a handle with client connection.""" + """Spawn ``wolfharness serve-acp`` and return a handle with client connection.""" import os env = os.environ.copy() @@ -93,7 +93,7 @@ async def _spawn_acp_server( client = DefaultACPClient(allow_file_operations=False) async with spawn_agent_process( lambda _conn: client, - "agentpool", + "wolfharness", "serve-acp", str(config_path), "--agent", @@ -115,7 +115,7 @@ async def test_steer_injects_into_active_turn(e2e_config: Path) -> None: ``"asap"`` (steer), verify the server handles it without crashing. The ACP protocol's ``PromptRequest`` does not have a native ``priority`` - field. The agentpool SessionController supports ``priority="asap"`` for + field. The wolfharness SessionController supports ``priority="asap"`` for mid-turn injection (steer), but this is an internal API not exposed via ACP JSON-RPC. This test sends two concurrent prompts to the same session and verifies the server handles them gracefully — the first completes @@ -160,7 +160,7 @@ async def test_queue_waits_for_idle(e2e_config: Path) -> None: ``"when_idle"`` (queue), verify the server handles it without crashing. Similar to B7.1, the ACP protocol does not expose ``priority`` natively. - The agentpool SessionController supports ``priority="when_idle"`` for + The wolfharness SessionController supports ``priority="when_idle"`` for queueing, but this is internal. This test verifies the server handles sequential/concurrent prompts gracefully. """ diff --git a/tests/e2e/test_acp_config.py b/tests/e2e/test_acp_config.py index ec0c68ef7..ad5e513ec 100644 --- a/tests/e2e/test_acp_config.py +++ b/tests/e2e/test_acp_config.py @@ -38,7 +38,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] @@ -79,7 +79,7 @@ async def acp_server(e2e_config: Path) -> AsyncIterator[ACPConfigHandle]: client = DefaultACPClient(allow_file_operations=False) cm = spawn_agent_process( lambda _conn: client, - "agentpool", + "wolfharness", "serve-acp", str(e2e_config), "--agent", diff --git a/tests/e2e/test_acp_elicitation.py b/tests/e2e/test_acp_elicitation.py index ce1c689a3..5585b2c90 100644 --- a/tests/e2e/test_acp_elicitation.py +++ b/tests/e2e/test_acp_elicitation.py @@ -21,7 +21,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] diff --git a/tests/e2e/test_acp_error_paths.py b/tests/e2e/test_acp_error_paths.py index 14967d0d7..aa9293a48 100644 --- a/tests/e2e/test_acp_error_paths.py +++ b/tests/e2e/test_acp_error_paths.py @@ -42,7 +42,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] @@ -89,7 +89,7 @@ async def _spawn_acp_server( *, agent: str = "test_agent", ) -> AsyncIterator[_ACPServerHandle]: - """Spawn ``agentpool serve-acp`` and return a handle with client connection.""" + """Spawn ``wolfharness serve-acp`` and return a handle with client connection.""" import os env = os.environ.copy() @@ -99,7 +99,7 @@ async def _spawn_acp_server( client = DefaultACPClient(allow_file_operations=False) async with spawn_agent_process( lambda _conn: client, - "agentpool", + "wolfharness", "serve-acp", str(config_path), "--agent", diff --git a/tests/e2e/test_acp_mcp.py b/tests/e2e/test_acp_mcp.py index 49b0570aa..03c4b5a58 100644 --- a/tests/e2e/test_acp_mcp.py +++ b/tests/e2e/test_acp_mcp.py @@ -33,7 +33,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] @@ -89,7 +89,7 @@ async def test_mcp_message_agent_side(e2e_config: Path) -> None: client = DefaultACPClient(allow_file_operations=False) async with spawn_agent_process( lambda _conn: client, - "agentpool", + "wolfharness", "serve-acp", str(e2e_config), "--agent", diff --git a/tests/e2e/test_acp_permission_flow.py b/tests/e2e/test_acp_permission_flow.py index 894fb2283..073ea0738 100644 --- a/tests/e2e/test_acp_permission_flow.py +++ b/tests/e2e/test_acp_permission_flow.py @@ -23,7 +23,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] diff --git a/tests/e2e/test_acp_providers.py b/tests/e2e/test_acp_providers.py index bade71b07..2bf39db3f 100644 --- a/tests/e2e/test_acp_providers.py +++ b/tests/e2e/test_acp_providers.py @@ -36,7 +36,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] @@ -74,7 +74,7 @@ async def acp_server(e2e_config: Path) -> AsyncIterator[ACPProvidersHandle]: client = DefaultACPClient(allow_file_operations=False) cm = spawn_agent_process( lambda _conn: client, - "agentpool", + "wolfharness", "serve-acp", str(e2e_config), "--agent", diff --git a/tests/e2e/test_acp_session_lifecycle.py b/tests/e2e/test_acp_session_lifecycle.py index 0c9c9c7fd..9f34c8895 100644 --- a/tests/e2e/test_acp_session_lifecycle.py +++ b/tests/e2e/test_acp_session_lifecycle.py @@ -50,7 +50,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] @@ -110,7 +110,7 @@ async def acp_server( client = DefaultACPClient(allow_file_operations=False) cm = spawn_agent_process( lambda _conn: client, - "agentpool", + "wolfharness", "serve-acp", str(e2e_config), "--agent", diff --git a/tests/e2e/test_acp_session_updates.py b/tests/e2e/test_acp_session_updates.py index 7b348c274..deac6919a 100644 --- a/tests/e2e/test_acp_session_updates.py +++ b/tests/e2e/test_acp_session_updates.py @@ -11,7 +11,7 @@ during a basic prompt turn with TestModel. Skip tests (B9.4-B9.12): SessionUpdate variants not yet implemented in -the agentpool ACP server. Each skip test documents the test intent so +the wolfharness ACP server. Each skip test documents the test intent so the expected behavior is clear once the feature is implemented. All tests use ``model: test`` (pydantic-ai TestModel) so NO API key is needed. @@ -51,7 +51,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] @@ -99,7 +99,7 @@ async def _spawn_acp_server( *, agent: str = "test_agent", ) -> AsyncIterator[ACPServerHandle]: - """Spawn ``agentpool serve-acp`` and return a handle with client connection. + """Spawn ``wolfharness serve-acp`` and return a handle with client connection. Args: config_path: Path to the YAML config file. @@ -114,7 +114,7 @@ async def _spawn_acp_server( client = DefaultACPClient(allow_file_operations=False) async with spawn_agent_process( lambda _conn: client, - "agentpool", + "wolfharness", "serve-acp", str(config_path), "--agent", @@ -172,7 +172,7 @@ async def test_user_message_chunk_notification(e2e_config: Path) -> None: ``session/update`` notification with ``update.session_update="user_message_chunk"`` is emitted when the user's message is processed by the server. - Note: The agentpool ACP server does not currently emit ``user_message_chunk`` + Note: The wolfharness ACP server does not currently emit ``user_message_chunk`` notifications (the event_converter only emits ``agent_message_chunk`` for agent output). This test documents the expected behavior per the ACP spec. See issue #188 for the server-side gap. diff --git a/tests/e2e/test_acp_stop_reasons.py b/tests/e2e/test_acp_stop_reasons.py index 86d9a4ac8..cb6640e85 100644 --- a/tests/e2e/test_acp_stop_reasons.py +++ b/tests/e2e/test_acp_stop_reasons.py @@ -49,7 +49,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] @@ -97,7 +97,7 @@ async def _spawn_acp_server( *, agent: str = "test_agent", ) -> AsyncIterator[ACPServerHandle]: - """Spawn ``agentpool serve-acp`` and return a handle with client connection. + """Spawn ``wolfharness serve-acp`` and return a handle with client connection. Args: config_path: Path to the YAML config file. @@ -112,7 +112,7 @@ async def _spawn_acp_server( client = DefaultACPClient(allow_file_operations=False) async with spawn_agent_process( lambda _conn: client, - "agentpool", + "wolfharness", "serve-acp", str(config_path), "--agent", diff --git a/tests/e2e/test_acp_subprocess.py b/tests/e2e/test_acp_subprocess.py index 09cc1daae..0f3395656 100644 --- a/tests/e2e/test_acp_subprocess.py +++ b/tests/e2e/test_acp_subprocess.py @@ -1,4 +1,4 @@ -"""L4 subprocess E2E tests for the ACP server (``agentpool serve-acp``). +"""L4 subprocess E2E tests for the ACP server (``wolfharness serve-acp``). L4a smoke tests (``@pytest.mark.e2e``, NOT slow): - test_server_startup: spawn serve-acp, verify process alive, initialize JSON-RPC @@ -51,7 +51,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] @@ -99,7 +99,7 @@ async def _spawn_acp_server( *, agent: str = "test_agent", ) -> AsyncIterator[ACPServerHandle]: - """Spawn ``agentpool serve-acp`` and return a handle with client connection. + """Spawn ``wolfharness serve-acp`` and return a handle with client connection. Args: config_path: Path to the YAML config file. @@ -114,7 +114,7 @@ async def _spawn_acp_server( client = DefaultACPClient(allow_file_operations=False) async with spawn_agent_process( lambda _conn: client, - "agentpool", + "wolfharness", "serve-acp", str(config_path), "--agent", diff --git a/tests/e2e/test_acp_v2_alignment.py b/tests/e2e/test_acp_v2_alignment.py index ea7d4d585..9b6763a20 100644 --- a/tests/e2e/test_acp_v2_alignment.py +++ b/tests/e2e/test_acp_v2_alignment.py @@ -32,7 +32,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] diff --git a/tests/e2e/test_acp_ws_transport.py b/tests/e2e/test_acp_ws_transport.py index 2a6361055..0b976d2c4 100644 --- a/tests/e2e/test_acp_ws_transport.py +++ b/tests/e2e/test_acp_ws_transport.py @@ -41,7 +41,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] diff --git a/tests/e2e/test_agui_subprocess.py b/tests/e2e/test_agui_subprocess.py index f4c0a1950..6f9334f35 100644 --- a/tests/e2e/test_agui_subprocess.py +++ b/tests/e2e/test_agui_subprocess.py @@ -1,4 +1,4 @@ -"""L4 subprocess E2E tests for the AG-UI server (``agentpool serve-agui``). +"""L4 subprocess E2E tests for the AG-UI server (``wolfharness serve-agui``). L4a smoke tests (``@pytest.mark.e2e``, NOT slow): - test_server_startup: spawn serve-agui, verify HTTP health @@ -28,7 +28,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_openai_api_subprocess.py b/tests/e2e/test_openai_api_subprocess.py index b7024532f..b834d20b8 100644 --- a/tests/e2e/test_openai_api_subprocess.py +++ b/tests/e2e/test_openai_api_subprocess.py @@ -1,4 +1,4 @@ -"""L4 subprocess E2E tests for the OpenAI-compatible API server (agentpool serve-api). +"""L4 subprocess E2E tests for the OpenAI-compatible API server (wolfharness serve-api). L4a smoke tests (@pytest.mark.e2e, NOT slow): - test_server_startup: spawn serve-api, verify HTTP health @@ -32,7 +32,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_opencode_agent_skill_command.py b/tests/e2e/test_opencode_agent_skill_command.py index 063c32fee..92211cbfd 100644 --- a/tests/e2e/test_opencode_agent_skill_command.py +++ b/tests/e2e/test_opencode_agent_skill_command.py @@ -27,7 +27,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_opencode_error_paths.py b/tests/e2e/test_opencode_error_paths.py index 939c991e8..6838872f4 100644 --- a/tests/e2e/test_opencode_error_paths.py +++ b/tests/e2e/test_opencode_error_paths.py @@ -27,7 +27,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_opencode_lock_concurrency.py b/tests/e2e/test_opencode_lock_concurrency.py index a770e0dea..fa27ec09f 100644 --- a/tests/e2e/test_opencode_lock_concurrency.py +++ b/tests/e2e/test_opencode_lock_concurrency.py @@ -35,7 +35,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_opencode_mcp.py b/tests/e2e/test_opencode_mcp.py index 41111a5d5..f3ec7775c 100644 --- a/tests/e2e/test_opencode_mcp.py +++ b/tests/e2e/test_opencode_mcp.py @@ -31,7 +31,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_opencode_message_ops.py b/tests/e2e/test_opencode_message_ops.py index 00601bac3..da774b357 100644 --- a/tests/e2e/test_opencode_message_ops.py +++ b/tests/e2e/test_opencode_message_ops.py @@ -33,7 +33,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_opencode_misc.py b/tests/e2e/test_opencode_misc.py index 3bf810a02..ef20151e8 100644 --- a/tests/e2e/test_opencode_misc.py +++ b/tests/e2e/test_opencode_misc.py @@ -26,7 +26,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_opencode_multiturn_redflag.py b/tests/e2e/test_opencode_multiturn_redflag.py index 7c1450b3f..95822a3af 100644 --- a/tests/e2e/test_opencode_multiturn_redflag.py +++ b/tests/e2e/test_opencode_multiturn_redflag.py @@ -34,7 +34,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] @@ -217,7 +217,7 @@ def _extract_text_part_text(msg: dict[str, Any]) -> str: def _id_timestamp_ms(msg_id: str) -> int | None: - """Extract millisecond timestamp from an agentpool ascending ID. + """Extract millisecond timestamp from an wolfharness ascending ID. AgentPool ID format: ``{prefix}_{16 hex chars}{14 base62 chars}`` where the 16 hex chars encode 8 bytes (64 bits) of diff --git a/tests/e2e/test_opencode_permission_question.py b/tests/e2e/test_opencode_permission_question.py index 4b3cbf1ee..b3985f4df 100644 --- a/tests/e2e/test_opencode_permission_question.py +++ b/tests/e2e/test_opencode_permission_question.py @@ -32,7 +32,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_opencode_prompt_delivery.py b/tests/e2e/test_opencode_prompt_delivery.py index f30204aef..b414fd0f7 100644 --- a/tests/e2e/test_opencode_prompt_delivery.py +++ b/tests/e2e/test_opencode_prompt_delivery.py @@ -30,7 +30,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_opencode_provider_mode_config.py b/tests/e2e/test_opencode_provider_mode_config.py index 3385ab40a..6134a369e 100644 --- a/tests/e2e/test_opencode_provider_mode_config.py +++ b/tests/e2e/test_opencode_provider_mode_config.py @@ -31,7 +31,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_opencode_session_lifecycle.py b/tests/e2e/test_opencode_session_lifecycle.py index c34129a28..b98b11e21 100644 --- a/tests/e2e/test_opencode_session_lifecycle.py +++ b/tests/e2e/test_opencode_session_lifecycle.py @@ -37,7 +37,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_opencode_sse_streaming.py b/tests/e2e/test_opencode_sse_streaming.py index 18287b8f2..605be5238 100644 --- a/tests/e2e/test_opencode_sse_streaming.py +++ b/tests/e2e/test_opencode_sse_streaming.py @@ -33,7 +33,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_opencode_subprocess.py b/tests/e2e/test_opencode_subprocess.py index 84b866fd1..e3c9abc4c 100644 --- a/tests/e2e/test_opencode_subprocess.py +++ b/tests/e2e/test_opencode_subprocess.py @@ -1,4 +1,4 @@ -"""L4 subprocess E2E tests for the OpenCode server (``agentpool serve-opencode``). +"""L4 subprocess E2E tests for the OpenCode server (``wolfharness serve-opencode``). L4a smoke tests (``@pytest.mark.e2e``, NOT slow): - test_server_startup: spawn serve-opencode, verify HTTP health @@ -33,7 +33,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_team_mode_smoke.py b/tests/e2e/test_team_mode_smoke.py index 1b48779ca..a6b8d013c 100644 --- a/tests/e2e/test_team_mode_smoke.py +++ b/tests/e2e/test_team_mode_smoke.py @@ -1,6 +1,6 @@ -"""L4a smoke E2E test for dynamic team mode via ``agentpool serve-opencode``. +"""L4a smoke E2E test for dynamic team mode via ``wolfharness serve-opencode``. -Spawns a real ``agentpool serve-opencode`` subprocess with a YAML config +Spawns a real ``wolfharness serve-opencode`` subprocess with a YAML config that enables ``team_mode`` and uses ``model: test`` (pydantic-ai TestModel — no API key needed). Verifies the server starts, accepts connections, and emits the SSE handshake event. @@ -40,7 +40,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] @@ -135,7 +135,7 @@ async def test_team_mode_server_starts( Given: a YAML config with ``team_mode`` enabled and ``model: test``. - When: ``agentpool serve-opencode`` is spawned as a subprocess. + When: ``wolfharness serve-opencode`` is spawned as a subprocess. Then: - The server starts and responds to HTTP health checks. diff --git a/tests/e2e/test_turn_split_e2e.py b/tests/e2e/test_turn_split_e2e.py index 052d164c0..5fcc74995 100644 --- a/tests/e2e/test_turn_split_e2e.py +++ b/tests/e2e/test_turn_split_e2e.py @@ -12,7 +12,7 @@ - Messages REST endpoint (``GET /session/{id}/message``) Strategy: - 1. Start a real ``agentpool serve-opencode`` subprocess with a TestModel + 1. Start a real ``wolfharness serve-opencode`` subprocess with a TestModel configured to call the ``bash`` tool (``sleep 2``) on the first request. This gives a 2-second window during tool execution for the steer to arrive mid-turn. @@ -49,7 +49,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/e2e/test_user_message_inserted_e2e.py b/tests/e2e/test_user_message_inserted_e2e.py index 20f6bd46b..b58f416a2 100644 --- a/tests/e2e/test_user_message_inserted_e2e.py +++ b/tests/e2e/test_user_message_inserted_e2e.py @@ -34,7 +34,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows stdio subprocess issues"), ] @@ -45,7 +45,7 @@ async def _spawn_acp_server( *, agent: str = "test_agent", ) -> AsyncIterator[tuple[ClientSideConnection, Any, DefaultACPClient]]: - """Spawn ``agentpool serve-acp`` and return (conn, process, client). + """Spawn ``wolfharness serve-acp`` and return (conn, process, client). Args: config_path: Path to the YAML config file. @@ -60,7 +60,7 @@ async def _spawn_acp_server( client = DefaultACPClient(allow_file_operations=False) async with spawn_agent_process( lambda _conn: client, - "agentpool", + "wolfharness", "serve-acp", str(config_path), "--agent", @@ -76,7 +76,7 @@ async def test_acp_server_steer_user_message_chunk_position( ) -> None: """L4a: Verify ``UserMessageChunk`` appears for a steer-marked prompt. - Spawns a real ``agentpool serve-acp`` subprocess, connects an ACP client, + Spawns a real ``wolfharness serve-acp`` subprocess, connects an ACP client, sends an initial prompt, then sends a second prompt with ``_meta.delivery="steer"``. The ACP server's ``_emit_user_message_chunks`` emits ``UserMessageChunk`` session updates for the user's input before diff --git a/tests/e2e/test_user_message_no_duplicate_e2e.py b/tests/e2e/test_user_message_no_duplicate_e2e.py index 31e5dfb01..952569a9b 100644 --- a/tests/e2e/test_user_message_no_duplicate_e2e.py +++ b/tests/e2e/test_user_message_no_duplicate_e2e.py @@ -8,7 +8,7 @@ - Messages REST endpoint (``GET /session/{id}/message``) Strategy: - 1. Start a real ``agentpool serve-opencode`` subprocess with a TestModel. + 1. Start a real ``wolfharness serve-opencode`` subprocess with a TestModel. 2. Open the SSE event stream (``GET /event``). 3. Send ONE prompt via ``POST /prompt_async``. 4. Collect SSE events until the session goes idle. @@ -39,7 +39,7 @@ pytestmark = [ pytest.mark.e2e, - pytest.mark.skipif(SKIP_NO_BINARY, reason="agentpool binary not on PATH"), + pytest.mark.skipif(SKIP_NO_BINARY, reason="wolfharness binary not on PATH"), pytest.mark.skipif(SKIP_WINDOWS, reason="Windows subprocess issues"), ] diff --git a/tests/elicitation/test_e2e_crash_recovery.py b/tests/elicitation/test_e2e_crash_recovery.py index 90c01ced3..ccda15516 100644 --- a/tests/elicitation/test_e2e_crash_recovery.py +++ b/tests/elicitation/test_e2e_crash_recovery.py @@ -25,25 +25,25 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.native_agent.checkpoint import CheckpointManager -from agentpool.orchestrator.core import EventBus -from agentpool.orchestrator.session_pool import SessionPool -from agentpool.sessions.models import ( +from wolfharness import Agent +from wolfharness.agents.native_agent.checkpoint import CheckpointManager +from wolfharness.orchestrator.core import EventBus +from wolfharness.orchestrator.session_pool import SessionPool +from wolfharness.sessions.models import ( ElicitationResumePayload, PendingDeferredCall, SessionData, ) -from agentpool.storage.manager import StorageManager -from agentpool.ui.base import InputProvider -from agentpool_config.storage import SQLStorageConfig, StorageConfig -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness.storage.manager import StorageManager +from wolfharness.ui.base import InputProvider +from wolfharness_config.storage import SQLStorageConfig, StorageConfig +from wolfharness_storage.sql_provider import SQLModelProvider if TYPE_CHECKING: from pathlib import Path - from agentpool.agents.context import AgentContext, ConfirmationResult + from wolfharness.agents.context import AgentContext, ConfirmationResult # --------------------------------------------------------------------------- diff --git a/tests/elicitation/test_integration_elicitation.py b/tests/elicitation/test_integration_elicitation.py index 95cc107e4..e9d142f38 100644 --- a/tests/elicitation/test_integration_elicitation.py +++ b/tests/elicitation/test_integration_elicitation.py @@ -5,7 +5,7 @@ paths, ElicitationFutureRegistry lifecycle, ACP/OpenCode event conversion, and ACP capability-gated elicitation behavior. -Refs: https://github.com/Leoyzen/agentpool/issues/107 +Refs: https://github.com/Leoyzen/wolfharness/issues/107 """ from __future__ import annotations @@ -18,18 +18,18 @@ from pydantic_ai.tools import DeferredToolRequests, DeferredToolResults, RunContext import pytest -from agentpool.agents.context import AgentContext, AgentRunContext -from agentpool.agents.events.events import ElicitationDeferredEvent -from agentpool.agents.native_agent.elicitation_bridge import ( +from wolfharness.agents.context import AgentContext, AgentRunContext +from wolfharness.agents.events.events import ElicitationDeferredEvent +from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, create_elicitation_bridge_capability, ) -from agentpool.orchestrator.core import SessionClosedError -from agentpool.sessions.models import ( +from wolfharness.orchestrator.core import SessionClosedError +from wolfharness.sessions.models import ( ElicitationResumePayload, PendingDeferredCall, ) -from agentpool.ui.base import InputProvider +from wolfharness.ui.base import InputProvider # ============================================================================ @@ -141,7 +141,7 @@ async def test_in_process_resume_resolves_future_and_completes_tool( run_ctx.deps.run_ctx.event_bus = mock_bus with patch( - "agentpool.agents.native_agent.elicitation_bridge._emit_elicitation_event", + "wolfharness.agents.native_agent.elicitation_bridge._emit_elicitation_event", new_callable=AsyncMock, ): result = await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -319,7 +319,7 @@ async def test_mixed_elicitation_and_deferred_tool_results_routing( run_ctx.deps.run_ctx.event_bus = mock_bus with patch( - "agentpool.agents.native_agent.elicitation_bridge._emit_elicitation_event", + "wolfharness.agents.native_agent.elicitation_bridge._emit_elicitation_event", new_callable=AsyncMock, ): result = await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -352,7 +352,7 @@ async def test_acp_converter_outputs_toolcallstart_for_elicitation_event() -> No with elicitation params in field_meta (deferred_handle, elicitation: True, elicitation_message, elicitation_schema, elicitation_mode). """ - from agentpool_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.event_converter import ACPEventConverter converter = ACPEventConverter() event = ElicitationDeferredEvent( @@ -442,7 +442,7 @@ async def capture_emit(ctx: RunContext[Any], event: ElicitationDeferredEvent) -> captured_event.append(event) with patch( - "agentpool.agents.native_agent.elicitation_bridge._emit_elicitation_event", + "wolfharness.agents.native_agent.elicitation_bridge._emit_elicitation_event", new=capture_emit, ): result = await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -540,16 +540,16 @@ async def test_opencode_processor_creates_toolpart_for_elicitation_event() -> No deferred_handle, elicitation: True, elicitation_message, elicitation_schema, elicitation_mode. """ - from agentpool_server.opencode_server.event_processor import EventProcessor - from agentpool_server.opencode_server.event_processor_context import ( + from wolfharness_server.opencode_server.event_processor import EventProcessor + from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) - from agentpool_server.opencode_server.models.message import ( + from wolfharness_server.opencode_server.models.message import ( MessagePath, MessageTime, MessageWithParts, ) - from agentpool_server.opencode_server.models.parts import ToolStateRunning + from wolfharness_server.opencode_server.models.parts import ToolStateRunning mock_state = MagicMock() assistant_msg = MessageWithParts.assistant( @@ -616,8 +616,8 @@ def test_acp_capability_gated_elicitation_fallback_to_request_permission() -> No ``checkpoint_enabled`` is False, ``supports_durable_elicitation`` returns False, meaning elicitation goes through the synchronous path. """ - from agentpool_server.acp_server.input_provider import ACPInputProvider - from agentpool_server.acp_server.session import ACPSession + from wolfharness_server.acp_server.input_provider import ACPInputProvider + from wolfharness_server.acp_server.session import ACPSession mock_session = MagicMock(spec=ACPSession) mock_session.checkpoint_enabled = False @@ -636,8 +636,8 @@ async def test_acp_capability_gated_form_but_not_url() -> None: only form-mode elicitation should be durable. This tests the ``_client_supports_elicitation`` method's mode-based gating. """ - from agentpool_server.acp_server.input_provider import ACPInputProvider - from agentpool_server.acp_server.session import ACPSession + from wolfharness_server.acp_server.input_provider import ACPInputProvider + from wolfharness_server.acp_server.session import ACPSession mock_session = MagicMock(spec=ACPSession) mock_session.checkpoint_enabled = True diff --git a/tests/elicitation/test_protocol_integration.py b/tests/elicitation/test_protocol_integration.py index 47b6d0c48..3639a8727 100644 --- a/tests/elicitation/test_protocol_integration.py +++ b/tests/elicitation/test_protocol_integration.py @@ -11,7 +11,7 @@ - ACP event converter with real EventBus subscription - handle_elicitation raises CallDeferred with real AgentContext -Refs: https://github.com/Leoyzen/agentpool/issues/107 +Refs: https://github.com/Leoyzen/wolfharness/issues/107 """ from __future__ import annotations @@ -26,15 +26,15 @@ from pydantic_ai.tools import DeferredToolRequests, RunContext import pytest -from agentpool.agents.context import AgentContext, AgentRunContext -from agentpool.agents.events.events import ElicitationDeferredEvent -from agentpool.agents.native_agent.elicitation_bridge import ( +from wolfharness.agents.context import AgentContext, AgentRunContext +from wolfharness.agents.events.events import ElicitationDeferredEvent +from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, create_elicitation_bridge_capability, ) -from agentpool.orchestrator.core import EventBus, SessionController -from agentpool.tools import CallDeferred -from agentpool.ui.base import InputProvider +from wolfharness.orchestrator.core import EventBus, SessionController +from wolfharness.tools import CallDeferred +from wolfharness.ui.base import InputProvider # ============================================================================ @@ -50,7 +50,7 @@ async def test_deferred_tool_requests_in_output_type_with_capabilities() -> None DeferredToolRequests to the pydantic-ai agent's output_type so deferred tool calls can be returned as agent output. """ - from agentpool import Agent + from wolfharness import Agent model = TestModel(custom_output_text="test response") @@ -131,7 +131,7 @@ async def test_session_state_checkpoint_enabled_with_store() -> None: When SessionController is constructed with a non-None store, create_session() must set SessionState.checkpoint_enabled=True. """ - from agentpool_storage.memory_provider.provider import MemoryStorageProvider + from wolfharness_storage.memory_provider.provider import MemoryStorageProvider store = MemoryStorageProvider() pool = _FakePool() @@ -183,8 +183,8 @@ async def test_acp_session_proxy_checkpoint_enabled_propagates() -> None: """ from acp.agent.acp_requests import ACPRequests from acp.schema.capabilities import ClientCapabilities - from agentpool_server.acp_server.handler import _ACPSessionProxy - from agentpool_server.acp_server.input_provider import ACPInputProvider + from wolfharness_server.acp_server.handler import _ACPSessionProxy + from wolfharness_server.acp_server.input_provider import ACPInputProvider # Create a mock client for ACPRequests — we won't actually call it. mock_client = MagicMock() @@ -208,8 +208,8 @@ async def test_acp_session_proxy_checkpoint_disabled_propagates() -> None: """ from acp.agent.acp_requests import ACPRequests from acp.schema.capabilities import ClientCapabilities - from agentpool_server.acp_server.handler import _ACPSessionProxy - from agentpool_server.acp_server.input_provider import ACPInputProvider + from wolfharness_server.acp_server.handler import _ACPSessionProxy + from wolfharness_server.acp_server.input_provider import ACPInputProvider mock_client = MagicMock() requests = ACPRequests(client=mock_client, session_id="test-session") @@ -372,7 +372,7 @@ async def test_acp_event_converter_with_real_event_bus() -> None: and verifies the ACPEventConverter yields a ToolCallStart with elicitation params in field_meta. """ - from agentpool_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.event_converter import ACPEventConverter event_bus = EventBus() session_id = "test-converter-session" diff --git a/tests/elicitation/test_resume_lifecycle.py b/tests/elicitation/test_resume_lifecycle.py index 80ce9938b..9bff707e2 100644 --- a/tests/elicitation/test_resume_lifecycle.py +++ b/tests/elicitation/test_resume_lifecycle.py @@ -31,7 +31,7 @@ Level 1 passes, the bug is in ``RunHandle.start()`` event forwarding or ``EventBus`` delivery. -Refs: https://github.com/Leoyzen/agentpool/issues/107 +Refs: https://github.com/Leoyzen/wolfharness/issues/107 """ from __future__ import annotations @@ -45,22 +45,22 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.context import AgentContext, AgentRunContext, ConfirmationResult -from agentpool.agents.events.events import ( +from wolfharness import Agent +from wolfharness.agents.context import AgentContext, AgentRunContext, ConfirmationResult +from wolfharness.agents.events.events import ( RichAgentStreamEvent, StreamCompleteEvent, ) -from agentpool.agents.native_agent.turn import NativeTurn -from agentpool.lifecycle import MemoryJournal, ProtocolChannel -from agentpool.orchestrator.core import EventBus, EventEnvelope, SessionState -from agentpool.orchestrator.run import RunHandle -from agentpool.sessions.models import ElicitationResumePayload -from agentpool.ui.base import InputProvider +from wolfharness.agents.native_agent.turn import NativeTurn +from wolfharness.lifecycle import MemoryJournal, ProtocolChannel +from wolfharness.orchestrator.core import EventBus, EventEnvelope, SessionState +from wolfharness.orchestrator.run import RunHandle +from wolfharness.sessions.models import ElicitationResumePayload +from wolfharness.ui.base import InputProvider if TYPE_CHECKING: - from agentpool.agents.native_agent.elicitation_bridge import ( + from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, ) @@ -419,7 +419,7 @@ async def collect_events() -> None: ) # Assert: StreamCompleteEvent(cancelled=True) should be yielded. - from agentpool.agents.events.events import RunErrorEvent + from wolfharness.agents.events.events import RunErrorEvent stream_complete_events = [e for e in events if isinstance(e, StreamCompleteEvent)] run_error_events = [e for e in events if isinstance(e, RunErrorEvent)] diff --git a/tests/elicitation/test_unit_elicitation.py b/tests/elicitation/test_unit_elicitation.py index 0e64b7c4d..9f65bf1af 100644 --- a/tests/elicitation/test_unit_elicitation.py +++ b/tests/elicitation/test_unit_elicitation.py @@ -3,7 +3,7 @@ Covers Tasks 9.1-9.7, 9.14-9.16, 9.18-9.19, 9.21-9.22 from the durable-elicitation-bridge plan. -Refs: https://github.com/Leoyzen/agentpool/issues/107 +Refs: https://github.com/Leoyzen/wolfharness/issues/107 # TODO: L2 migration — test uses complex inline mock_pool + mock_session_pool @@ -22,21 +22,21 @@ from pydantic_ai.tools import DeferredToolRequests, RunContext import pytest -from agentpool.agents.context import AgentContext, AgentRunContext -from agentpool.agents.events.events import ElicitationDeferredEvent -from agentpool.agents.native_agent.elicitation_bridge import ( +from wolfharness.agents.context import AgentContext, AgentRunContext +from wolfharness.agents.events.events import ElicitationDeferredEvent +from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, create_elicitation_bridge_capability, ) -from agentpool.agents.native_agent.elicitation_strategy import ( +from wolfharness.agents.native_agent.elicitation_strategy import ( CheckpointResolutionStrategy, ElicitationResolutionStrategy, ProtocolResolutionStrategy, ) -from agentpool.sessions.models import ElicitationResumePayload, PendingDeferredCall -from agentpool.tools import CallDeferred -from agentpool.ui.base import InputProvider -from agentpool.ui.elicitation import normalize_elicit_content +from wolfharness.sessions.models import ElicitationResumePayload, PendingDeferredCall +from wolfharness.tools import CallDeferred +from wolfharness.ui.base import InputProvider +from wolfharness.ui.elicitation import normalize_elicit_content # ============================================================================ @@ -173,10 +173,10 @@ async def test_handle_elicitation_durable_true_local( """ import asyncio - from agentpool.agents.native_agent.elicitation_bridge import ( + from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, ) - from agentpool.sessions.models import ElicitationResumePayload + from wolfharness.sessions.models import ElicitationResumePayload provider = MagicMock(spec=InputProvider) provider.supports_durable_elicitation = True @@ -238,8 +238,8 @@ async def test_handle_elicitation_durable_false( @pytest.mark.unit async def test_call_tool_raises_call_deferred(agent_ctx: AgentContext) -> None: """MCPClient.call_tool raises CallDeferred when side-channel is set.""" - from agentpool.mcp_server.client import MCPClient - from agentpool_config.mcp_server import StdioMCPServerConfig + from wolfharness.mcp_server.client import MCPClient + from wolfharness_config.mcp_server import StdioMCPServerConfig agent_ctx._pending_elicitation_deferral = { "message": "Enter credentials", @@ -261,7 +261,7 @@ async def test_call_tool_raises_call_deferred(agent_ctx: AgentContext) -> None: with ( patch( - "agentpool.mcp_server.conversions.from_mcp_content", + "wolfharness.mcp_server.conversions.from_mcp_content", new=AsyncMock(return_value=[]), ), pytest.raises(CallDeferred) as exc_info, @@ -282,8 +282,8 @@ async def test_call_tool_raises_call_deferred(agent_ctx: AgentContext) -> None: @pytest.mark.unit async def test_call_tool_normal_path(agent_ctx: AgentContext) -> None: """MCPClient.call_tool returns normally when no deferral is pending.""" - from agentpool.mcp_server.client import MCPClient - from agentpool_config.mcp_server import StdioMCPServerConfig + from wolfharness.mcp_server.client import MCPClient + from wolfharness_config.mcp_server import StdioMCPServerConfig assert agent_ctx._pending_elicitation_deferral is None config = StdioMCPServerConfig(command="echo", args=["test"]) @@ -300,7 +300,7 @@ async def test_call_tool_normal_path(agent_ctx: AgentContext) -> None: client._client = mock_inner_client with patch( - "agentpool.mcp_server.conversions.from_mcp_content", + "wolfharness.mcp_server.conversions.from_mcp_content", new=AsyncMock(return_value=[]), ): result = await client.call_tool("test_tool", MagicMock(), {"arg": "val"}, agent_ctx) @@ -354,7 +354,7 @@ async def test_bridge_handles_elicitation_and_passthrough(run_ctx: RunContext[An run_ctx.deps.run_ctx.event_bus = mock_bus with patch( - "agentpool.agents.native_agent.elicitation_bridge._emit_elicitation_event", + "wolfharness.agents.native_agent.elicitation_bridge._emit_elicitation_event", new_callable=AsyncMock, ) as mock_emit: result = await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -414,7 +414,7 @@ async def test_future_registry_lifecycle() -> None: @pytest.mark.unit def test_acp_input_provider_supports_durable_elicitation() -> None: """ACPInputProvider.supports_durable_elicitation reflects session.checkpoint_enabled.""" - from agentpool_server.acp_server.input_provider import ACPInputProvider + from wolfharness_server.acp_server.input_provider import ACPInputProvider mock_session = MagicMock() mock_session.checkpoint_enabled = True @@ -427,7 +427,7 @@ def test_acp_input_provider_supports_durable_elicitation() -> None: @pytest.mark.unit def test_opencode_input_provider_supports_durable_elicitation() -> None: """OpenCodeInputProvider.supports_durable_elicitation checks session state.""" - from agentpool_server.opencode_server.input_provider import OpenCodeInputProvider + from wolfharness_server.opencode_server.input_provider import OpenCodeInputProvider mock_state = MagicMock() mock_session = MagicMock() @@ -458,8 +458,8 @@ async def test_side_channel_cleanup_on_error(agent_ctx: AgentContext) -> None: regardless of success or failure, ensuring no stale handler leaks into the next call. """ - from agentpool.mcp_server.client import MCPClient - from agentpool_config.mcp_server import StdioMCPServerConfig + from wolfharness.mcp_server.client import MCPClient + from wolfharness_config.mcp_server import StdioMCPServerConfig agent_ctx._pending_elicitation_deferral = { "message": "Enter key", @@ -514,7 +514,7 @@ async def test_bridge_positioning_elicitation_before_approval(run_ctx: RunContex run_ctx.deps.run_ctx.event_bus = mock_bus with patch( - "agentpool.agents.native_agent.elicitation_bridge._emit_elicitation_event", + "wolfharness.agents.native_agent.elicitation_bridge._emit_elicitation_event", new_callable=AsyncMock, ): result = await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -719,10 +719,10 @@ async def test_handle_elicitation_passes_current_messages_to_checkpoint( """ import asyncio - from agentpool.agents.native_agent.elicitation_bridge import ( + from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, ) - from agentpool.sessions.models import ElicitationResumePayload + from wolfharness.sessions.models import ElicitationResumePayload provider = MagicMock(spec=InputProvider) provider.supports_durable_elicitation = True @@ -792,10 +792,10 @@ async def test_handle_elicitation_checkpoint_failure_doesnt_set_checkpointed( """ import asyncio - from agentpool.agents.native_agent.elicitation_bridge import ( + from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, ) - from agentpool.sessions.models import ElicitationResumePayload + from wolfharness.sessions.models import ElicitationResumePayload provider = MagicMock(spec=InputProvider) provider.supports_durable_elicitation = True @@ -856,10 +856,10 @@ async def test_handle_elicitation_updates_session_status_to_checkpointed( """ import asyncio - from agentpool.agents.native_agent.elicitation_bridge import ( + from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, ) - from agentpool.sessions.models import ElicitationResumePayload, SessionData + from wolfharness.sessions.models import ElicitationResumePayload, SessionData provider = MagicMock(spec=InputProvider) provider.supports_durable_elicitation = True @@ -936,10 +936,10 @@ async def test_handle_elicitation_skips_status_update_if_not_active( """ import asyncio - from agentpool.agents.native_agent.elicitation_bridge import ( + from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, ) - from agentpool.sessions.models import ElicitationResumePayload, SessionData + from wolfharness.sessions.models import ElicitationResumePayload, SessionData provider = MagicMock(spec=InputProvider) provider.supports_durable_elicitation = True @@ -1018,10 +1018,10 @@ async def test_handle_elicitation_uses_active_agent_run_messages_for_checkpoint( """ import asyncio - from agentpool.agents.native_agent.elicitation_bridge import ( + from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, ) - from agentpool.sessions.models import ElicitationResumePayload + from wolfharness.sessions.models import ElicitationResumePayload provider = MagicMock(spec=InputProvider) provider.supports_durable_elicitation = True @@ -1082,10 +1082,10 @@ async def test_handle_elicitation_empty_checkpoint_when_no_active_run( """ import asyncio - from agentpool.agents.native_agent.elicitation_bridge import ( + from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, ) - from agentpool.sessions.models import ElicitationResumePayload + from wolfharness.sessions.models import ElicitationResumePayload provider = MagicMock(spec=InputProvider) provider.supports_durable_elicitation = True @@ -1164,10 +1164,10 @@ async def test_handle_elicitation_resume_payload_normalizes_nested_content( """ import asyncio - from agentpool.agents.native_agent.elicitation_bridge import ( + from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, ) - from agentpool.sessions.models import ElicitationResumePayload + from wolfharness.sessions.models import ElicitationResumePayload provider = MagicMock(spec=InputProvider) provider.supports_durable_elicitation = True diff --git a/tests/fixtures/minimal_pool.py b/tests/fixtures/minimal_pool.py index ade97ad06..be39a19d8 100644 --- a/tests/fixtures/minimal_pool.py +++ b/tests/fixtures/minimal_pool.py @@ -11,7 +11,7 @@ import pytest import yamling -from agentpool import AgentPool, AgentsManifest +from wolfharness import AgentPool, AgentsManifest if TYPE_CHECKING: diff --git a/tests/fixtures/subagent_events.py b/tests/fixtures/subagent_events.py index 8f6d73b57..ac0708dd4 100644 --- a/tests/fixtures/subagent_events.py +++ b/tests/fixtures/subagent_events.py @@ -36,7 +36,7 @@ ) import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( PartDeltaEvent, PartStartEvent, SpawnSessionStart, @@ -109,7 +109,7 @@ def get_tool_error_event( def get_stream_complete_event() -> StreamCompleteEvent[Any]: """Create a stream complete event.""" - from agentpool.messaging import ChatMessage + from wolfharness.messaging import ChatMessage message = ChatMessage( role="assistant", diff --git a/tests/fixtures/team_mode_pool.py b/tests/fixtures/team_mode_pool.py index 86a867c9e..94b2305ce 100644 --- a/tests/fixtures/team_mode_pool.py +++ b/tests/fixtures/team_mode_pool.py @@ -17,7 +17,7 @@ async def test_something(team_mode_pool): import pytest import yamling -from agentpool import AgentPool, AgentsManifest +from wolfharness import AgentPool, AgentsManifest if TYPE_CHECKING: diff --git a/tests/fixtures/test_resource_cap.py b/tests/fixtures/test_resource_cap.py index 7c24d1915..86a9afa06 100644 --- a/tests/fixtures/test_resource_cap.py +++ b/tests/fixtures/test_resource_cap.py @@ -29,7 +29,7 @@ from pydantic_ai.capabilities import AbstractCapability from pydantic_ai.toolsets import FunctionToolset -from agentpool.capabilities.resource_protocols import ( +from wolfharness.capabilities.resource_protocols import ( ResourceEntry, SkillEntry, TextResourceContent, diff --git a/tests/functional/test_functional.py b/tests/functional/test_functional.py index a23d336f1..7ba12964d 100644 --- a/tests/functional/test_functional.py +++ b/tests/functional/test_functional.py @@ -4,7 +4,7 @@ import pytest -from agentpool.functional import run_agent, run_agent_sync +from wolfharness.functional import run_agent, run_agent_sync pytestmark = pytest.mark.unit diff --git a/tests/hooks/test_hook_aware_turn.py b/tests/hooks/test_hook_aware_turn.py index fc4e309ed..3c5da1877 100644 --- a/tests/hooks/test_hook_aware_turn.py +++ b/tests/hooks/test_hook_aware_turn.py @@ -13,9 +13,9 @@ import pytest -from agentpool.agents.context import AgentRunContext -from agentpool.hooks import AgentHooks, CallableHook, HookResult -from agentpool.orchestrator.turn import HookAwareTurn +from wolfharness.agents.context import AgentRunContext +from wolfharness.hooks import AgentHooks, CallableHook, HookResult +from wolfharness.orchestrator.turn import HookAwareTurn # --------------------------------------------------------------------------- diff --git a/tests/hooks/test_hook_smoke_matrix.py b/tests/hooks/test_hook_smoke_matrix.py index 71a5cc2ac..422c37d2e 100644 --- a/tests/hooks/test_hook_smoke_matrix.py +++ b/tests/hooks/test_hook_smoke_matrix.py @@ -23,13 +23,13 @@ ToolCallStart, TurnCompleteUpdate, ) -from agentpool import Agent -from agentpool.agents.acp_agent.turn import ACPTurn -from agentpool.agents.context import AgentRunContext -from agentpool.hooks import AgentHooks, CallableHook, HookResult -from agentpool.lifecycle import DirectChannel, MemoryJournal -from agentpool.orchestrator.core import EventBus, SessionState -from agentpool.orchestrator.run import RunHandle +from wolfharness import Agent +from wolfharness.agents.acp_agent.turn import ACPTurn +from wolfharness.agents.context import AgentRunContext +from wolfharness.hooks import AgentHooks, CallableHook, HookResult +from wolfharness.lifecycle import DirectChannel, MemoryJournal +from wolfharness.orchestrator.core import EventBus, SessionState +from wolfharness.orchestrator.run import RunHandle # --------------------------------------------------------------------------- @@ -96,7 +96,7 @@ def simple_tool() -> str: ) async with agent: run_ctx = AgentRunContext(session_id="smoke-session") - from agentpool.agents.native_agent.turn import NativeTurn + from wolfharness.agents.native_agent.turn import NativeTurn turn = NativeTurn( agent=agent, diff --git a/tests/hooks/test_hooks.py b/tests/hooks/test_hooks.py index ace78201d..e8c028eb3 100644 --- a/tests/hooks/test_hooks.py +++ b/tests/hooks/test_hooks.py @@ -6,15 +6,15 @@ import pytest -from agentpool import Agent -from agentpool.hooks import AgentHooks, CallableHook +from wolfharness import Agent +from wolfharness.hooks import AgentHooks, CallableHook pytestmark = pytest.mark.unit if TYPE_CHECKING: - from agentpool.hooks import HookResult + from wolfharness.hooks import HookResult # Hook state for testing diff --git a/tests/host/test_context.py b/tests/host/test_context.py index 5184f252e..8b7bf2d68 100644 --- a/tests/host/test_context.py +++ b/tests/host/test_context.py @@ -12,8 +12,8 @@ import pytest -from agentpool.host.context import HostContext -from agentpool.host.stubs import CapabilityCache, ModelCache, ModelRegistry +from wolfharness.host.context import HostContext +from wolfharness.host.stubs import CapabilityCache, ModelCache, ModelRegistry pytestmark = pytest.mark.unit diff --git a/tests/host/test_factory.py b/tests/host/test_factory.py index 6b2801e31..16b3aa634 100644 --- a/tests/host/test_factory.py +++ b/tests/host/test_factory.py @@ -7,11 +7,11 @@ import pytest -from agentpool.host.factory import AgentFactory +from wolfharness.host.factory import AgentFactory if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit @@ -103,7 +103,7 @@ def test_compile_does_not_register_skills_tools_provider_at_agent_scope( otherwise it gets registered at AGENT scope too, causing duplicate capability entries in get_visible_capabilities() and tool name conflicts. """ - from agentpool.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel skills_provider = MagicMock() skills_provider.__class__ = type("FakeSkillsProvider", (), {}) @@ -134,10 +134,9 @@ def test_compile_registers_config_capabilities_at_agent_scope( minimal_pool: AgentPool, ) -> None: """Config-defined capabilities (e.g. Viking) are registered at AGENT scope.""" - from agentpool.capabilities.extension_registry import Scope, ScopeLevel - # Use our test ResourceAccess capability from tests.fixtures.test_resource_cap import TestResourceAccessCap + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel test_cap = TestResourceAccessCap(read_text="test", read_uri="test://x") @@ -155,7 +154,7 @@ def test_compile_registers_config_capabilities_at_agent_scope( factory = AgentFactory(pool=minimal_pool) - with patch("agentpool.models.agents.NativeAgentConfig", (type(cfg),)): + with patch("wolfharness.models.agents.NativeAgentConfig", (type(cfg),)): factory.compile( manifest=manifest, host_context=_make_host_context(), @@ -164,7 +163,7 @@ def test_compile_registers_config_capabilities_at_agent_scope( agent_scope = Scope(level=ScopeLevel.AGENT, agent_name="test_agent") visible = minimal_pool.extension_registry.get_visible_capabilities(agent_scope) # TestResourceAccessCap should be at AGENT scope - from agentpool.capabilities.resource_protocols import ResourceAccess + from wolfharness.capabilities.resource_protocols import ResourceAccess ra_caps = [c for c in visible if isinstance(c, ResourceAccess)] assert len(ra_caps) == 1 @@ -180,7 +179,7 @@ def test_get_visible_capabilities_no_duplicates_across_scopes( This test documents that behavior so callers know to handle duplicates or avoid cross-scope registration of the same instance. """ - from agentpool.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel cap = MagicMock() reg = minimal_pool.extension_registry @@ -211,7 +210,7 @@ async def test_create_session_agent_native_main_calls_get_agent_with_pool( factory = AgentFactory(pool=pool) - with patch("agentpool.models.agents.NativeAgentConfig", (type(cfg),)): + with patch("wolfharness.models.agents.NativeAgentConfig", (type(cfg),)): result = await factory.create_session_agent( agent_name="test_agent", session_id="sess-1", @@ -236,7 +235,7 @@ async def test_create_session_agent_native_main_calls_aenter(minimal_pool: Agent factory = AgentFactory(pool=minimal_pool) - with patch("agentpool.models.agents.NativeAgentConfig", (type(cfg),)): + with patch("wolfharness.models.agents.NativeAgentConfig", (type(cfg),)): await factory.create_session_agent( agent_name="test_agent", session_id="sess-1", @@ -260,7 +259,7 @@ async def test_create_session_agent_native_main_no_pool_providers(minimal_pool: factory = AgentFactory(pool=minimal_pool) - with patch("agentpool.models.agents.NativeAgentConfig", (type(cfg),)): + with patch("wolfharness.models.agents.NativeAgentConfig", (type(cfg),)): await factory.create_session_agent( agent_name="test_agent", session_id="sess-1", @@ -304,7 +303,7 @@ async def test_create_session_agent_non_native_builds_snapshot_manually( factory = AgentFactory(pool=pool) # empty tuple → isinstance always False - with patch("agentpool.models.agents.NativeAgentConfig", ()): + with patch("wolfharness.models.agents.NativeAgentConfig", ()): result = await factory.create_session_agent( agent_name="acp_agent", session_id="sess-1", @@ -343,7 +342,7 @@ async def test_create_session_agent_fixes_missing_name(minimal_pool: AgentPool) host_context = _make_host_context() factory = AgentFactory(pool=minimal_pool) - with patch("agentpool.models.agents.NativeAgentConfig", (type(new_cfg),)): + with patch("wolfharness.models.agents.NativeAgentConfig", (type(new_cfg),)): await factory.create_session_agent( agent_name="fixed_name", session_id="sess-1", @@ -370,7 +369,7 @@ async def test_create_session_agent_native_main_loads_session(minimal_pool: Agen factory = AgentFactory(pool=minimal_pool) - with patch("agentpool.models.agents.NativeAgentConfig", (type(cfg),)): + with patch("wolfharness.models.agents.NativeAgentConfig", (type(cfg),)): await factory.create_session_agent( agent_name="test_agent", session_id="sess-42", diff --git a/tests/host/test_registry.py b/tests/host/test_registry.py index 7c3f12eea..a951f4159 100644 --- a/tests/host/test_registry.py +++ b/tests/host/test_registry.py @@ -6,7 +6,7 @@ import pytest -from agentpool.host.registry import AgentRegistry +from wolfharness.host.registry import AgentRegistry pytestmark = pytest.mark.unit diff --git a/tests/integration/test_acp_agent_close.py b/tests/integration/test_acp_agent_close.py index 27b182c22..5dca9d4a7 100644 --- a/tests/integration/test_acp_agent_close.py +++ b/tests/integration/test_acp_agent_close.py @@ -8,7 +8,7 @@ import pytest -from agentpool.utils.task_group import ManagedTaskGroup +from wolfharness.utils.task_group import ManagedTaskGroup pytestmark = pytest.mark.integration diff --git a/tests/integration/test_acp_streaming.py b/tests/integration/test_acp_streaming.py index 1761ae388..6255f7cce 100644 --- a/tests/integration/test_acp_streaming.py +++ b/tests/integration/test_acp_streaming.py @@ -36,10 +36,10 @@ ToolCallProgress, ToolCallStart, ) -from agentpool.agents.acp_agent import ACPAgent -from agentpool.agents.acp_agent.session_state import ACPSessionState -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import ( +from wolfharness.agents.acp_agent import ACPAgent +from wolfharness.agents.acp_agent.session_state import ACPSessionState +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import ( PartDeltaEvent, RunStartedEvent, StreamCompleteEvent, @@ -47,7 +47,7 @@ ToolCallStartEvent, ToolResultMetadataEvent, ) -from agentpool.messaging import ChatMessage +from wolfharness.messaging import ChatMessage pytestmark = pytest.mark.unit @@ -401,7 +401,7 @@ async def test_acp_streaming_event_sequence_with_tool_metadata( ) # Patch acp_to_native_event to allow ToolResultMetadataEvent passthrough - from agentpool.agents.acp_agent import acp_converters as converters_mod + from wolfharness.agents.acp_agent import acp_converters as converters_mod global _original_acp_to_native_event # noqa: PLW0603 _original_acp_to_native_event = converters_mod.acp_to_native_event diff --git a/tests/integration/test_base_server_start_background.py b/tests/integration/test_base_server_start_background.py index 49dfb8187..f6432c51a 100644 --- a/tests/integration/test_base_server_start_background.py +++ b/tests/integration/test_base_server_start_background.py @@ -12,7 +12,7 @@ import pytest -from agentpool_server.base import BaseServer +from wolfharness_server.base import BaseServer pytestmark = pytest.mark.integration diff --git a/tests/integration/test_cross_protocol.py b/tests/integration/test_cross_protocol.py index f493baf5e..386f48654 100644 --- a/tests/integration/test_cross_protocol.py +++ b/tests/integration/test_cross_protocol.py @@ -10,9 +10,9 @@ import pytest -from agentpool.agents.modes import ModeCategory, ModeInfo -from agentpool_server.acp_server.acp_agent import get_agent_role_config_option -from agentpool_server.opencode_server.routes.config_routes import list_modes +from wolfharness.agents.modes import ModeCategory, ModeInfo +from wolfharness_server.acp_server.acp_agent import get_agent_role_config_option +from wolfharness_server.opencode_server.routes.config_routes import list_modes pytestmark = pytest.mark.unit @@ -87,9 +87,9 @@ async def test_agent_role_hidden_when_single_mode(self): async def test_cross_protocol_model_alignment(self): """Both protocols reflect same underlying model state.""" - from agentpool.models.model_configs import StringModelConfig - from agentpool_server.acp_server.provider_router import ProviderRouter - from agentpool_server.shared.model_utils import build_model_state_for_acp + from wolfharness.models.model_configs import StringModelConfig + from wolfharness_server.acp_server.provider_router import ProviderRouter + from wolfharness_server.shared.model_utils import build_model_state_for_acp # Manifest with configured variants manifest = MagicMock() diff --git a/tests/integration/test_event_manager_lifecycle.py b/tests/integration/test_event_manager_lifecycle.py index 26561cd6b..e8f9ee5e0 100644 --- a/tests/integration/test_event_manager_lifecycle.py +++ b/tests/integration/test_event_manager_lifecycle.py @@ -13,7 +13,7 @@ import pytest -from agentpool.messaging.event_manager import EventManager +from wolfharness.messaging.event_manager import EventManager pytestmark = pytest.mark.integration diff --git a/tests/integration/test_permission_denial_sync.py b/tests/integration/test_permission_denial_sync.py index 174c0a7e0..3cb05c0bf 100644 --- a/tests/integration/test_permission_denial_sync.py +++ b/tests/integration/test_permission_denial_sync.py @@ -23,7 +23,7 @@ if TYPE_CHECKING: - from agentpool import AgentContext + from wolfharness import AgentContext @dataclass diff --git a/tests/integration/test_skill_e2e.py b/tests/integration/test_skill_e2e.py index db2e55695..f8c07c9f9 100644 --- a/tests/integration/test_skill_e2e.py +++ b/tests/integration/test_skill_e2e.py @@ -18,24 +18,24 @@ import pytest -from agentpool.capabilities.extension_registry import ( +from wolfharness.capabilities.extension_registry import ( ExtensionRegistry, Scope, ScopeLevel, ) -from agentpool.capabilities.resource_protocols import ( +from wolfharness.capabilities.resource_protocols import ( SkillEntry, SkillResource, ) -from agentpool.capabilities.skill_manager_cap import SkillManagerCap -from agentpool.skills.skill import Skill -from agentpool.skills.skill_tool_manager import SkillToolManager -from agentpool.skills.uri_resolver import SkillURIResolver -from agentpool_config.skills import SkillToolConfig +from wolfharness.capabilities.skill_manager_cap import SkillManagerCap +from wolfharness.skills.skill import Skill +from wolfharness.skills.skill_tool_manager import SkillToolManager +from wolfharness.skills.uri_resolver import SkillURIResolver +from wolfharness_config.skills import SkillToolConfig if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit @@ -160,7 +160,7 @@ async def test_skill_uri_resolution_nonexistent_skill() -> None: Given a SkillURIResolver with ExtensionRegistry, When resolving a nonexistent skill URI, Then SkillNotFoundError is raised. """ - from agentpool.skills.exceptions import SkillNotFoundError + from wolfharness.skills.exceptions import SkillNotFoundError skill = make_skill(name="existing-skill", instructions="Content.") cap = SkillManagerCap(local_skills={"existing-skill": skill}) @@ -214,7 +214,7 @@ def test_load_skill_available_in_standalone_agent(minimal_pool: AgentPool) -> No owned by SkillManagerCap (registered at pool scope). _inject_pool_providers no longer injects skills_tools_provider. """ - from agentpool.host.factory import _inject_pool_providers + from wolfharness.host.factory import _inject_pool_providers class FakeAgent: def __init__(self) -> None: @@ -247,7 +247,7 @@ def test_load_skill_available_in_child_session_agent(minimal_pool: AgentPool) -> the agent's _external_capabilities is checked, Then only the MCP aggregating provider is injected (skills come from SkillManagerCap). """ - from agentpool.host.factory import _inject_pool_providers + from wolfharness.host.factory import _inject_pool_providers class FakeAgent: def __init__(self) -> None: @@ -348,7 +348,7 @@ async def test_load_skill_return_includes_tool_status() -> None: display tool import status. We verify that the tool import succeeds and the MCP server config is accessible. """ - from agentpool_config.skills import SkillMcpServerConfig + from wolfharness_config.skills import SkillMcpServerConfig skill = make_skill( name="status-skill", diff --git a/tests/integration/test_skill_resolution.py b/tests/integration/test_skill_resolution.py index 98b57baf9..3c84ca8a9 100644 --- a/tests/integration/test_skill_resolution.py +++ b/tests/integration/test_skill_resolution.py @@ -12,10 +12,10 @@ import pytest from upathtools import UPath -from agentpool import AgentPool -from agentpool.skills.exceptions import SecurityError -from agentpool.skills.uri_resolver import ResolvedSkillURI -from agentpool.tools.exceptions import ToolError +from wolfharness import AgentPool +from wolfharness.skills.exceptions import SecurityError +from wolfharness.skills.uri_resolver import ResolvedSkillURI +from wolfharness.tools.exceptions import ToolError pytestmark = pytest.mark.integration @@ -272,7 +272,7 @@ async def test_positional_argument_substitution( test_skill_with_reference: UPath, ) -> None: """Test $1, $2 argument substitution.""" - from agentpool_toolsets.builtin.skills import _substitute_arguments + from wolfharness_toolsets.builtin.skills import _substitute_arguments instructions = "First: $1, Second: $2" result = _substitute_arguments(instructions, "hello world") @@ -285,7 +285,7 @@ async def test_all_arguments_substitution( test_skill_with_reference: UPath, ) -> None: """Test $@ and $ARGUMENTS substitution.""" - from agentpool_toolsets.builtin.skills import _substitute_arguments + from wolfharness_toolsets.builtin.skills import _substitute_arguments instructions = "All: $@, Also: $ARGUMENTS" result = _substitute_arguments(instructions, "arg1 arg2 arg3") @@ -298,7 +298,7 @@ async def test_mixed_argument_substitution( test_skill_with_reference: UPath, ) -> None: """Test mixed positional and all-arguments substitution.""" - from agentpool_toolsets.builtin.skills import _substitute_arguments + from wolfharness_toolsets.builtin.skills import _substitute_arguments instructions = "First: $1, Rest: $@" result = _substitute_arguments(instructions, "alpha beta gamma") @@ -311,7 +311,7 @@ async def test_no_arguments_substitution( test_skill_with_reference: UPath, ) -> None: """Test behavior when no arguments provided.""" - from agentpool_toolsets.builtin.skills import _substitute_arguments + from wolfharness_toolsets.builtin.skills import _substitute_arguments instructions = "Args: $1, All: $@" result = _substitute_arguments(instructions, None) diff --git a/tests/integration/test_step_usage_e2e.py b/tests/integration/test_step_usage_e2e.py index d8152786c..cd721a99c 100644 --- a/tests/integration/test_step_usage_e2e.py +++ b/tests/integration/test_step_usage_e2e.py @@ -13,15 +13,15 @@ import pytest from acp.schema import UsageUpdate -from agentpool import Agent -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events.events import ( +from wolfharness import Agent +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events.events import ( StepUsageEvent, StreamCompleteEvent, ) -from agentpool.agents.native_agent.turn import NativeTurn -from agentpool.orchestrator.event_bus import EventBus -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.agents.native_agent.turn import NativeTurn +from wolfharness.orchestrator.event_bus import EventBus +from wolfharness_server.acp_server.event_converter import ACPEventConverter # --------------------------------------------------------------------------- diff --git a/tests/integration/test_v2_message_id_integration.py b/tests/integration/test_v2_message_id_integration.py index fcaa7e458..29376d6f4 100644 --- a/tests/integration/test_v2_message_id_integration.py +++ b/tests/integration/test_v2_message_id_integration.py @@ -30,23 +30,23 @@ import pytest -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import ( +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import ( PartDeltaEvent, PartStartEvent, StreamCompleteEvent, ) -from agentpool.lifecycle import ( +from wolfharness.lifecycle import ( DeliveryMode, Feedback, MemoryJournal, ProtocolChannel, ) -from agentpool.messaging import ChatMessage, MessageHistory -from agentpool.orchestrator.core import EventBus, SessionPool -from agentpool.orchestrator.run import RunHandle -from agentpool.orchestrator.session_controller import SessionState -from agentpool.orchestrator.turn import Turn +from wolfharness.messaging import ChatMessage, MessageHistory +from wolfharness.orchestrator.core import EventBus, SessionPool +from wolfharness.orchestrator.run import RunHandle +from wolfharness.orchestrator.session_controller import SessionState +from wolfharness.orchestrator.turn import Turn pytestmark = pytest.mark.integration @@ -136,8 +136,8 @@ async def test_steer_revoke_flow() -> None: ``feedback_queue`` when no RunHandle is active. ``SessionState.revoke()`` removes a queued steer message by ID. """ - from agentpool.lifecycle.types import Feedback - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.lifecycle.types import Feedback + from wolfharness.orchestrator.session_controller import SessionState session = SessionState(session_id="test-session", agent_name="test-agent") @@ -187,8 +187,8 @@ async def test_acp_turn_message_id_propagation() -> None: When: The turn constructs ChatMessage objects. Then: All ChatMessages from the same turn share the same message_id. """ - from agentpool.agents.acp_agent.turn import ACPTurn - from agentpool.agents.context import AgentRunContext + from wolfharness.agents.acp_agent.turn import ACPTurn + from wolfharness.agents.context import AgentRunContext # Create a mock ACP client. client = MagicMock() @@ -231,7 +231,7 @@ async def test_acp_event_converter_reads_message_id_from_events() -> None: Then: The returned message_id matches the event's message_id, not a newly generated UUID. """ - from agentpool_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.event_converter import ACPEventConverter converter = ACPEventConverter() @@ -613,7 +613,7 @@ async def test_deprecation_warnings_emitted() -> None: Note: receive_request() deprecation tests removed — the method was deleted in Phase 6.4 of session-debt-cleanup. """ - from agentpool.capabilities.runloop_delegation import RunLoopDelegationService + from wolfharness.capabilities.runloop_delegation import RunLoopDelegationService # --- RunLoopDelegationService.get_available_agents() --- registry = MagicMock() @@ -652,9 +652,9 @@ async def _empty_gen() -> Any: # Mock EventBus for the new EventBus subscription pattern in spawn_subagent import asyncio as _asyncio - from agentpool.agents.events import StreamCompleteEvent - from agentpool.messaging.messagenode import ChatMessage - from agentpool.orchestrator.core import EventEnvelope + from wolfharness.agents.events import StreamCompleteEvent + from wolfharness.messaging.messagenode import ChatMessage + from wolfharness.orchestrator.core import EventEnvelope event_queue: _asyncio.Queue[Any] = _asyncio.Queue() done_event = StreamCompleteEvent( diff --git a/tests/lifecycle/test_comm_channel.py b/tests/lifecycle/test_comm_channel.py index 847e287c3..d148eb90e 100644 --- a/tests/lifecycle/test_comm_channel.py +++ b/tests/lifecycle/test_comm_channel.py @@ -7,7 +7,7 @@ import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( MessageReplacementEvent, PartDeltaEvent, PartStartEvent, @@ -15,7 +15,7 @@ StateUpdate, ToolCallUpdateEvent, ) -from agentpool.lifecycle import ( +from wolfharness.lifecycle import ( CommChannel, DeliveryMode, DirectChannel, @@ -24,7 +24,7 @@ ProtocolChannel, RunState, ) -from agentpool.orchestrator.event_bus import EventBus +from wolfharness.orchestrator.event_bus import EventBus pytestmark = pytest.mark.unit @@ -80,7 +80,7 @@ def _make_plan_update(tool_call_id: str | None = "tc-plan") -> PlanUpdateEvent: def test_upsert_key_tool_call_update(): """ToolCallUpdateEvent derives key tool_call:{tool_call_id}.""" - from agentpool.lifecycle.comm_channel import _derive_upsert_key + from wolfharness.lifecycle.comm_channel import _derive_upsert_key event = _make_tool_call_update() assert _derive_upsert_key(event) == "tool_call:tc-123" @@ -88,7 +88,7 @@ def test_upsert_key_tool_call_update(): def test_upsert_key_tool_call_update_empty_id(): """ToolCallUpdateEvent with empty tool_call_id returns None.""" - from agentpool.lifecycle.comm_channel import _derive_upsert_key + from wolfharness.lifecycle.comm_channel import _derive_upsert_key event = ToolCallUpdateEvent(tool_call_id="", tool_name="bash") assert _derive_upsert_key(event) is None @@ -96,7 +96,7 @@ def test_upsert_key_tool_call_update_empty_id(): def test_upsert_key_state_update(): """StateUpdate derives key state:{session_id}.""" - from agentpool.lifecycle.comm_channel import _derive_upsert_key + from wolfharness.lifecycle.comm_channel import _derive_upsert_key event = _make_state_update() assert _derive_upsert_key(event) == "state:sess-1" @@ -104,7 +104,7 @@ def test_upsert_key_state_update(): def test_upsert_key_state_update_empty_session(): """StateUpdate with empty session_id returns None.""" - from agentpool.lifecycle.comm_channel import _derive_upsert_key + from wolfharness.lifecycle.comm_channel import _derive_upsert_key event = StateUpdate(session_id="", state=RunState.IDLE) assert _derive_upsert_key(event) is None @@ -112,7 +112,7 @@ def test_upsert_key_state_update_empty_session(): def test_upsert_key_message_replacement(): """MessageReplacementEvent derives key msg:{message_id}.""" - from agentpool.lifecycle.comm_channel import _derive_upsert_key + from wolfharness.lifecycle.comm_channel import _derive_upsert_key event = _make_message_replacement() assert _derive_upsert_key(event) == "msg:msg-1" @@ -120,7 +120,7 @@ def test_upsert_key_message_replacement(): def test_upsert_key_message_replacement_empty_id(): """MessageReplacementEvent with empty message_id returns None.""" - from agentpool.lifecycle.comm_channel import _derive_upsert_key + from wolfharness.lifecycle.comm_channel import _derive_upsert_key event = MessageReplacementEvent(message_id="", content="x") assert _derive_upsert_key(event) is None @@ -128,7 +128,7 @@ def test_upsert_key_message_replacement_empty_id(): def test_upsert_key_plan_update_with_tool_call_id(): """PlanUpdateEvent with tool_call_id derives key plan:{tool_call_id}.""" - from agentpool.lifecycle.comm_channel import _derive_upsert_key + from wolfharness.lifecycle.comm_channel import _derive_upsert_key event = _make_plan_update(tool_call_id="tc-plan") assert _derive_upsert_key(event) == "plan:tc-plan" @@ -136,7 +136,7 @@ def test_upsert_key_plan_update_with_tool_call_id(): def test_upsert_key_plan_update_without_tool_call_id(): """PlanUpdateEvent with None tool_call_id returns None.""" - from agentpool.lifecycle.comm_channel import _derive_upsert_key + from wolfharness.lifecycle.comm_channel import _derive_upsert_key event = _make_plan_update(tool_call_id=None) assert _derive_upsert_key(event) is None @@ -144,7 +144,7 @@ def test_upsert_key_plan_update_without_tool_call_id(): def test_upsert_key_delta_event_returns_none(): """PartDeltaEvent returns None (append semantics).""" - from agentpool.lifecycle.comm_channel import _derive_upsert_key + from wolfharness.lifecycle.comm_channel import _derive_upsert_key event = _make_delta_event() assert _derive_upsert_key(event) is None @@ -152,7 +152,7 @@ def test_upsert_key_delta_event_returns_none(): def test_upsert_key_part_start_event_returns_none(): """PartStartEvent returns None (append semantics).""" - from agentpool.lifecycle.comm_channel import _derive_upsert_key + from wolfharness.lifecycle.comm_channel import _derive_upsert_key event = PartStartEvent.text(index=0, content="start") assert _derive_upsert_key(event) is None @@ -160,7 +160,7 @@ def test_upsert_key_part_start_event_returns_none(): def test_upsert_key_arbitrary_object_returns_none(): """Arbitrary objects return None (append semantics).""" - from agentpool.lifecycle.comm_channel import _derive_upsert_key + from wolfharness.lifecycle.comm_channel import _derive_upsert_key assert _derive_upsert_key("not an event") is None assert _derive_upsert_key(42) is None @@ -583,7 +583,7 @@ def test_protocol_channel_recv_none_after_close(): async def test_protocol_channel_with_real_event_bus(): """ProtocolChannel works with a real EventBus instance.""" - from agentpool.orchestrator.event_bus import EventBus + from wolfharness.orchestrator.event_bus import EventBus bus = EventBus() journal = MemoryJournal() diff --git a/tests/lifecycle/test_config_and_integration.py b/tests/lifecycle/test_config_and_integration.py index 26884f0a1..966f33d58 100644 --- a/tests/lifecycle/test_config_and_integration.py +++ b/tests/lifecycle/test_config_and_integration.py @@ -4,16 +4,16 @@ import pytest -from agentpool.lifecycle.comm_channel import DirectChannel -from agentpool.lifecycle.event_transport import InProcessTransport -from agentpool.lifecycle.factory import create_dimensions -from agentpool.lifecycle.journal import DurableJournal, MemoryJournal -from agentpool.lifecycle.snapshot_store import ( +from wolfharness.lifecycle.comm_channel import DirectChannel +from wolfharness.lifecycle.event_transport import InProcessTransport +from wolfharness.lifecycle.factory import create_dimensions +from wolfharness.lifecycle.journal import DurableJournal, MemoryJournal +from wolfharness.lifecycle.snapshot_store import ( DurableSnapshotStore, MemorySnapshotStore, ) -from agentpool_config.lifecycle import LifecycleConfig -from agentpool_config.nodes import BaseAgentConfig +from wolfharness_config.lifecycle import LifecycleConfig +from wolfharness_config.nodes import BaseAgentConfig pytestmark = pytest.mark.integration diff --git a/tests/lifecycle/test_crash_recovery.py b/tests/lifecycle/test_crash_recovery.py index 9994c39b9..1059b8f02 100644 --- a/tests/lifecycle/test_crash_recovery.py +++ b/tests/lifecycle/test_crash_recovery.py @@ -17,11 +17,11 @@ import pytest -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import ( +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import ( StreamCompleteEvent, ) -from agentpool.lifecycle import ( +from wolfharness.lifecycle import ( DirectChannel, DurableJournal, DurableSnapshotStore, @@ -30,11 +30,11 @@ RunState, ToolExecutionRecord, ) -from agentpool.lifecycle.journal import _detect_inflight_turn, _extract_turn_id -from agentpool.messaging import ChatMessage, MessageHistory -from agentpool.orchestrator.run import RunHandle -from agentpool.orchestrator.session_controller import SessionState -from agentpool.orchestrator.turn import HookAwareTurn, Turn +from wolfharness.lifecycle.journal import _detect_inflight_turn, _extract_turn_id +from wolfharness.messaging import ChatMessage, MessageHistory +from wolfharness.orchestrator.run import RunHandle +from wolfharness.orchestrator.session_controller import SessionState +from wolfharness.orchestrator.turn import HookAwareTurn, Turn if TYPE_CHECKING: diff --git a/tests/lifecycle/test_deprecation.py b/tests/lifecycle/test_deprecation.py index 077f3018a..8112582e3 100644 --- a/tests/lifecycle/test_deprecation.py +++ b/tests/lifecycle/test_deprecation.py @@ -15,7 +15,7 @@ import pytest -from agentpool.messaging.messagenode import MessageNode +from wolfharness.messaging.messagenode import MessageNode class _TestNode(MessageNode[Any, Any]): diff --git a/tests/lifecycle/test_event_transport.py b/tests/lifecycle/test_event_transport.py index 5b6948d9a..37ddf8017 100644 --- a/tests/lifecycle/test_event_transport.py +++ b/tests/lifecycle/test_event_transport.py @@ -7,7 +7,7 @@ import pytest -from agentpool.lifecycle import EventEnvelope, EventTransport, InProcessTransport +from wolfharness.lifecycle import EventEnvelope, EventTransport, InProcessTransport if TYPE_CHECKING: diff --git a/tests/lifecycle/test_journal.py b/tests/lifecycle/test_journal.py index 2befc5869..482ba78e6 100644 --- a/tests/lifecycle/test_journal.py +++ b/tests/lifecycle/test_journal.py @@ -7,7 +7,7 @@ import pytest -from agentpool.lifecycle import ( +from wolfharness.lifecycle import ( DurableJournal, Journal, MemoryJournal, diff --git a/tests/lifecycle/test_recovery_event_delivery.py b/tests/lifecycle/test_recovery_event_delivery.py index 02e4c5eff..fc153502e 100644 --- a/tests/lifecycle/test_recovery_event_delivery.py +++ b/tests/lifecycle/test_recovery_event_delivery.py @@ -28,13 +28,13 @@ import anyio import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( PartDeltaEvent, RunStartedEvent, StateUpdate, StreamCompleteEvent, ) -from agentpool.lifecycle import ( +from wolfharness.lifecycle import ( DurableJournal, DurableSnapshotStore, MemoryJournal, @@ -42,9 +42,9 @@ RunState, ToolExecutionRecord, ) -from agentpool.lifecycle.comm_channel import DirectChannel, ProtocolChannel -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.event_bus import EventBus +from wolfharness.lifecycle.comm_channel import DirectChannel, ProtocolChannel +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.event_bus import EventBus pytestmark = [pytest.mark.integration, pytest.mark.anyio] diff --git a/tests/lifecycle/test_run_loop.py b/tests/lifecycle/test_run_loop.py index ab4ddc287..7984da383 100644 --- a/tests/lifecycle/test_run_loop.py +++ b/tests/lifecycle/test_run_loop.py @@ -34,12 +34,12 @@ import pytest -from agentpool.agents.events import StreamCompleteEvent -from agentpool.lifecycle import DirectChannel, MemoryJournal -from agentpool.messaging import ChatMessage, MessageHistory -from agentpool.orchestrator.run import RunHandle -from agentpool.orchestrator.session_controller import SessionState -from agentpool.orchestrator.turn import Turn +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.lifecycle import DirectChannel, MemoryJournal +from wolfharness.messaging import ChatMessage, MessageHistory +from wolfharness.orchestrator.run import RunHandle +from wolfharness.orchestrator.session_controller import SessionState +from wolfharness.orchestrator.turn import Turn pytestmark = pytest.mark.unit diff --git a/tests/lifecycle/test_session_migration.py b/tests/lifecycle/test_session_migration.py index fcd179f98..bf5babb86 100644 --- a/tests/lifecycle/test_session_migration.py +++ b/tests/lifecycle/test_session_migration.py @@ -28,25 +28,25 @@ import anyio import pytest -from agentpool.agents.events import ( +from tests._controller_helpers import send_via_controller +from wolfharness.agents.events import ( RunStartedEvent, StreamCompleteEvent, ) -from agentpool.lifecycle import ( +from wolfharness.lifecycle import ( DirectChannel, MemoryJournal, ProtocolChannel, ProtocolTrigger, ) -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.event_bus import EventBus -from agentpool.orchestrator.session_controller import ( +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.event_bus import EventBus +from wolfharness.orchestrator.session_controller import ( SessionController, SessionState, ) -from agentpool.orchestrator.session_pool import SessionPool -from agentpool.orchestrator.turn import Turn -from tests._controller_helpers import send_via_controller +from wolfharness.orchestrator.session_pool import SessionPool +from wolfharness.orchestrator.turn import Turn pytestmark = pytest.mark.unit @@ -437,8 +437,8 @@ async def test_set_current_run_id_publishes_state_update_running() -> None: ``comm.on_state_change(RunState.RUNNING)`` and schedules a ``StateUpdate`` event publish. """ - from agentpool.agents.events import StateUpdate - from agentpool.lifecycle.types import RunState + from wolfharness.agents.events import StateUpdate + from wolfharness.lifecycle.types import RunState session = SessionState(session_id="s1", agent_name="test_agent") comm = MagicMock() @@ -470,8 +470,8 @@ async def test_set_current_run_id_publishes_state_update_idle() -> None: ``comm.on_state_change(RunState.IDLE)`` and schedules a ``StateUpdate`` event publish. """ - from agentpool.agents.events import StateUpdate - from agentpool.lifecycle.types import RunState + from wolfharness.agents.events import StateUpdate + from wolfharness.lifecycle.types import RunState session = SessionState(session_id="s1", agent_name="test_agent") comm = MagicMock() diff --git a/tests/lifecycle/test_snapshot_store.py b/tests/lifecycle/test_snapshot_store.py index 4da15e12e..d143a3d92 100644 --- a/tests/lifecycle/test_snapshot_store.py +++ b/tests/lifecycle/test_snapshot_store.py @@ -6,7 +6,7 @@ import pytest -from agentpool.lifecycle import ( +from wolfharness.lifecycle import ( DurableSnapshotStore, MemorySnapshotStore, SnapshotStore, diff --git a/tests/lifecycle/test_trigger_source.py b/tests/lifecycle/test_trigger_source.py index f6ed1f744..d6c30b698 100644 --- a/tests/lifecycle/test_trigger_source.py +++ b/tests/lifecycle/test_trigger_source.py @@ -6,7 +6,7 @@ import pytest -from agentpool.lifecycle import ( +from wolfharness.lifecycle import ( ChannelTrigger, ImmediateTrigger, Prompt, diff --git a/tests/lifecycle/test_types.py b/tests/lifecycle/test_types.py index bdacfff9d..630973dd5 100644 --- a/tests/lifecycle/test_types.py +++ b/tests/lifecycle/test_types.py @@ -6,13 +6,13 @@ import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( MessageReplacementEvent, RichAgentStreamEvent, StateUpdate, ToolCallUpdateEvent, ) -from agentpool.lifecycle import ( +from wolfharness.lifecycle import ( CommChannel, EventEnvelope, EventTransport, diff --git a/tests/manifest/test_loader.py b/tests/manifest/test_loader.py index 6f0a54c96..c1cb6ba60 100644 --- a/tests/manifest/test_loader.py +++ b/tests/manifest/test_loader.py @@ -7,7 +7,7 @@ import pytest -from agentpool import AgentsManifest +from wolfharness import AgentsManifest pytestmark = pytest.mark.unit diff --git a/tests/manifest/test_metadata_fields.py b/tests/manifest/test_metadata_fields.py index 93a2a68be..393e8725c 100644 --- a/tests/manifest/test_metadata_fields.py +++ b/tests/manifest/test_metadata_fields.py @@ -14,9 +14,9 @@ import pytest import yamling -from agentpool import AgentsManifest -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.model_configs import StringModelConfig +from wolfharness import AgentsManifest +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.model_configs import StringModelConfig pytestmark = pytest.mark.unit diff --git a/tests/manifest/test_models.py b/tests/manifest/test_models.py index 497cf6b87..0353f1d66 100644 --- a/tests/manifest/test_models.py +++ b/tests/manifest/test_models.py @@ -7,7 +7,7 @@ from schemez import InlineSchemaDef import yamling -from agentpool import AgentsManifest +from wolfharness import AgentsManifest pytestmark = pytest.mark.unit diff --git a/tests/manifest/test_schema.py b/tests/manifest/test_schema.py index a06f2ee8f..7694652d4 100644 --- a/tests/manifest/test_schema.py +++ b/tests/manifest/test_schema.py @@ -2,7 +2,7 @@ import pytest -from agentpool import AgentsManifest +from wolfharness import AgentsManifest pytestmark = pytest.mark.unit diff --git a/tests/manifest/test_schema_override.py b/tests/manifest/test_schema_override.py index b51109771..23bcbe695 100644 --- a/tests/manifest/test_schema_override.py +++ b/tests/manifest/test_schema_override.py @@ -4,7 +4,7 @@ import pytest -from agentpool.tools.base import Tool +from wolfharness.tools.base import Tool pytestmark = pytest.mark.unit diff --git a/tests/manifest/test_yaml_inheritance.py b/tests/manifest/test_yaml_inheritance.py index 59d838da5..357fd11bb 100644 --- a/tests/manifest/test_yaml_inheritance.py +++ b/tests/manifest/test_yaml_inheritance.py @@ -4,7 +4,7 @@ import pytest -from agentpool import AgentsManifest +from wolfharness import AgentsManifest pytestmark = pytest.mark.unit diff --git a/tests/mcp_client/test_client_conversion.py b/tests/mcp_client/test_client_conversion.py index 00ff8f18f..63648447b 100644 --- a/tests/mcp_client/test_client_conversion.py +++ b/tests/mcp_client/test_client_conversion.py @@ -17,8 +17,8 @@ from pydantic_ai.usage import RunUsage import pytest -from agentpool.mcp_server import MCPClient -from agentpool_config.mcp_server import StdioMCPServerConfig +from wolfharness.mcp_server import MCPClient +from wolfharness_config.mcp_server import StdioMCPServerConfig pytestmark = pytest.mark.unit diff --git a/tests/mcp_client/test_contextual_progress.py b/tests/mcp_client/test_contextual_progress.py index f06b1f8c0..0b21ba535 100644 --- a/tests/mcp_client/test_contextual_progress.py +++ b/tests/mcp_client/test_contextual_progress.py @@ -8,9 +8,9 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.context import AgentContext # noqa: TC001 -from agentpool.agents.events import ToolCallProgressEvent +from wolfharness import Agent +from wolfharness.agents.context import AgentContext # noqa: TC001 +from wolfharness.agents.events import ToolCallProgressEvent pytestmark = pytest.mark.unit @@ -19,7 +19,7 @@ if TYPE_CHECKING: from typing import Any - from agentpool.agents.events import RichAgentStreamEvent + from wolfharness.agents.events import RichAgentStreamEvent # Constants for test expectations diff --git a/tests/mcp_client/test_mcp_features.py b/tests/mcp_client/test_mcp_features.py index 9b53c3f22..b1677ad60 100644 --- a/tests/mcp_client/test_mcp_features.py +++ b/tests/mcp_client/test_mcp_features.py @@ -1,5 +1,5 @@ # /// script -# dependencies = ["agentpool"] +# dependencies = ["wolfharness"] # /// """Demo: Agent using MCP server with code fixer (sampling + elicitation).""" @@ -10,8 +10,8 @@ import pytest -from agentpool import Agent -from agentpool_config.mcp_server import StdioMCPServerConfig +from wolfharness import Agent +from wolfharness_config.mcp_server import StdioMCPServerConfig pytestmark = pytest.mark.unit diff --git a/tests/mcp_server/test_child_session_acp_fix.py b/tests/mcp_server/test_child_session_acp_fix.py index 27949517d..1e2cb3554 100644 --- a/tests/mcp_server/test_child_session_acp_fix.py +++ b/tests/mcp_server/test_child_session_acp_fix.py @@ -15,12 +15,12 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool.mcp_server.manager import MCPManager -from agentpool_server.acp_server.acp_mcp_manager import ( +from wolfharness.mcp_server.manager import MCPManager +from wolfharness_server.acp_server.acp_mcp_manager import ( AcpMcpConnection, AcpMcpConnectionManager, ) -from agentpool_server.acp_server.acp_mcp_transport import AcpMcpTransport +from wolfharness_server.acp_server.acp_mcp_transport import AcpMcpTransport # --------------------------------------------------------------------------- diff --git a/tests/mcp_server/test_config_snapshot.py b/tests/mcp_server/test_config_snapshot.py index 3cbfeb370..d545c0062 100644 --- a/tests/mcp_server/test_config_snapshot.py +++ b/tests/mcp_server/test_config_snapshot.py @@ -7,8 +7,8 @@ from pydantic import HttpUrl import pytest -from agentpool.mcp_server.config_snapshot import McpConfigEntry, McpConfigSnapshot -from agentpool_config.mcp_server import ( +from wolfharness.mcp_server.config_snapshot import McpConfigEntry, McpConfigSnapshot +from wolfharness_config.mcp_server import ( SSEMCPServerConfig, StdioMCPServerConfig, StreamableHTTPMCPServerConfig, diff --git a/tests/mcp_server/test_e2e_acp_inheritance_function_model.py b/tests/mcp_server/test_e2e_acp_inheritance_function_model.py index 251ffe24b..832be4d40 100644 --- a/tests/mcp_server/test_e2e_acp_inheritance_function_model.py +++ b/tests/mcp_server/test_e2e_acp_inheritance_function_model.py @@ -21,13 +21,13 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool import Agent, AgentPool -from agentpool.mcp_server.manager import MCPManager -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent -from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager -from agentpool_server.acp_server.session import ACPSession +from wolfharness import Agent, AgentPool +from wolfharness.mcp_server.manager import MCPManager +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager +from wolfharness_server.acp_server.session import ACPSession # --------------------------------------------------------------------------- @@ -208,7 +208,7 @@ async def test_initialize_mcp_servers_registers_transport_and_syncs_snapshot() - # Bug 1: transport registered in connection_pool assert ctx.connection_pool is not None - from agentpool_config.mcp_server import AcpMCPServerConfig + from wolfharness_config.mcp_server import AcpMCPServerConfig acp_config = AcpMCPServerConfig(name="test-server", acp_id="test-acp-id") transport = await ctx.connection_pool.get_transport(acp_config) @@ -279,8 +279,8 @@ async def test_child_session_inherits_acp_configs_and_transports() -> None: - ``connection_pool`` with pre-created transport (copied via ``copy_pre_created_transports()``). """ - from agentpool.orchestrator.session_pool import SessionPool - from agentpool_storage.memory_provider.provider import MemoryStorageProvider + from wolfharness.orchestrator.session_pool import SessionPool + from wolfharness_storage.memory_provider.provider import MemoryStorageProvider mcp_manager, _acp_manager, _base_agent, acp_agent, _acp_session, mock_client = ( _build_test_fixture("test3-parent") @@ -343,7 +343,7 @@ async def test_child_session_inherits_acp_configs_and_transports() -> None: # Assert child's connection_pool has pre-created transport assert child_ctx.connection_pool is not None - from agentpool_config.mcp_server import AcpMCPServerConfig + from wolfharness_config.mcp_server import AcpMCPServerConfig acp_config = AcpMCPServerConfig(name="test-server", acp_id="test-acp-id") inherited_transport = await child_ctx.connection_pool.get_transport(acp_config) @@ -371,8 +371,8 @@ async def test_child_get_capabilities_finds_inherited_acp_configs() -> None: calling ``get_capabilities(session_id=child_session_id)`` on the child's MCPManager should return a non-empty list. """ - from agentpool.orchestrator.session_pool import SessionPool - from agentpool_storage.memory_provider.provider import MemoryStorageProvider + from wolfharness.orchestrator.session_pool import SessionPool + from wolfharness_storage.memory_provider.provider import MemoryStorageProvider mcp_manager, _acp_manager, _base_agent, acp_agent, _acp_session, mock_client = ( _build_test_fixture("test4-parent") diff --git a/tests/mcp_server/test_e2e_connection_tracking.py b/tests/mcp_server/test_e2e_connection_tracking.py index 5b805b8cc..c0f3d297e 100644 --- a/tests/mcp_server/test_e2e_connection_tracking.py +++ b/tests/mcp_server/test_e2e_connection_tracking.py @@ -13,11 +13,11 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool.mcp_server.config_snapshot import McpConfigSnapshot -from agentpool.mcp_server.manager import MCPManager -from agentpool.orchestrator.session_controller import SessionController, SessionState -from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness.mcp_server.config_snapshot import McpConfigSnapshot +from wolfharness.mcp_server.manager import MCPManager +from wolfharness.orchestrator.session_controller import SessionController, SessionState +from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager +from wolfharness_server.acp_server.session_manager import ACPSessionManager # ============================================================================ @@ -89,7 +89,7 @@ async def mock_session_close() -> None: try: with patch( - "agentpool_server.acp_server.session_manager.ACPSession", + "wolfharness_server.acp_server.session_manager.ACPSession", return_value=mock_session, ): session_id = await acp_manager.create_session( @@ -204,7 +204,7 @@ async def mock_get_agent(sid: str, agent_name: str | None = None) -> MagicMock: mock_session.register_update_callback = MagicMock() with patch( - "agentpool_server.acp_server.session_manager.ACPSession", + "wolfharness_server.acp_server.session_manager.ACPSession", return_value=mock_session, ): session_id = await acp_manager.create_session( @@ -340,7 +340,7 @@ async def mock_get_agent(sid: str, agent_name: str | None = None) -> MagicMock: mock_session_2.close = AsyncMock() with patch( - "agentpool_server.acp_server.session_manager.ACPSession", + "wolfharness_server.acp_server.session_manager.ACPSession", side_effect=[mock_session_1, mock_session_2], ): session_id_1 = await acp_manager.create_session( diff --git a/tests/mcp_server/test_e2e_mcp_capability.py b/tests/mcp_server/test_e2e_mcp_capability.py index 869b72b64..8ccb5fbb0 100644 --- a/tests/mcp_server/test_e2e_mcp_capability.py +++ b/tests/mcp_server/test_e2e_mcp_capability.py @@ -32,11 +32,11 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool.mcp_server.config_snapshot import McpConfigEntry, McpConfigSnapshot -from agentpool.mcp_server.manager import MCPManager -from agentpool_config.mcp_server import AcpMCPServerConfig -from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager -from agentpool_server.acp_server.acp_mcp_transport import AcpMcpTransport +from wolfharness.mcp_server.config_snapshot import McpConfigEntry, McpConfigSnapshot +from wolfharness.mcp_server.manager import MCPManager +from wolfharness_config.mcp_server import AcpMCPServerConfig +from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager +from wolfharness_server.acp_server.acp_mcp_transport import AcpMcpTransport # --------------------------------------------------------------------------- @@ -244,11 +244,11 @@ async def test_initialize_mcp_servers_full_chain() -> None: - Snapshot with ACP config entry allows ``get_capabilities()`` to find the transport. """ - from agentpool import Agent - from agentpool.delegation import AgentPool - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness import Agent + from wolfharness.delegation import AgentPool + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent mcp_manager, acp_manager = _make_wired_managers() session_id = "g3-session" @@ -351,11 +351,11 @@ async def test_tool_execution_through_get_capabilities_and_acp_transport() -> No If ``_forward_to_client`` is broken, ``initialize()`` hangs forever. """ - from agentpool import Agent - from agentpool.delegation import AgentPool - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness import Agent + from wolfharness.delegation import AgentPool + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent mcp_manager, acp_manager = _make_wired_managers() session_id = "g4-session" diff --git a/tests/mcp_server/test_e2e_session_controller.py b/tests/mcp_server/test_e2e_session_controller.py index 6ed772801..a0f94377d 100644 --- a/tests/mcp_server/test_e2e_session_controller.py +++ b/tests/mcp_server/test_e2e_session_controller.py @@ -19,10 +19,10 @@ import pytest -from agentpool.mcp_server.config_snapshot import McpConfigSnapshot -from agentpool.mcp_server.manager import MCPManager -from agentpool.orchestrator.session_controller import SessionController, SessionState -from agentpool.sessions import SessionData +from wolfharness.mcp_server.config_snapshot import McpConfigSnapshot +from wolfharness.mcp_server.manager import MCPManager +from wolfharness.orchestrator.session_controller import SessionController, SessionState +from wolfharness.sessions import SessionData # ============================================================================ @@ -38,8 +38,8 @@ def _make_mock_pool() -> MagicMock: so that SessionController.get_or_create_session_agent() can resolve a NativeAgentConfig and call cfg.get_agent(). """ - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest mock_pool: MagicMock = MagicMock() mock_pool.manifest = AgentsManifest( @@ -71,9 +71,9 @@ async def test_full_create_session_chain_populates_mcp_session_context() -> None calls agent.mcp.get_or_create_session() and agent.mcp.update_session_snapshot() so that the agent's MCPManager has a McpSessionContext with a non-None snapshot. """ - from agentpool.agents.native_agent import Agent - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.agents.native_agent import Agent + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest # Build a real manifest with a NativeAgentConfig manifest = AgentsManifest( @@ -157,7 +157,7 @@ async def test_session_controller_close_session_with_real_agent_and_mcp_resource close_session() and verifies the session context is cleaned and the agent context is exited. """ - from agentpool.agents.native_agent import Agent + from wolfharness.agents.native_agent import Agent def simple_callback(message: str) -> str: return f"Test: {message}" @@ -226,12 +226,12 @@ async def test_resume_session_with_real_acpsession_not_patched() -> None: then calls resume_session(). The real ACPSession.__post_init__ must run and wire agent.mcp._acp_mcp_manager to acp_agent._mcp_manager. """ - from agentpool import Agent - from agentpool.delegation import AgentPool - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent - from agentpool_server.acp_server.session_manager import ACPSessionManager + from wolfharness import Agent + from wolfharness.delegation import AgentPool + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness_server.acp_server.session_manager import ACPSessionManager def simple_callback(message: str) -> str: return f"Test: {message}" @@ -296,7 +296,7 @@ async def mock_old_close() -> None: ) # Assert: result is a real ACPSession (not a mock) - from agentpool_server.acp_server.session import ACPSession + from wolfharness_server.acp_server.session import ACPSession assert isinstance(result, ACPSession), ( "resume_session() must return a real ACPSession, not a mock" diff --git a/tests/mcp_server/test_global_pool.py b/tests/mcp_server/test_global_pool.py index f15e810a7..a8be934ef 100644 --- a/tests/mcp_server/test_global_pool.py +++ b/tests/mcp_server/test_global_pool.py @@ -8,8 +8,8 @@ from pydantic import HttpUrl import pytest -from agentpool.mcp_server.global_pool import GlobalConnectionPool -from agentpool_config.mcp_server import ( +from wolfharness.mcp_server.global_pool import GlobalConnectionPool +from wolfharness_config.mcp_server import ( AcpMCPServerConfig, SSEMCPServerConfig, StdioMCPServerConfig, diff --git a/tests/mcp_server/test_global_pool_review_fixes.py b/tests/mcp_server/test_global_pool_review_fixes.py index b9df28e34..5ae6bafae 100644 --- a/tests/mcp_server/test_global_pool_review_fixes.py +++ b/tests/mcp_server/test_global_pool_review_fixes.py @@ -14,7 +14,7 @@ import pytest -from agentpool.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability pytestmark = pytest.mark.integration @@ -42,7 +42,7 @@ async def get_tools(self) -> list[Any]: # in the except block that catches get_tools() failures import inspect - from agentpool.agents.native_agent.agent import Agent + from wolfharness.agents.native_agent.agent import Agent source = inspect.getsource(Agent.get_agentlet) assert "logger.warning" in source or "logger.exception" in source, ( diff --git a/tests/mcp_server/test_global_pool_sharing.py b/tests/mcp_server/test_global_pool_sharing.py index 25f4779a7..1a67cf613 100644 --- a/tests/mcp_server/test_global_pool_sharing.py +++ b/tests/mcp_server/test_global_pool_sharing.py @@ -13,7 +13,7 @@ import pytest -from agentpool.mcp_server.global_pool import GlobalConnectionPool +from wolfharness.mcp_server.global_pool import GlobalConnectionPool pytestmark = pytest.mark.unit @@ -58,7 +58,7 @@ async def test_http_transport_not_shared_directly(self) -> None: pool = GlobalConnectionPool() # Create a fake HTTP config - from agentpool_config.mcp_server import StreamableHTTPMCPServerConfig + from wolfharness_config.mcp_server import StreamableHTTPMCPServerConfig config = StreamableHTTPMCPServerConfig( name="test-http", @@ -94,7 +94,7 @@ async def test_stdio_transport_owner_task_manages_lifecycle(self) -> None: """ pool = GlobalConnectionPool() - from agentpool_config.mcp_server import StdioMCPServerConfig + from wolfharness_config.mcp_server import StdioMCPServerConfig config = StdioMCPServerConfig( name="test-stdio", @@ -125,7 +125,7 @@ async def test_two_sessions_share_stdio_without_duplicate_connect(self) -> None: """ pool = GlobalConnectionPool() - from agentpool_config.mcp_server import StdioMCPServerConfig + from wolfharness_config.mcp_server import StdioMCPServerConfig config = StdioMCPServerConfig( name="test-stdio-shared", diff --git a/tests/mcp_server/test_manager_capability.py b/tests/mcp_server/test_manager_capability.py index ecf8d1ea9..df3068d66 100644 --- a/tests/mcp_server/test_manager_capability.py +++ b/tests/mcp_server/test_manager_capability.py @@ -9,8 +9,8 @@ from pydantic_ai.mcp import MCPToolset import pytest -from agentpool.mcp_server.manager import MCPManager, _make_elicitation_handler -from agentpool_config.mcp_server import ( +from wolfharness.mcp_server.manager import MCPManager, _make_elicitation_handler +from wolfharness_config.mcp_server import ( AcpMCPServerConfig, SSEMCPServerConfig, StdioMCPServerConfig, diff --git a/tests/mcp_server/test_manager_status.py b/tests/mcp_server/test_manager_status.py index ec0e2f065..20314de99 100644 --- a/tests/mcp_server/test_manager_status.py +++ b/tests/mcp_server/test_manager_status.py @@ -20,12 +20,12 @@ import pytest -from agentpool.agents.base_agent import BaseAgent -from agentpool.capabilities.mcp_server_cap import McpServerCap -from agentpool.common_types import MCPServerStatus -from agentpool.mcp_server.client import MCPClient -from agentpool.mcp_server.manager import MCPManager -from agentpool_config.mcp_server import StdioMCPServerConfig +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.capabilities.mcp_server_cap import McpServerCap +from wolfharness.common_types import MCPServerStatus +from wolfharness.mcp_server.client import MCPClient +from wolfharness.mcp_server.manager import MCPManager +from wolfharness_config.mcp_server import StdioMCPServerConfig pytestmark = pytest.mark.unit @@ -246,7 +246,7 @@ async def test_setup_server_records_failure() -> None: manager = MCPManager() # Force MCPClient construction to raise by patching the import target. # setup_server() imports MCPClient lazily inside the function body. - import agentpool.mcp_server.client as client_mod + import wolfharness.mcp_server.client as client_mod original = client_mod.MCPClient @@ -278,12 +278,12 @@ async def test_setup_server_clears_error_on_retry() -> None: async def _fake_cap_aenter(self: McpServerCap[Any]) -> McpServerCap[Any]: return self - import agentpool.mcp_server.client as client_mod + import wolfharness.mcp_server.client as client_mod original_client = client_mod.MCPClient client_mod.MCPClient = lambda **_kw: mock_client # type: ignore[assignment] try: - import agentpool.capabilities.mcp_server_cap as cap_mod + import wolfharness.capabilities.mcp_server_cap as cap_mod original_cap_aenter = cap_mod.McpServerCap.__aenter__ cap_mod.McpServerCap.__aenter__ = _fake_cap_aenter # type: ignore[assignment] @@ -461,7 +461,7 @@ async def _fake_setup( self.providers.append(cap) return cap - import agentpool.mcp_server.manager as mgr_mod + import wolfharness.mcp_server.manager as mgr_mod original = mgr_mod.MCPManager.setup_server mgr_mod.MCPManager.setup_server = _fake_setup # type: ignore[assignment] @@ -509,7 +509,7 @@ async def _always_fail( self._setup_errors[config.client_id] = "boom" raise RuntimeError("boom") - import agentpool.mcp_server.manager as mgr_mod + import wolfharness.mcp_server.manager as mgr_mod original = mgr_mod.MCPManager.setup_server mgr_mod.MCPManager.setup_server = _always_fail # type: ignore[assignment] diff --git a/tests/mcp_server/test_mcp_persistence.py b/tests/mcp_server/test_mcp_persistence.py index 3b0277041..829e49942 100644 --- a/tests/mcp_server/test_mcp_persistence.py +++ b/tests/mcp_server/test_mcp_persistence.py @@ -17,9 +17,9 @@ from pydantic_ai.mcp import MCPToolset import pytest -from agentpool.mcp_server.config_snapshot import McpConfigEntry, McpConfigSnapshot -from agentpool.mcp_server.manager import MCPManager -from agentpool_config.mcp_server import StdioMCPServerConfig +from wolfharness.mcp_server.config_snapshot import McpConfigEntry, McpConfigSnapshot +from wolfharness.mcp_server.manager import MCPManager +from wolfharness_config.mcp_server import StdioMCPServerConfig pytestmark = pytest.mark.unit @@ -243,7 +243,7 @@ async def hanging_aexit(exc_type, exc_val, exc_tb): # Use a short timeout for the test to avoid waiting 30s import unittest.mock - with unittest.mock.patch("agentpool.mcp_server.manager._MCP_CLEANUP_TIMEOUT", 0.1): + with unittest.mock.patch("wolfharness.mcp_server.manager._MCP_CLEANUP_TIMEOUT", 0.1): # disconnect_all should complete within the timeout, not hang await asyncio.wait_for(manager.disconnect_all(), timeout=5.0) diff --git a/tests/mcp_server/test_mcp_provider_lifecycle.py b/tests/mcp_server/test_mcp_provider_lifecycle.py index 6565a3645..c43f6528f 100644 --- a/tests/mcp_server/test_mcp_provider_lifecycle.py +++ b/tests/mcp_server/test_mcp_provider_lifecycle.py @@ -23,11 +23,11 @@ from pydantic_ai.usage import RunUsage import pytest -from agentpool.mcp_server.config_snapshot import McpConfigEntry, McpConfigSnapshot -from agentpool.mcp_server.global_pool import GlobalConnectionPool -from agentpool.mcp_server.manager import MCPManager -from agentpool.mcp_server.session_pool import SessionConnectionPool -from agentpool_config.mcp_server import ( +from wolfharness.mcp_server.config_snapshot import McpConfigEntry, McpConfigSnapshot +from wolfharness.mcp_server.global_pool import GlobalConnectionPool +from wolfharness.mcp_server.manager import MCPManager +from wolfharness.mcp_server.session_pool import SessionConnectionPool +from wolfharness_config.mcp_server import ( AcpMCPServerConfig, StdioMCPServerConfig, StreamableHTTPMCPServerConfig, diff --git a/tests/mcp_server/test_review_fixes.py b/tests/mcp_server/test_review_fixes.py index 4f1b591cf..3b678d4cd 100644 --- a/tests/mcp_server/test_review_fixes.py +++ b/tests/mcp_server/test_review_fixes.py @@ -27,9 +27,9 @@ import pytest -from agentpool.mcp_server.manager import MCPManager -from agentpool.sessions import SessionData -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness.mcp_server.manager import MCPManager +from wolfharness.sessions import SessionData +from wolfharness_server.acp_server.session_manager import ACPSessionManager # ============================================================================ @@ -215,7 +215,7 @@ async def mock_get_agent(sid: str, agent_name: str | None = None) -> MagicMock: mock_new_session.register_update_callback = MagicMock() with patch( - "agentpool_server.acp_server.session_manager.ACPSession", + "wolfharness_server.acp_server.session_manager.ACPSession", return_value=mock_new_session, ): result = await acp_manager.resume_session( @@ -295,12 +295,12 @@ async def test_acp_session_wires_acp_mcp_manager() -> None: Fix: In ``__post_init__``, after ``self.agent.env = self.acp_env``, wire the manager for native agents. """ - from agentpool import Agent - from agentpool.delegation import AgentPool - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent - from agentpool_server.acp_server.session import ACPSession + from wolfharness import Agent + from wolfharness.delegation import AgentPool + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness_server.acp_server.session import ACPSession def simple_callback(message: str) -> str: return f"Test: {message}" diff --git a/tests/mcp_server/test_review_fixes_r3.py b/tests/mcp_server/test_review_fixes_r3.py index 799762585..173c48b4c 100644 --- a/tests/mcp_server/test_review_fixes_r3.py +++ b/tests/mcp_server/test_review_fixes_r3.py @@ -20,12 +20,12 @@ import pytest -from agentpool.mcp_server.config_snapshot import McpConfigSnapshot -from agentpool.orchestrator.session_controller import SessionController, SessionState +from wolfharness.mcp_server.config_snapshot import McpConfigSnapshot +from wolfharness.orchestrator.session_controller import SessionController, SessionState if TYPE_CHECKING: - from agentpool.mcp_server.manager import MCPManager + from wolfharness.mcp_server.manager import MCPManager # ============================================================================ @@ -51,9 +51,9 @@ async def test_get_or_create_session_agent_does_not_recreate_cleaned_parent_sess 6. Call get_or_create_session_agent(child_id). 7. Assert parent_id has NO session context (no phantom created). """ - from agentpool.agents.native_agent import Agent - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.agents.native_agent import Agent + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest def simple_callback(message: str) -> str: return f"Test: {message}" @@ -140,9 +140,9 @@ async def test_get_or_create_session_agent_reads_parent_snapshot_without_leaking This test passes both before and after the fix — it guards against regressions where the parent context is accidentally recreated. """ - from agentpool.agents.native_agent import Agent - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.agents.native_agent import Agent + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest def simple_callback(message: str) -> str: return f"Test: {message}" diff --git a/tests/mcp_server/test_session_close_integration.py b/tests/mcp_server/test_session_close_integration.py index 25a7676c7..ec4fde0fc 100644 --- a/tests/mcp_server/test_session_close_integration.py +++ b/tests/mcp_server/test_session_close_integration.py @@ -9,8 +9,8 @@ import pytest -from agentpool.mcp_server.config_snapshot import McpConfigSnapshot -from agentpool.mcp_server.manager import MCPManager +from wolfharness.mcp_server.config_snapshot import McpConfigSnapshot +from wolfharness.mcp_server.manager import MCPManager @pytest.mark.integration diff --git a/tests/mcp_server/test_session_lifecycle.py b/tests/mcp_server/test_session_lifecycle.py index ee89f56b9..cc0d85005 100644 --- a/tests/mcp_server/test_session_lifecycle.py +++ b/tests/mcp_server/test_session_lifecycle.py @@ -12,8 +12,8 @@ import pytest -from agentpool.mcp_server.config_snapshot import McpConfigSnapshot -from agentpool.mcp_server.manager import MCPManager, McpSessionContext +from wolfharness.mcp_server.config_snapshot import McpConfigSnapshot +from wolfharness.mcp_server.manager import MCPManager, McpSessionContext # --------------------------------------------------------------------------- diff --git a/tests/mcp_server/test_session_pool.py b/tests/mcp_server/test_session_pool.py index 69b714c7a..46e55cb5e 100644 --- a/tests/mcp_server/test_session_pool.py +++ b/tests/mcp_server/test_session_pool.py @@ -9,12 +9,12 @@ from pydantic import HttpUrl import pytest -from agentpool.mcp_server.session_pool import ( +from wolfharness.mcp_server.session_pool import ( SessionConnectionPool, _create_transport, _stdio_owner_task, ) -from agentpool_config.mcp_server import ( +from wolfharness_config.mcp_server import ( AcpMCPServerConfig, SSEMCPServerConfig, StdioMCPServerConfig, @@ -97,7 +97,7 @@ async def test_get_transport_sse_caches( ) -> None: """get_transport creates and caches transport for SSE config.""" fake = _FakeTransport("sse") - with patch("agentpool.mcp_server.session_pool._create_transport", return_value=fake): + with patch("wolfharness.mcp_server.session_pool._create_transport", return_value=fake): t1 = await session_pool.get_transport(sse_config) t2 = await session_pool.get_transport(sse_config) @@ -113,7 +113,7 @@ async def test_get_transport_http_caches( ) -> None: """get_transport creates and caches transport for HTTP config.""" fake = _FakeTransport("http") - with patch("agentpool.mcp_server.session_pool._create_transport", return_value=fake): + with patch("wolfharness.mcp_server.session_pool._create_transport", return_value=fake): t1 = await session_pool.get_transport(http_config) t2 = await session_pool.get_transport(http_config) @@ -127,7 +127,7 @@ async def test_get_transport_stdio( ) -> None: """get_transport for stdio spawns an owner task and waits for ready.""" fake = _FakeTransport("stdio") - with patch("agentpool.mcp_server.session_pool._create_transport", return_value=fake): + with patch("wolfharness.mcp_server.session_pool._create_transport", return_value=fake): transport = await session_pool.get_transport(stdio_config) assert transport is fake @@ -166,7 +166,7 @@ def _create_fake(config: Any) -> _FakeTransport: return fake1 if call_count == 1 else fake2 with patch( - "agentpool.mcp_server.session_pool._create_transport", + "wolfharness.mcp_server.session_pool._create_transport", side_effect=_create_fake, ): t1 = await session_pool.get_transport(sse_config, skill_name="skill-a") @@ -189,7 +189,7 @@ async def test_same_skill_name_shares_transport( ) -> None: """Same (client_id, skill_name) pair returns cached transport.""" fake = _FakeTransport("shared") - with patch("agentpool.mcp_server.session_pool._create_transport", return_value=fake): + with patch("wolfharness.mcp_server.session_pool._create_transport", return_value=fake): t1 = await session_pool.get_transport(sse_config, skill_name="my-skill") t2 = await session_pool.get_transport(sse_config, skill_name="my-skill") @@ -285,7 +285,7 @@ def _create_fake(config: Any) -> _FakeTransport: return fake1 if call_count == 1 else fake2 with patch( - "agentpool.mcp_server.session_pool._create_transport", + "wolfharness.mcp_server.session_pool._create_transport", side_effect=_create_fake, ): await session_pool.get_transport(sse_config) @@ -305,7 +305,7 @@ async def test_cleanup_signals_stdio_owner_tasks( ) -> None: """Cleanup signals close_event for stdio owner tasks and waits for completion.""" fake = _FakeTransport("stdio") - with patch("agentpool.mcp_server.session_pool._create_transport", return_value=fake): + with patch("wolfharness.mcp_server.session_pool._create_transport", return_value=fake): await session_pool.get_transport(stdio_config) key = (stdio_config.client_id, None) @@ -326,7 +326,7 @@ async def test_cleanup_idempotent( ) -> None: """Cleanup can be called multiple times safely.""" fake = _FakeTransport("sse") - with patch("agentpool.mcp_server.session_pool._create_transport", return_value=fake): + with patch("wolfharness.mcp_server.session_pool._create_transport", return_value=fake): await session_pool.get_transport(sse_config) await session_pool.cleanup() @@ -353,7 +353,7 @@ def _create_fake(config: Any) -> _FakeTransport: return fake1 if call_count == 1 else fake2 with patch( - "agentpool.mcp_server.session_pool._create_transport", + "wolfharness.mcp_server.session_pool._create_transport", side_effect=_create_fake, ): await session_pool.get_transport(stdio_config) @@ -431,7 +431,7 @@ async def test_copy_pre_created_transports_copies_acp_only( await source.add_transport("acp-1", acp_transport) # Simulate a non-pre-created transport by inserting directly - from agentpool.mcp_server.session_pool import _SessionConnection + from wolfharness.mcp_server.session_pool import _SessionConnection source._connections[("http-1", None)] = _SessionConnection( transport=http_transport, diff --git a/tests/mcp_server/test_session_wiring_integration.py b/tests/mcp_server/test_session_wiring_integration.py index 21f2f14b0..f12336307 100644 --- a/tests/mcp_server/test_session_wiring_integration.py +++ b/tests/mcp_server/test_session_wiring_integration.py @@ -22,10 +22,10 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool.mcp_server.manager import MCPManager -from agentpool.sessions import SessionData -from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness.mcp_server.manager import MCPManager +from wolfharness.sessions import SessionData +from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager +from wolfharness_server.acp_server.session_manager import ACPSessionManager # ============================================================================ @@ -162,12 +162,12 @@ async def test_acp_session_post_init_wires_acp_mcp_manager() -> None: ``__post_init__`` must wire ``agent.mcp._acp_mcp_manager`` to ``acp_agent._mcp_manager`` so that cleanup delegation works. """ - from agentpool import Agent - from agentpool.delegation import AgentPool - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent - from agentpool_server.acp_server.session import ACPSession + from wolfharness import Agent + from wolfharness.delegation import AgentPool + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness_server.acp_server.session import ACPSession def simple_callback(message: str) -> str: return f"Test: {message}" @@ -211,12 +211,12 @@ async def test_acp_session_close_full_delegation_chain() -> None: up the session context registry, ``_session_connections``, and the connection's active sessions. """ - from agentpool import Agent - from agentpool.delegation import AgentPool - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent - from agentpool_server.acp_server.session import ACPSession + from wolfharness import Agent + from wolfharness.delegation import AgentPool + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness_server.acp_server.session import ACPSession mcp_manager, acp_manager = _make_wired_managers() session_id = "test-close-chain-1" @@ -648,7 +648,7 @@ def _capture_session(*args: object, **kwargs: object) -> AsyncMock: return mock_new_session with patch( - "agentpool_server.acp_server.session_manager.ACPSession", + "wolfharness_server.acp_server.session_manager.ACPSession", side_effect=_capture_session, ): result = await acp_manager.resume_session( diff --git a/tests/mcp_server/test_session_wiring_integration_part2.py b/tests/mcp_server/test_session_wiring_integration_part2.py index 84a9bde95..f63aaaf1d 100644 --- a/tests/mcp_server/test_session_wiring_integration_part2.py +++ b/tests/mcp_server/test_session_wiring_integration_part2.py @@ -27,16 +27,16 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool import Agent -from agentpool.delegation import AgentPool -from agentpool.mcp_server.manager import MCPManager -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest -from agentpool.sessions import SessionData -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent -from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager -from agentpool_server.acp_server.session import ACPSession -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness import Agent +from wolfharness.delegation import AgentPool +from wolfharness.mcp_server.manager import MCPManager +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest +from wolfharness.sessions import SessionData +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager +from wolfharness_server.acp_server.session import ACPSession +from wolfharness_server.acp_server.session_manager import ACPSessionManager # --------------------------------------------------------------------------- @@ -264,7 +264,7 @@ async def mock_get_agent(sid: str, agent_name: str | None = None) -> MagicMock: mock_new_session.register_update_callback = MagicMock() with patch( - "agentpool_server.acp_server.session_manager.ACPSession", + "wolfharness_server.acp_server.session_manager.ACPSession", return_value=mock_new_session, ): result = await acp_manager.resume_session( @@ -536,7 +536,7 @@ async def mock_get_agent(sid: str, agent_name: str | None = None) -> MagicMock: mock_new_session.register_update_callback = MagicMock() with patch( - "agentpool_server.acp_server.session_manager.ACPSession", + "wolfharness_server.acp_server.session_manager.ACPSession", return_value=mock_new_session, ): result = await acp_manager.resume_session( diff --git a/tests/mcp_server/test_stale_mcp_connection.py b/tests/mcp_server/test_stale_mcp_connection.py index c334758bb..306cc3c72 100644 --- a/tests/mcp_server/test_stale_mcp_connection.py +++ b/tests/mcp_server/test_stale_mcp_connection.py @@ -23,9 +23,9 @@ import pytest -from agentpool.mcp_server.config_snapshot import McpConfigEntry, McpConfigSnapshot -from agentpool.mcp_server.manager import MCPManager -from agentpool_config.mcp_server import AcpMCPServerConfig +from wolfharness.mcp_server.config_snapshot import McpConfigEntry, McpConfigSnapshot +from wolfharness.mcp_server.manager import MCPManager +from wolfharness_config.mcp_server import AcpMCPServerConfig # --------------------------------------------------------------------------- @@ -199,7 +199,7 @@ async def test_session_pool_provides_fresh_transport_on_resume() -> None: returns the fresh transport. With per-session contexts, each session's pool is isolated from the others. """ - from agentpool.mcp_server.session_pool import SessionConnectionPool + from wolfharness.mcp_server.session_pool import SessionConnectionPool acp_config = AcpMCPServerConfig(name="scratchpad", acp_id="acp-server-1") client_id = acp_config.client_id diff --git a/tests/mcp_server/test_tool_bridge_conversion.py b/tests/mcp_server/test_tool_bridge_conversion.py index 417b59a90..e5d46176e 100644 --- a/tests/mcp_server/test_tool_bridge_conversion.py +++ b/tests/mcp_server/test_tool_bridge_conversion.py @@ -3,7 +3,7 @@ from pydantic_ai import ToolReturn import pytest -from agentpool.mcp_server.tool_bridge import _convert_to_tool_result +from wolfharness.mcp_server.tool_bridge import _convert_to_tool_result pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_adapters.py b/tests/messaging/test_adapters.py index 4bdb9cbf8..8ec592a7e 100644 --- a/tests/messaging/test_adapters.py +++ b/tests/messaging/test_adapters.py @@ -14,22 +14,22 @@ from pydantic_graph.id_types import ForkStack, NodeID, TaskID import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( PartStartEvent, RunErrorEvent, RunStartedEvent, StreamCompleteEvent, SubAgentEvent, ) -from agentpool.messaging import ChatMessage -from agentpool.messaging.messagenode import MessageNode -from agentpool.messaging.messages import ChatMessage as Msg -from agentpool.messaging.signal_adapter import SignalEmittingGraphRun -from agentpool.messaging.streaming_adapter import ( +from wolfharness.messaging import ChatMessage +from wolfharness.messaging.messagenode import MessageNode +from wolfharness.messaging.messages import ChatMessage as Msg +from wolfharness.messaging.signal_adapter import SignalEmittingGraphRun +from wolfharness.messaging.streaming_adapter import ( GraphStreamingAdapter, adapt_graph_run, ) -from agentpool.talk import Talk +from wolfharness.talk import Talk pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_agent_piping.py b/tests/messaging/test_agent_piping.py index c5b2fa395..5fdf79a3e 100644 --- a/tests/messaging/test_agent_piping.py +++ b/tests/messaging/test_agent_piping.py @@ -5,9 +5,9 @@ import anyio import pytest -from agentpool import Agent -from agentpool.messaging import AgentResponse -from agentpool.talk.talk import Talk +from wolfharness import Agent +from wolfharness.messaging import AgentResponse +from wolfharness.talk.talk import Talk pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_agent_signals.py b/tests/messaging/test_agent_signals.py index 2a0b06dc2..f0b3b68b1 100644 --- a/tests/messaging/test_agent_signals.py +++ b/tests/messaging/test_agent_signals.py @@ -5,8 +5,8 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.messaging.message_utils import build_message_index, get_message_chain +from wolfharness import Agent +from wolfharness.messaging.message_utils import build_message_index, get_message_chain pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_compaction.py b/tests/messaging/test_compaction.py index b5efbe771..21c0122c1 100644 --- a/tests/messaging/test_compaction.py +++ b/tests/messaging/test_compaction.py @@ -14,7 +14,7 @@ ) import pytest -from agentpool.messaging.compaction import ( +from wolfharness.messaging.compaction import ( CompactionPipeline, FilterEmptyMessages, FilterRetryPrompts, @@ -29,7 +29,7 @@ balanced_context, minimal_context, ) -from agentpool_config.compaction import ( +from wolfharness_config.compaction import ( CompactionConfig, FilterThinkingConfig, KeepLastMessagesConfig, diff --git a/tests/messaging/test_connection_registry.py b/tests/messaging/test_connection_registry.py index 82eb189b2..20a59d523 100644 --- a/tests/messaging/test_connection_registry.py +++ b/tests/messaging/test_connection_registry.py @@ -3,9 +3,9 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, AgentPool -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest +from wolfharness import Agent, AgentPool +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest pytestmark = pytest.mark.integration diff --git a/tests/messaging/test_conversation.py b/tests/messaging/test_conversation.py index 9636a7a24..c8a97b57e 100644 --- a/tests/messaging/test_conversation.py +++ b/tests/messaging/test_conversation.py @@ -2,7 +2,7 @@ import pytest -from agentpool import Agent +from wolfharness import Agent pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_debug_taskgroup.py b/tests/messaging/test_debug_taskgroup.py index 8249ed80f..9f9f3a995 100644 --- a/tests/messaging/test_debug_taskgroup.py +++ b/tests/messaging/test_debug_taskgroup.py @@ -8,7 +8,7 @@ import pytest -from agentpool import Agent +from wolfharness import Agent pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_event_converter.py b/tests/messaging/test_event_converter.py index 13560f444..2d700e82d 100644 --- a/tests/messaging/test_event_converter.py +++ b/tests/messaging/test_event_converter.py @@ -10,8 +10,8 @@ import pytest from acp.schema import AgentMessageChunk, ToolCallProgress, TurnCompleteUpdate -from agentpool.agents.events import RunFailedEvent, ToolCallStartEvent -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.agents.events import RunFailedEvent, ToolCallStartEvent +from wolfharness_server.acp_server.event_converter import ACPEventConverter pytestmark = pytest.mark.integration diff --git a/tests/messaging/test_event_manager.py b/tests/messaging/test_event_manager.py index ce2bf0220..2187fda87 100644 --- a/tests/messaging/test_event_manager.py +++ b/tests/messaging/test_event_manager.py @@ -6,8 +6,8 @@ from evented_config import TimeEventConfig import pytest -from agentpool.messaging import EventManager -from agentpool.utils.time_utils import get_now +from wolfharness.messaging import EventManager +from wolfharness.utils.time_utils import get_now pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_event_routing_scenarios.py b/tests/messaging/test_event_routing_scenarios.py index 00d866813..d3ba4afa0 100644 --- a/tests/messaging/test_event_routing_scenarios.py +++ b/tests/messaging/test_event_routing_scenarios.py @@ -7,8 +7,8 @@ import pytest -from agentpool.agents.events import RunStartedEvent, SubAgentEvent -from agentpool.messaging.event_manager import EventManager +from wolfharness.agents.events import RunStartedEvent, SubAgentEvent +from wolfharness.messaging.event_manager import EventManager pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_message_tracker.py b/tests/messaging/test_message_tracker.py index 9d0ab6648..422012f0c 100644 --- a/tests/messaging/test_message_tracker.py +++ b/tests/messaging/test_message_tracker.py @@ -7,9 +7,9 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, AgentPool, BaseTeam -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest +from wolfharness import Agent, AgentPool, BaseTeam +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest pytestmark = pytest.mark.integration @@ -18,9 +18,9 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool.agents.base_agent import BaseAgent - from agentpool.messaging import ChatMessage - from agentpool.orchestrator.core import SessionPool + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.messaging import ChatMessage + from wolfharness.orchestrator.core import SessionPool def _make_pool() -> AgentPool: diff --git a/tests/messaging/test_messagenode_bind_pool.py b/tests/messaging/test_messagenode_bind_pool.py index 4ae4d4495..23016df26 100644 --- a/tests/messaging/test_messagenode_bind_pool.py +++ b/tests/messaging/test_messagenode_bind_pool.py @@ -6,12 +6,12 @@ import pytest -from agentpool.messaging import ChatMessage -from agentpool.messaging.messagenode import MessageNode +from wolfharness.messaging import ChatMessage +from wolfharness.messaging.messagenode import MessageNode if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool class ConcreteMessageNode(MessageNode[Any, Any]): @@ -66,7 +66,7 @@ def test_bind_pool_does_not_emit_deprecation_warning(minimal_pool: AgentPool) -> @pytest.mark.unit def test_host_context_returns_non_none_after_bind_pool() -> None: """After _bind_pool(), host_context returns a non-None HostContext.""" - from agentpool.delegation.pool import AgentPool + from wolfharness.delegation.pool import AgentPool pool = AgentPool() # type: ignore[type-arg] node = ConcreteMessageNode(name="test_node") diff --git a/tests/messaging/test_messagenode_cleanup.py b/tests/messaging/test_messagenode_cleanup.py index d51b5a17b..c42e32c9b 100644 --- a/tests/messaging/test_messagenode_cleanup.py +++ b/tests/messaging/test_messagenode_cleanup.py @@ -7,8 +7,8 @@ import pytest -from agentpool.messaging.messagenode import MessageNode -from agentpool.talk.stats import AggregatedMessageStats, MessageStats +from wolfharness.messaging.messagenode import MessageNode +from wolfharness.talk.stats import AggregatedMessageStats, MessageStats pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_messagenode_events.py b/tests/messaging/test_messagenode_events.py index 14a4a82c9..efc0d0464 100644 --- a/tests/messaging/test_messagenode_events.py +++ b/tests/messaging/test_messagenode_events.py @@ -4,9 +4,9 @@ from pydantic_ai import TextPartDelta import pytest -from agentpool.agents.events import PartDeltaEvent -from agentpool.messaging import ChatMessage -from agentpool.messaging.messagenode import MessageNode +from wolfharness.agents.events import PartDeltaEvent +from wolfharness.messaging import ChatMessage +from wolfharness.messaging.messagenode import MessageNode pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_minimal_piping.py b/tests/messaging/test_minimal_piping.py index 9db7e7ab1..bbf438b8b 100644 --- a/tests/messaging/test_minimal_piping.py +++ b/tests/messaging/test_minimal_piping.py @@ -2,7 +2,7 @@ import pytest -from agentpool import Agent +from wolfharness import Agent pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_parent_id.py b/tests/messaging/test_parent_id.py index 8bb8d3afd..47de826e0 100644 --- a/tests/messaging/test_parent_id.py +++ b/tests/messaging/test_parent_id.py @@ -5,7 +5,7 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, ChatMessage +from wolfharness import Agent, ChatMessage pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_runners.py b/tests/messaging/test_runners.py index 716647fda..ee9d00f15 100644 --- a/tests/messaging/test_runners.py +++ b/tests/messaging/test_runners.py @@ -5,7 +5,7 @@ from pydantic import BaseModel import pytest -from agentpool import AgentPool, AgentsManifest +from wolfharness import AgentPool, AgentsManifest pytestmark = pytest.mark.integration diff --git a/tests/messaging/test_signal_forwarding.py b/tests/messaging/test_signal_forwarding.py index 47b3297ce..5d875840e 100644 --- a/tests/messaging/test_signal_forwarding.py +++ b/tests/messaging/test_signal_forwarding.py @@ -5,7 +5,7 @@ import pytest -from agentpool import Agent, AgentPool, AgentsManifest +from wolfharness import Agent, AgentPool, AgentsManifest pytestmark = pytest.mark.integration diff --git a/tests/messaging/test_source_type.py b/tests/messaging/test_source_type.py index a3dcc1683..3d253330a 100644 --- a/tests/messaging/test_source_type.py +++ b/tests/messaging/test_source_type.py @@ -7,8 +7,8 @@ import pytest -from agentpool.messaging import ChatMessage, MessageNode -from agentpool.messaging.messagenode import SourceType, get_source_type +from wolfharness.messaging import ChatMessage, MessageNode +from wolfharness.messaging.messagenode import SourceType, get_source_type pytestmark = pytest.mark.unit @@ -36,7 +36,7 @@ def test_source_type_literal_values() -> None: @pytest.mark.real_model def test_get_source_type_native_agent() -> None: """Native Agent instances should return 'agent'.""" - from agentpool.agents import Agent + from wolfharness.agents import Agent agent = Agent(name="test_agent", model="openai:gpt-4o-mini") assert get_source_type(agent) == "agent" @@ -45,8 +45,8 @@ def test_get_source_type_native_agent() -> None: @pytest.mark.real_model def test_get_source_type_team() -> None: """Team (parallel) instances should return 'team_parallel'.""" - from agentpool.agents import Agent - from agentpool.delegation.base_team import BaseTeam + from wolfharness.agents import Agent + from wolfharness.delegation.base_team import BaseTeam agent_a = Agent(name="a", model="openai:gpt-4o-mini") agent_b = Agent(name="b", model="openai:gpt-4o-mini") @@ -57,8 +57,8 @@ def test_get_source_type_team() -> None: @pytest.mark.real_model def test_get_source_type_teamrun() -> None: """TeamRun (sequential) instances should return 'team_sequential'.""" - from agentpool.agents import Agent - from agentpool.delegation.base_team import BaseTeam + from wolfharness.agents import Agent + from wolfharness.delegation.base_team import BaseTeam agent_a = Agent(name="a", model="openai:gpt-4o-mini") agent_b = Agent(name="b", model="openai:gpt-4o-mini") @@ -69,7 +69,7 @@ def test_get_source_type_teamrun() -> None: def test_get_source_type_unknown_subclass_defaults_to_agent() -> None: """Unknown MessageNode subclasses should default to 'agent' with a warning.""" stub = StubMessageNode(name="stub") - with patch("agentpool.messaging.messagenode.logger"): + with patch("wolfharness.messaging.messagenode.logger"): result = get_source_type(stub) assert result == "agent" # No warning for valid MessageNode subclass — it's just not Team/BaseTeam @@ -79,7 +79,7 @@ def test_get_source_type_unknown_subclass_defaults_to_agent() -> None: @pytest.mark.real_model def test_agent_type_property_on_agent() -> None: """MessageNode.agent_type on a native Agent returns persistence value.""" - from agentpool.agents import Agent + from wolfharness.agents import Agent agent = Agent(name="test_agent", model="openai:gpt-4o-mini") assert agent.agent_type == "agent" @@ -88,8 +88,8 @@ def test_agent_type_property_on_agent() -> None: @pytest.mark.real_model def test_agent_type_property_on_team() -> None: """MessageNode.agent_type on a Team returns the source_type value.""" - from agentpool.agents import Agent - from agentpool.delegation.base_team import BaseTeam + from wolfharness.agents import Agent + from wolfharness.delegation.base_team import BaseTeam agent_a = Agent(name="a", model="openai:gpt-4o-mini") agent_b = Agent(name="b", model="openai:gpt-4o-mini") @@ -100,8 +100,8 @@ def test_agent_type_property_on_team() -> None: @pytest.mark.real_model def test_agent_type_property_on_teamrun() -> None: """MessageNode.agent_type on a TeamRun returns the source_type value.""" - from agentpool.agents import Agent - from agentpool.delegation.base_team import BaseTeam + from wolfharness.agents import Agent + from wolfharness.delegation.base_team import BaseTeam agent_a = Agent(name="a", model="openai:gpt-4o-mini") agent_b = Agent(name="b", model="openai:gpt-4o-mini") @@ -114,11 +114,11 @@ def test_circular_import_safety() -> None: import importlib # Force re-import of messagenode to verify no circular import - mod = importlib.import_module("agentpool.messaging.messagenode") + mod = importlib.import_module("wolfharness.messaging.messagenode") importlib.reload(mod) # Verify the module still exports the expected symbols assert hasattr(mod, "SourceType") assert hasattr(mod, "get_source_type") - importlib.import_module("agentpool.delegation.base_team") + importlib.import_module("wolfharness.delegation.base_team") diff --git a/tests/messaging/test_talks.py b/tests/messaging/test_talks.py index 338c342d4..c6511a92b 100644 --- a/tests/messaging/test_talks.py +++ b/tests/messaging/test_talks.py @@ -3,8 +3,8 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.talk.talk import Talk, TeamTalk +from wolfharness import Agent +from wolfharness.talk.talk import Talk, TeamTalk pytestmark = pytest.mark.unit @@ -13,7 +13,7 @@ async def test_basic_single_connection(): """Test basic message forwarding between two agents.""" async with ( - Agent[str](model="test", name="agentpool") as source, + Agent[str](model="test", name="wolfharness") as source, Agent[str](model="test") as target, ): # Create explicit connection diff --git a/tests/messaging/test_thread_hypothesis.py b/tests/messaging/test_thread_hypothesis.py index 2354302b0..c04ef8e0e 100644 --- a/tests/messaging/test_thread_hypothesis.py +++ b/tests/messaging/test_thread_hypothesis.py @@ -3,7 +3,7 @@ from pydantic_ai._utils import disable_threads import pytest -from agentpool import Agent +from wolfharness import Agent pytestmark = pytest.mark.unit diff --git a/tests/messaging/test_tool_display_acp_diff.py b/tests/messaging/test_tool_display_acp_diff.py index d8386712a..12f0e8f6a 100644 --- a/tests/messaging/test_tool_display_acp_diff.py +++ b/tests/messaging/test_tool_display_acp_diff.py @@ -11,13 +11,13 @@ import pytest from acp.schema import FileEditToolCallContent, ToolCallProgress, ToolCallStart -from agentpool.agents.events import ( +from wolfharness.agents.events import ( DiffContentItem, LocationContentItem, ToolCallProgressEvent, ToolCallStartEvent, ) -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness_server.acp_server.event_converter import ACPEventConverter pytestmark = pytest.mark.integration diff --git a/tests/observability/test_observability.py b/tests/observability/test_observability.py index a739f3691..04158eb7f 100644 --- a/tests/observability/test_observability.py +++ b/tests/observability/test_observability.py @@ -6,8 +6,8 @@ from pydantic import SecretStr import pytest -from agentpool.observability.observability_registry import ObservabilityRegistry -from agentpool_config.observability import ( +from wolfharness.observability.observability_registry import ObservabilityRegistry +from wolfharness_config.observability import ( CustomObservabilityConfig, LangsmithObservabilityConfig, LogfireObservabilityConfig, diff --git a/tests/observability/test_observability_integration.py b/tests/observability/test_observability_integration.py index e90f325c9..415b8b49b 100644 --- a/tests/observability/test_observability_integration.py +++ b/tests/observability/test_observability_integration.py @@ -4,8 +4,8 @@ import pytest -from agentpool import AgentPool, AgentsManifest -from agentpool.observability import registry +from wolfharness import AgentPool, AgentsManifest +from wolfharness.observability import registry pytestmark = pytest.mark.integration diff --git a/tests/observability/test_span_hierarchy.py b/tests/observability/test_span_hierarchy.py index 39d55d160..80a1c230f 100644 --- a/tests/observability/test_span_hierarchy.py +++ b/tests/observability/test_span_hierarchy.py @@ -232,7 +232,7 @@ def test_background_task_span( This simulates the ``with logfire.span()`` inside the ``_safe_background_run()`` nested function in - ``agentpool_toolsets/builtin/subagent_tools.py``. + ``wolfharness_toolsets/builtin/subagent_tools.py``. """ tracer, exporter = in_memory_tracer diff --git a/tests/observability/test_tracing_optimization.py b/tests/observability/test_tracing_optimization.py index cc6ac9416..29f54d2a0 100644 --- a/tests/observability/test_tracing_optimization.py +++ b/tests/observability/test_tracing_optimization.py @@ -21,7 +21,7 @@ class TestOtelLogProcessor: def test_calls_logfire_log_without_creating_span(self): """_otel_log_processor calls logfire.log() but does not create a span.""" - from agentpool.log import _otel_log_processor + from wolfharness.log import _otel_log_processor event_dict: dict[str, object] = { "event": "test message", @@ -29,7 +29,7 @@ def test_calls_logfire_log_without_creating_span(self): "session_id": "s123", } - with patch("agentpool.log.logfire") as mock_logfire: + with patch("wolfharness.log.logfire") as mock_logfire: _otel_log_processor(None, "info", event_dict) mock_logfire.log.assert_called_once() @@ -43,14 +43,14 @@ def test_calls_logfire_log_without_creating_span(self): def test_returns_event_dict_unchanged(self): """_otel_log_processor returns event_dict unchanged for downstream renderers.""" - from agentpool.log import _otel_log_processor + from wolfharness.log import _otel_log_processor event_dict: dict[str, object] = { "event": "test message", "level": "info", } - with patch("agentpool.log.logfire"): + with patch("wolfharness.log.logfire"): result = _otel_log_processor(None, "info", event_dict) # event_dict must still have "event" key for renderer @@ -60,11 +60,11 @@ def test_returns_event_dict_unchanged(self): def test_handles_missing_event_key(self): """_otel_log_processor handles missing 'event' key gracefully.""" - from agentpool.log import _otel_log_processor + from wolfharness.log import _otel_log_processor event_dict: dict[str, object] = {"level": "debug"} - with patch("agentpool.log.logfire") as mock_logfire: + with patch("wolfharness.log.logfire") as mock_logfire: _otel_log_processor(None, "debug", event_dict) # Should fall back to method_name as msg @@ -73,11 +73,11 @@ def test_handles_missing_event_key(self): def test_does_not_raise_on_logfire_error(self): """_otel_log_processor swallows logfire errors to never break logging.""" - from agentpool.log import _otel_log_processor + from wolfharness.log import _otel_log_processor event_dict: dict[str, object] = {"event": "test", "level": "info"} - with patch("agentpool.log.logfire") as mock_logfire: + with patch("wolfharness.log.logfire") as mock_logfire: mock_logfire.log.side_effect = RuntimeError("OTel not configured") # Should not raise result = _otel_log_processor(None, "info", event_dict) @@ -91,7 +91,7 @@ class TestObservabilityConfig: def test_new_fields_exist_with_correct_defaults(self): """BaseObservabilityConfig has instrument_* fields with correct defaults.""" - from agentpool_config.observability import CustomObservabilityConfig + from wolfharness_config.observability import CustomObservabilityConfig config = CustomObservabilityConfig(type="custom", endpoint="http://localhost:4318") assert config.instrument_pydantic_ai is False @@ -100,7 +100,7 @@ def test_new_fields_exist_with_correct_defaults(self): def test_fields_can_be_overridden(self): """instrument_* fields can be overridden via config.""" - from agentpool_config.observability import CustomObservabilityConfig + from wolfharness_config.observability import CustomObservabilityConfig config = CustomObservabilityConfig( type="custom", @@ -120,7 +120,7 @@ class TestObservabilityRegistry: def test_is_configured_returns_false_before_configuration(self): """is_configured() returns False before configure_observability() is called.""" - from agentpool.observability.observability_registry import ( + from wolfharness.observability.observability_registry import ( ObservabilityRegistry, ) @@ -129,7 +129,7 @@ def test_is_configured_returns_false_before_configuration(self): def test_config_returns_none_before_configuration(self): """Config property returns None before configuration.""" - from agentpool.observability.observability_registry import ( + from wolfharness.observability.observability_registry import ( ObservabilityRegistry, ) @@ -138,10 +138,10 @@ def test_config_returns_none_before_configuration(self): def test_conditional_instrumentation(self): """configure_observability respects instrument_* config fields.""" - from agentpool.observability.observability_registry import ( + from wolfharness.observability.observability_registry import ( ObservabilityRegistry, ) - from agentpool_config.observability import ( + from wolfharness_config.observability import ( CustomObservabilityConfig, ObservabilityConfig, ) @@ -156,8 +156,8 @@ def test_conditional_instrumentation(self): registry = ObservabilityRegistry() with ( - patch("agentpool.observability.observability_registry.logfire") as mock_lf, - patch("agentpool.observability.observability_registry._setup_otel_environment"), + patch("wolfharness.observability.observability_registry.logfire") as mock_lf, + patch("wolfharness.observability.observability_registry._setup_otel_environment"), ): registry.configure_observability(config) @@ -172,10 +172,10 @@ def test_conditional_instrumentation(self): def test_conditional_instrumentation_enabled(self): """configure_observability calls instrumentation when enabled.""" - from agentpool.observability.observability_registry import ( + from wolfharness.observability.observability_registry import ( ObservabilityRegistry, ) - from agentpool_config.observability import ( + from wolfharness_config.observability import ( CustomObservabilityConfig, ObservabilityConfig, ) @@ -190,8 +190,8 @@ def test_conditional_instrumentation_enabled(self): registry = ObservabilityRegistry() with ( - patch("agentpool.observability.observability_registry.logfire") as mock_lf, - patch("agentpool.observability.observability_registry._setup_otel_environment"), + patch("wolfharness.observability.observability_registry.logfire") as mock_lf, + patch("wolfharness.observability.observability_registry._setup_otel_environment"), ): registry.configure_observability(config) @@ -210,7 +210,7 @@ class TestPerRunTrace: def test_run_handle_has_run_span_fields(self): """RunHandle has _run_span and _run_context fields (default None).""" - from agentpool.orchestrator.run import RunHandle + from wolfharness.orchestrator.run import RunHandle handle = RunHandle(run_id="test", session_id="s1", agent_type="native") assert handle._run_span is None @@ -218,14 +218,14 @@ def test_run_handle_has_run_span_fields(self): def test_session_state_no_longer_has_trace_context(self): """SessionState no longer has trace_context field (removed in per-run design).""" - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.orchestrator.session_controller import SessionState state = SessionState(session_id="test", agent_name="test") assert not hasattr(state, "trace_context") def test_session_controller_no_longer_has_get_trace_context(self): """SessionController no longer has get_trace_context method.""" - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController assert not hasattr(SessionController, "get_trace_context") diff --git a/tests/orchestrator/test_aexit_hang.py b/tests/orchestrator/test_aexit_hang.py index bd70b2a1d..334529c98 100644 --- a/tests/orchestrator/test_aexit_hang.py +++ b/tests/orchestrator/test_aexit_hang.py @@ -159,7 +159,7 @@ async def test_mcp_cleanup_session_has_timeout() -> None: If MCP cleanup hangs (due to proxy), cleanup_session should not hang forever. It should timeout and allow the session to close. """ - from agentpool.mcp_server.manager import MCPManager, McpSessionContext + from wolfharness.mcp_server.manager import MCPManager, McpSessionContext manager = MCPManager() @@ -171,7 +171,7 @@ async def test_mcp_cleanup_session_has_timeout() -> None: manager._session_contexts["test-session-hang"] = mock_ctx # Patch the cleanup timeout to 0.5s so the test doesn't wait 30s - import agentpool.mcp_server.manager as mgr_mod + import wolfharness.mcp_server.manager as mgr_mod original_timeout = mgr_mod._MCP_CLEANUP_TIMEOUT mgr_mod._MCP_CLEANUP_TIMEOUT = 0.5 @@ -207,7 +207,7 @@ async def test_wait_for_completion_does_not_hang_forever() -> None: wait_for_completion should have a default timeout to break this chain. """ - from agentpool.orchestrator.session_controller_runs import SessionControllerRunsMixin + from wolfharness.orchestrator.session_controller_runs import SessionControllerRunsMixin # Create a minimal mock that exercises wait_for_completion mock_controller = type("MockController", (), {})() @@ -267,7 +267,7 @@ async def test_close_session_mcp_step_has_timeout() -> None: # Read the source of _close_session_unlocked and check for timeout import inspect - from agentpool.orchestrator.session_controller_close import SessionControllerCloseMixin + from wolfharness.orchestrator.session_controller_close import SessionControllerCloseMixin source = inspect.getsource(SessionControllerCloseMixin._close_session_unlocked) @@ -332,7 +332,7 @@ async def test_cancel_can_break_through_aexit_hang() -> None: """ import inspect - from agentpool.orchestrator.run import RunHandle + from wolfharness.orchestrator.run import RunHandle source = inspect.getsource(RunHandle.cancel) diff --git a/tests/orchestrator/test_agent_type_detection.py b/tests/orchestrator/test_agent_type_detection.py index 751495b83..e3a387d75 100644 --- a/tests/orchestrator/test_agent_type_detection.py +++ b/tests/orchestrator/test_agent_type_detection.py @@ -12,8 +12,8 @@ if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool.orchestrator.core import SessionController + from wolfharness import AgentPool + from wolfharness.orchestrator.core import SessionController pytestmark = pytest.mark.unit diff --git a/tests/orchestrator/test_auto_compaction.py b/tests/orchestrator/test_auto_compaction.py index 6c1aacb0a..be9eb3672 100644 --- a/tests/orchestrator/test_auto_compaction.py +++ b/tests/orchestrator/test_auto_compaction.py @@ -19,8 +19,8 @@ ) import pytest -from agentpool.agents.native_agent.checkpoint import CheckpointManager -from agentpool.storage.serialization import messages_adapter +from wolfharness.agents.native_agent.checkpoint import CheckpointManager +from wolfharness.storage.serialization import messages_adapter pytestmark = pytest.mark.unit diff --git a/tests/orchestrator/test_cancellation.py b/tests/orchestrator/test_cancellation.py index deedd2f02..277937258 100644 --- a/tests/orchestrator/test_cancellation.py +++ b/tests/orchestrator/test_cancellation.py @@ -25,22 +25,22 @@ from pydantic_ai.messages import ModelResponse, TextPart import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( RunErrorEvent, RunFailedEvent, RunStartedEvent, StreamCompleteEvent, ToolCallStartEvent, ) -from agentpool.lifecycle.types import DeliveryMode -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventEnvelope, SessionPool -from agentpool.orchestrator.turn import Turn +from wolfharness.lifecycle.types import DeliveryMode +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventEnvelope, SessionPool +from wolfharness.orchestrator.turn import Turn if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool.agents.context import AgentRunContext + from wolfharness import AgentPool + from wolfharness.agents.context import AgentRunContext # Reusable ModelMessage for tests that need .messages populated on ChatMessage. _ModelResponse = ModelResponse(parts=[TextPart(content="response")]) @@ -1524,7 +1524,7 @@ async def test_drain_prompt_queue_skips_closing_session() -> None: Unit test: directly call _drain_prompt_queue with is_closing=True and verify no task is created. """ - from agentpool.orchestrator.core import SessionController, SessionState + from wolfharness.orchestrator.core import SessionController, SessionState controller = SessionController.__new__(SessionController) controller._background_tasks = set() @@ -1559,7 +1559,7 @@ async def test_drain_prompt_queue_agent_none_preserves_message() -> None: The fix puts the message back into prompt_queue when agent is None, instead of silently dropping it. """ - from agentpool.orchestrator.core import SessionController, SessionState + from wolfharness.orchestrator.core import SessionController, SessionState controller = SessionController.__new__(SessionController) controller._background_tasks = set() diff --git a/tests/orchestrator/test_config_hash.py b/tests/orchestrator/test_config_hash.py index d098ea3ec..536da0497 100644 --- a/tests/orchestrator/test_config_hash.py +++ b/tests/orchestrator/test_config_hash.py @@ -6,14 +6,14 @@ import pytest -from agentpool.agents.native_agent.checkpoint import compute_agent_config_hash +from wolfharness.agents.native_agent.checkpoint import compute_agent_config_hash pytestmark = pytest.mark.unit if TYPE_CHECKING: - from agentpool.tools.base import Tool + from wolfharness.tools.base import Tool def _make_tool( @@ -24,7 +24,7 @@ def _make_tool( description: str = "A test tool", ) -> Tool: """Helper to create a FunctionTool for testing.""" - from agentpool.tools.base import FunctionTool + from wolfharness.tools.base import FunctionTool return FunctionTool( name=name, diff --git a/tests/orchestrator/test_consume_run_event.py b/tests/orchestrator/test_consume_run_event.py index 23744afab..20848c208 100644 --- a/tests/orchestrator/test_consume_run_event.py +++ b/tests/orchestrator/test_consume_run_event.py @@ -13,16 +13,16 @@ import pytest -from agentpool.agents.events import StreamCompleteEvent, UserMessageInsertedEvent -from agentpool.lifecycle.comm_channel import DirectChannel -from agentpool.lifecycle.journal import MemoryJournal -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import SessionController, SessionState +from wolfharness.agents.events import StreamCompleteEvent, UserMessageInsertedEvent +from wolfharness.lifecycle.comm_channel import DirectChannel +from wolfharness.lifecycle.journal import MemoryJournal +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import SessionController, SessionState if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool.orchestrator.run import RunHandle + from wolfharness import AgentPool + from wolfharness.orchestrator.run import RunHandle pytestmark = pytest.mark.unit diff --git a/tests/orchestrator/test_deferred_timeout.py b/tests/orchestrator/test_deferred_timeout.py index e7d9b1e84..1f5c6773a 100644 --- a/tests/orchestrator/test_deferred_timeout.py +++ b/tests/orchestrator/test_deferred_timeout.py @@ -10,8 +10,8 @@ import pytest -from agentpool.orchestrator.core import SessionController -from agentpool.sessions.models import PendingDeferredCall, SessionData +from wolfharness.orchestrator.core import SessionController +from wolfharness.sessions.models import PendingDeferredCall, SessionData pytestmark = pytest.mark.unit diff --git a/tests/orchestrator/test_deprecation.py b/tests/orchestrator/test_deprecation.py index 1d71b1c0f..273d9593e 100644 --- a/tests/orchestrator/test_deprecation.py +++ b/tests/orchestrator/test_deprecation.py @@ -19,7 +19,7 @@ import pytest -from agentpool.capabilities.runloop_delegation import RunLoopDelegationService +from wolfharness.capabilities.runloop_delegation import RunLoopDelegationService pytestmark = pytest.mark.unit @@ -33,8 +33,8 @@ @pytest.mark.anyio async def test_delegation_service_spawn_subagent_deprecation() -> None: """RunLoopDelegationService.spawn_subagent() emits DeprecationWarning.""" - from agentpool.agents.events.events import StreamCompleteEvent - from agentpool.orchestrator.core import EventBus + from wolfharness.agents.events.events import StreamCompleteEvent + from wolfharness.orchestrator.core import EventBus registry = MagicMock() registry.exists = MagicMock(return_value=True) @@ -109,8 +109,8 @@ def test_delegation_service_get_available_agents_deprecation() -> None: @pytest.mark.anyio async def test_subagent_capability_uses_run_agent() -> None: """SubagentCapability.spawn_subagent calls run_agent() when session_pool is available.""" - from agentpool.capabilities.agent_context import AgentContextDeps - from agentpool.capabilities.subagent_capability import SubagentCapability + from wolfharness.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.subagent_capability import SubagentCapability # Build a mock AgentContextDeps with a non-None session_pool. session_pool = MagicMock() @@ -164,8 +164,8 @@ async def _mock_stream(name: str, prompt: str) -> Any: yield "chunk1" yield "chunk2" - from agentpool.capabilities.agent_context import AgentContextDeps - from agentpool.capabilities.subagent_capability import SubagentCapability + from wolfharness.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.subagent_capability import SubagentCapability host = MagicMock() host.session_pool = None diff --git a/tests/orchestrator/test_e2e.py b/tests/orchestrator/test_e2e.py index 7c49de902..6f79fa3ba 100644 --- a/tests/orchestrator/test_e2e.py +++ b/tests/orchestrator/test_e2e.py @@ -15,23 +15,23 @@ from pydantic_ai import TextPartDelta import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( PartDeltaEvent, RunStartedEvent, StreamCompleteEvent, ToolCallCompleteEvent, ToolCallStartEvent, ) -from agentpool.lifecycle import DirectChannel, MemoryJournal -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventBus, EventEnvelope, SessionPool +from wolfharness.lifecycle import DirectChannel, MemoryJournal +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventBus, EventEnvelope, SessionPool if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool import AgentPool - from agentpool.agents.context import AgentRunContext + from wolfharness import AgentPool + from wolfharness.agents.context import AgentRunContext pytestmark = [pytest.mark.integration, pytest.mark.anyio] @@ -206,8 +206,8 @@ async def test_multi_turn_same_session_both_complete_via_consume_run( Current behavior: _consume_run breaks on StreamCompleteEvent + aclose() → RunHandle killed after turn 1 → turn 2's followup message is lost. """ - from agentpool.lifecycle.types import DeliveryMode from tests._controller_helpers import send_via_controller + from wolfharness.lifecycle.types import DeliveryMode session_pool = minimal_pool.session_pool assert session_pool is not None diff --git a/tests/orchestrator/test_enqueued_messages_mapping.py b/tests/orchestrator/test_enqueued_messages_mapping.py index 6f69d13ee..43924e72d 100644 --- a/tests/orchestrator/test_enqueued_messages_mapping.py +++ b/tests/orchestrator/test_enqueued_messages_mapping.py @@ -23,8 +23,8 @@ ) import pytest -from agentpool.agents.events.events import UserMessageInsertedEvent -from agentpool.orchestrator.event_mapper import EventMapper +from wolfharness.agents.events.events import UserMessageInsertedEvent +from wolfharness.orchestrator.event_mapper import EventMapper def _make_enqueued_event(content: str = "Hello, steer me!") -> EnqueuedMessagesEvent: diff --git a/tests/orchestrator/test_envelope_integration.py b/tests/orchestrator/test_envelope_integration.py index 25000c7a5..9793a94ae 100644 --- a/tests/orchestrator/test_envelope_integration.py +++ b/tests/orchestrator/test_envelope_integration.py @@ -6,7 +6,7 @@ import pytest -from agentpool.orchestrator.core import EventBus, EventEnvelope +from wolfharness.orchestrator.core import EventBus, EventEnvelope pytestmark = pytest.mark.integration @@ -15,7 +15,7 @@ if TYPE_CHECKING: import asyncio - from agentpool import AgentPool + from wolfharness import AgentPool def _queue_empty(queue: asyncio.Queue) -> bool: @@ -54,8 +54,8 @@ async def test_child_event_routing_source_session_id(self, minimal_pool: AgentPo async def test_transparent_forwarding(self) -> None: """Attribute access transparently forwards to the wrapped event via __getattr__.""" - from agentpool.agents.events import StreamCompleteEvent - from agentpool.messaging import ChatMessage + from wolfharness.agents.events import StreamCompleteEvent + from wolfharness.messaging import ChatMessage message = ChatMessage(content="hello world", role="assistant") event = StreamCompleteEvent(message=message) diff --git a/tests/orchestrator/test_event_bus.py b/tests/orchestrator/test_event_bus.py index c7e978505..a455cb223 100644 --- a/tests/orchestrator/test_event_bus.py +++ b/tests/orchestrator/test_event_bus.py @@ -20,7 +20,7 @@ ) import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( CompactionEvent, CustomEvent, PartDeltaEvent, @@ -41,8 +41,8 @@ ToolCallStartEvent, ToolResultMetadataEvent, ) -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import ( # type: ignore[attr-defined] +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import ( # type: ignore[attr-defined] EventBus, EventEnvelope, _is_immediate, diff --git a/tests/orchestrator/test_event_mapper.py b/tests/orchestrator/test_event_mapper.py index 235f378d6..df601deff 100644 --- a/tests/orchestrator/test_event_mapper.py +++ b/tests/orchestrator/test_event_mapper.py @@ -10,12 +10,12 @@ from pydantic_ai.messages import ToolCallPart, ToolReturnPart import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( RunStartedEvent, ToolCallCompleteEvent, ToolCallStartEvent, ) -from agentpool.orchestrator.event_mapper import EventMapper +from wolfharness.orchestrator.event_mapper import EventMapper @pytest.mark.unit diff --git a/tests/orchestrator/test_event_mapper_thinking_normalization.py b/tests/orchestrator/test_event_mapper_thinking_normalization.py index d3264b919..bf27057ba 100644 --- a/tests/orchestrator/test_event_mapper_thinking_normalization.py +++ b/tests/orchestrator/test_event_mapper_thinking_normalization.py @@ -22,8 +22,8 @@ from pydantic_ai.models.openai import _make_raw_content_updater import pytest -from agentpool.agents.events.events import PartDeltaEvent, PartStartEvent -from agentpool.orchestrator.event_mapper import ( +from wolfharness.agents.events.events import PartDeltaEvent, PartStartEvent +from wolfharness.orchestrator.event_mapper import ( EventMapper, _normalize_thinking_event, normalize_thinking_parts_in_messages, diff --git a/tests/orchestrator/test_event_mapper_tool_call_sanitization.py b/tests/orchestrator/test_event_mapper_tool_call_sanitization.py index dccf876b2..f295809d3 100644 --- a/tests/orchestrator/test_event_mapper_tool_call_sanitization.py +++ b/tests/orchestrator/test_event_mapper_tool_call_sanitization.py @@ -11,7 +11,7 @@ from pydantic_ai.messages import ModelResponse, TextPart, ToolCallPart import pytest -from agentpool.orchestrator.event_mapper import ( +from wolfharness.orchestrator.event_mapper import ( _extract_first_json_object, sanitize_tool_call_args_in_messages, ) diff --git a/tests/orchestrator/test_event_mapper_tool_progress.py b/tests/orchestrator/test_event_mapper_tool_progress.py index c729b705a..4b74cac80 100644 --- a/tests/orchestrator/test_event_mapper_tool_progress.py +++ b/tests/orchestrator/test_event_mapper_tool_progress.py @@ -6,11 +6,11 @@ from pydantic_ai.messages import ToolCallPart import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( ToolCallProgressEvent, ToolCallStartEvent, ) -from agentpool.orchestrator.event_mapper import EventMapper +from wolfharness.orchestrator.event_mapper import EventMapper @pytest.mark.unit diff --git a/tests/orchestrator/test_execute_turn.py b/tests/orchestrator/test_execute_turn.py index 4db64c804..0fdc76857 100644 --- a/tests/orchestrator/test_execute_turn.py +++ b/tests/orchestrator/test_execute_turn.py @@ -10,11 +10,11 @@ import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( RunErrorEvent, StreamCompleteEvent, ) -from agentpool.messaging.messagenode import ChatMessage +from wolfharness.messaging.messagenode import ChatMessage def _make_mock_session() -> MagicMock: @@ -36,7 +36,7 @@ async def test_execute_turn_breaks_on_run_error_event() -> None: _execute_turn() breaks on RunErrorEvent and does NOT yield the trailing StreamCompleteEvent. """ - from agentpool.orchestrator.run import RunHandle + from wolfharness.orchestrator.run import RunHandle error_event = RunErrorEvent( message="Something went wrong", @@ -96,7 +96,7 @@ async def test_execute_turn_breaks_on_stream_complete() -> None: When turn.execute() yields StreamCompleteEvent (no RunErrorEvent), _execute_turn() breaks normally. """ - from agentpool.orchestrator.run import RunHandle + from wolfharness.orchestrator.run import RunHandle complete_event = StreamCompleteEvent( message=ChatMessage(content="done", role="assistant"), diff --git a/tests/orchestrator/test_integration_redflags.py b/tests/orchestrator/test_integration_redflags.py index 9fab7f194..40e1d8aa6 100644 --- a/tests/orchestrator/test_integration_redflags.py +++ b/tests/orchestrator/test_integration_redflags.py @@ -14,10 +14,10 @@ import pytest -from agentpool import AgentPool, AgentsManifest, NativeAgentConfig -from agentpool.agents.events import StreamCompleteEvent -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventBus, EventEnvelope, SessionController +from wolfharness import AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventBus, EventEnvelope, SessionController # ============================================================================ diff --git a/tests/orchestrator/test_multimodal_prompts.py b/tests/orchestrator/test_multimodal_prompts.py index 2a44c8310..4d593e733 100644 --- a/tests/orchestrator/test_multimodal_prompts.py +++ b/tests/orchestrator/test_multimodal_prompts.py @@ -19,13 +19,13 @@ from pydantic_ai.messages import BinaryImage import pytest -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import StreamCompleteEvent -from agentpool.lifecycle.comm_channel import DirectChannel -from agentpool.lifecycle.journal import MemoryJournal -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.run import RunHandle -from agentpool.orchestrator.turn import Turn +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.lifecycle.comm_channel import DirectChannel +from wolfharness.lifecycle.journal import MemoryJournal +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.run import RunHandle +from wolfharness.orchestrator.turn import Turn pytestmark = pytest.mark.unit @@ -149,7 +149,7 @@ async def test_start_accepts_list_prompt() -> None: @pytest.mark.unit async def test_start_accepts_empty_string() -> None: """Empty string produces empty prompts list (no spurious turn).""" - from agentpool.agents.staged_content import StagedContent + from wolfharness.agents.staged_content import StagedContent turn = _CapturingStubTurn([]) agent = MagicMock() @@ -202,7 +202,7 @@ async def test_steer_accepts_list_content() -> None: @pytest.mark.unit async def test_acp_turn_flattens_multimodal_prompts() -> None: """ACPTurn flattens list[str | list[Any]] into list[UserContent] for ACP.""" - from agentpool.agents.acp_agent.turn import ACPTurn + from wolfharness.agents.acp_agent.turn import ACPTurn binary_img = BinaryImage(data=b"\x89PNG", media_type="image/png") @@ -263,7 +263,7 @@ async def get_messages(self, session_id: str) -> Any: @pytest.mark.unit async def test_acp_turn_flattens_all_string_prompts() -> None: """ACPTurn with all string prompts flattens into text blocks.""" - from agentpool.agents.acp_agent.turn import ACPTurn + from wolfharness.agents.acp_agent.turn import ACPTurn prompts: list[Any] = ["hello", "world"] @@ -309,7 +309,7 @@ async def get_messages(self, session_id: str) -> Any: @pytest.mark.unit async def test_acp_turn_empty_prompts() -> None: """ACPTurn with empty prompts sends empty string.""" - from agentpool.agents.acp_agent.turn import ACPTurn + from wolfharness.agents.acp_agent.turn import ACPTurn captured_content: list[Any] = [] diff --git a/tests/orchestrator/test_multimodal_storage.py b/tests/orchestrator/test_multimodal_storage.py index 3659b8a03..efaab099e 100644 --- a/tests/orchestrator/test_multimodal_storage.py +++ b/tests/orchestrator/test_multimodal_storage.py @@ -24,11 +24,11 @@ ) import pytest -from agentpool.agents.native_agent.helpers import ( +from wolfharness.agents.native_agent.helpers import ( _summarize_content_block, extract_text_from_messages, ) -from agentpool.storage.serialization import ( +from wolfharness.storage.serialization import ( deserialize_prompts, serialize_prompts, ) @@ -229,7 +229,7 @@ def test_deserialize_prompts_empty_string_returns_empty() -> None: @pytest.mark.unit def test_snapshot_store_saves_prompts_serialized() -> None: """Snapshot store should save prompts_serialized with full multimodal data.""" - from agentpool.lifecycle import MemorySnapshotStore + from wolfharness.lifecycle import MemorySnapshotStore store = MemorySnapshotStore() img = BinaryImage(data=b"\x89PNG\r\n\x1a\n", media_type="image/png") @@ -319,7 +319,7 @@ def test_opencode_converter_uses_summarize_content_block() -> None: @pytest.mark.unit def test_compaction_extract_text_content_uses_summarize() -> None: """compaction._extract_text_content should include placeholders for non-string items.""" - from agentpool.messaging.compaction import _extract_text_content + from wolfharness.messaging.compaction import _extract_text_content img = BinaryImage(data=b"\x89PNG\r\n\x1a\n", media_type="image/png") msg = ModelRequest( @@ -348,16 +348,16 @@ async def test_multimodal_prompt_round_trip_through_db(tmp_path: Any) -> None: ``get_session_messages()``, and verifies the ``BinaryImage`` is preserved with correct data and media_type. """ - from agentpool.messaging import ChatMessage - from agentpool_config.storage import SQLStorageConfig - from agentpool_storage.sql_provider import SQLModelProvider + from wolfharness.messaging import ChatMessage + from wolfharness_config.storage import SQLStorageConfig + from wolfharness_storage.sql_provider import SQLModelProvider db_path = tmp_path / "test_multimodal.db" config = SQLStorageConfig(url=f"sqlite:///{db_path}") provider = SQLModelProvider(config) # Clear engine cache to avoid cross-test contamination. - from agentpool_config.storage import _engine_cache + from wolfharness_config.storage import _engine_cache _engine_cache.clear() diff --git a/tests/orchestrator/test_native_turn_integration.py b/tests/orchestrator/test_native_turn_integration.py index 8ed03076a..b7a36a4ec 100644 --- a/tests/orchestrator/test_native_turn_integration.py +++ b/tests/orchestrator/test_native_turn_integration.py @@ -27,21 +27,21 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events.events import ( +from wolfharness import Agent +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events.events import ( StreamCompleteEvent, ) -from agentpool.agents.native_agent.turn import NativeTurn -from agentpool.lifecycle.comm_channel import DirectChannel -from agentpool.lifecycle.journal import MemoryJournal -from agentpool.orchestrator.core import EventBus -from agentpool.orchestrator.run import RunHandle -from agentpool.tasks.exceptions import RunAbortedError +from wolfharness.agents.native_agent.turn import NativeTurn +from wolfharness.lifecycle.comm_channel import DirectChannel +from wolfharness.lifecycle.journal import MemoryJournal +from wolfharness.orchestrator.core import EventBus +from wolfharness.orchestrator.run import RunHandle +from wolfharness.tasks.exceptions import RunAbortedError if TYPE_CHECKING: - from agentpool.agents.events.events import RichAgentStreamEvent + from wolfharness.agents.events.events import RichAgentStreamEvent pytestmark = pytest.mark.unit @@ -68,7 +68,7 @@ async def test_native_turn_events_reach_event_bus_consumer() -> None: event_bus = EventBus() # Simulate SessionState with a turn_lock - from agentpool.orchestrator.core import SessionState + from wolfharness.orchestrator.core import SessionState session = SessionState( session_id="test-integration-session", @@ -192,7 +192,7 @@ async def test_run_aborted_error_yields_cancelled_stream_complete() -> None: events.extend([event async for event in turn.execute()]) # Must yield StreamCompleteEvent(cancelled=True), NOT RunErrorEvent - from agentpool.agents.events.events import RunErrorEvent + from wolfharness.agents.events.events import RunErrorEvent run_errors = [e for e in events if isinstance(e, RunErrorEvent)] stream_complete = [e for e in events if isinstance(e, StreamCompleteEvent)] @@ -281,7 +281,7 @@ def test_native_turn_no_redundant_run_started_event() -> None: RunHandle.start() already publishes RunStartedEvent before calling turn.execute(). Yielding it again causes duplicate events. """ - import agentpool.agents.native_agent.turn as turn_module + import wolfharness.agents.native_agent.turn as turn_module source = inspect.getsource(turn_module.NativeTurn.execute) import re @@ -303,7 +303,7 @@ def test_native_turn_run_error_event_includes_run_id() -> None: Without run_id, error events can't be correlated with the active run. """ - import agentpool.agents.native_agent.turn as turn_module + import wolfharness.agents.native_agent.turn as turn_module source = inspect.getsource(turn_module.NativeTurn.execute) assert "run_id=self._run_ctx.run_id" in source, ( diff --git a/tests/orchestrator/test_performance.py b/tests/orchestrator/test_performance.py index 3d6d088ec..b787be6fb 100644 --- a/tests/orchestrator/test_performance.py +++ b/tests/orchestrator/test_performance.py @@ -15,11 +15,11 @@ import pytest -from agentpool.agents.events import RunStartedEvent, StreamCompleteEvent -from agentpool.lifecycle import DirectChannel, MemoryJournal -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventBus, SessionPool -from agentpool.orchestrator.metrics import MetricsCollector +from wolfharness.agents.events import RunStartedEvent, StreamCompleteEvent +from wolfharness.lifecycle import DirectChannel, MemoryJournal +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventBus, SessionPool +from wolfharness.orchestrator.metrics import MetricsCollector pytestmark = pytest.mark.integration @@ -28,7 +28,7 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool import AgentPool + from wolfharness import AgentPool # ============================================================================ diff --git a/tests/orchestrator/test_phase6_cleanup.py b/tests/orchestrator/test_phase6_cleanup.py index 1363d35f2..39aa1f227 100644 --- a/tests/orchestrator/test_phase6_cleanup.py +++ b/tests/orchestrator/test_phase6_cleanup.py @@ -23,13 +23,13 @@ import pytest -from agentpool.orchestrator.core import EventBus, SessionController, SessionState -from agentpool.orchestrator.session_pool import SessionPool -from agentpool.orchestrator.session_pool_config import SessionPoolConfig +from wolfharness.orchestrator.core import EventBus, SessionController, SessionState +from wolfharness.orchestrator.session_pool import SessionPool +from wolfharness.orchestrator.session_pool_config import SessionPoolConfig if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.unit] @@ -143,7 +143,7 @@ async def test_close_during_mcp_tool_call_runhandle_cancel_first(minimal_pool: A controller._sessions[session_id] = session # Create a mock RunHandle that completes immediately when closed - from agentpool.orchestrator.run import RunHandle + from wolfharness.orchestrator.run import RunHandle run_handle = MagicMock(spec=RunHandle) run_handle.run_id = "run-mcp-1" @@ -255,8 +255,8 @@ async def test_checkpoint_on_close_failure_preserves_session(minimal_pool: Agent log the error, keep the session in memory, and MCP cleanup should still run. """ - from agentpool.sessions.models import SessionData - from agentpool_storage.protocols import SessionPersistence + from wolfharness.sessions.models import SessionData + from wolfharness_storage.protocols import SessionPersistence # Create a mock store that fails on save_session mock_store = AsyncMock(spec=SessionPersistence) diff --git a/tests/orchestrator/test_receive_request.py b/tests/orchestrator/test_receive_request.py index a8b9aaae9..fe08b9305 100644 --- a/tests/orchestrator/test_receive_request.py +++ b/tests/orchestrator/test_receive_request.py @@ -16,14 +16,14 @@ import pytest -from agentpool.lifecycle.types import DeliveryMode -from agentpool.orchestrator.core import EventBus, SessionController -from agentpool.orchestrator.run import RunHandle from tests._controller_helpers import send_via_controller +from wolfharness.lifecycle.types import DeliveryMode +from wolfharness.orchestrator.core import EventBus, SessionController +from wolfharness.orchestrator.run import RunHandle if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit @@ -295,7 +295,7 @@ async def test_receive_request_uses_get_or_create_session_agent(minimal_pool: Ag When agent is not yet cached (new top-level sessions), .get() returns None and receive_request silently does nothing. """ - from agentpool.orchestrator.core import SessionController + from wolfharness.orchestrator.core import SessionController controller = SessionController(pool=minimal_pool) event_bus = EventBus() @@ -434,7 +434,7 @@ async def test_wait_for_completion_session_not_found_raises( controller: SessionController, ) -> None: """wait_for_completion() raises SessionNotFoundError for unknown session.""" - from agentpool.orchestrator.session_controller import SessionNotFoundError + from wolfharness.orchestrator.session_controller import SessionNotFoundError with pytest.raises(SessionNotFoundError, match="Session not found"): await controller.wait_for_completion("nonexistent", timeout=1.0) diff --git a/tests/orchestrator/test_receive_request_acp.py b/tests/orchestrator/test_receive_request_acp.py index fc44b8a92..7d410dd02 100644 --- a/tests/orchestrator/test_receive_request_acp.py +++ b/tests/orchestrator/test_receive_request_acp.py @@ -13,16 +13,16 @@ import pytest -from agentpool.agents.acp_agent import ACPAgent -from agentpool.lifecycle import RunState -from agentpool.lifecycle.types import DeliveryMode -from agentpool.orchestrator.core import EventBus, SessionController -from agentpool.orchestrator.run import RunHandle from tests._controller_helpers import send_via_controller +from wolfharness.agents.acp_agent import ACPAgent +from wolfharness.lifecycle import RunState +from wolfharness.lifecycle.types import DeliveryMode +from wolfharness.orchestrator.core import EventBus, SessionController +from wolfharness.orchestrator.run import RunHandle if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit diff --git a/tests/orchestrator/test_receive_request_input_provider.py b/tests/orchestrator/test_receive_request_input_provider.py index cbcb0b972..ec136d9c0 100644 --- a/tests/orchestrator/test_receive_request_input_provider.py +++ b/tests/orchestrator/test_receive_request_input_provider.py @@ -17,13 +17,13 @@ import pytest -from agentpool.orchestrator.core import EventBus, SessionController from tests._controller_helpers import send_via_controller +from wolfharness.orchestrator.core import EventBus, SessionController if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool.orchestrator.run import RunHandle + from wolfharness import AgentPool + from wolfharness.orchestrator.run import RunHandle pytestmark = pytest.mark.unit diff --git a/tests/orchestrator/test_recovery_integration.py b/tests/orchestrator/test_recovery_integration.py index fd4d3306e..a7ab8f5b6 100644 --- a/tests/orchestrator/test_recovery_integration.py +++ b/tests/orchestrator/test_recovery_integration.py @@ -7,7 +7,7 @@ Crash recovery is lifecycle-internal and does not depend on model API responses, so these are L2 integration tests (not L3 VCR tests). -See: https://github.com/Leoyzen/agentpool/issues/205 +See: https://github.com/Leoyzen/wolfharness/issues/205 """ from __future__ import annotations @@ -17,7 +17,7 @@ import pytest -from agentpool.lifecycle import ( +from wolfharness.lifecycle import ( DurableJournal, MemoryJournal, MemorySnapshotStore, diff --git a/tests/orchestrator/test_replay_buffer_turn_isolation.py b/tests/orchestrator/test_replay_buffer_turn_isolation.py index 7c2d7f840..cc1a77d70 100644 --- a/tests/orchestrator/test_replay_buffer_turn_isolation.py +++ b/tests/orchestrator/test_replay_buffer_turn_isolation.py @@ -18,14 +18,14 @@ import anyio import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( PartDeltaEvent, RunErrorEvent, RunStartedEvent, StreamCompleteEvent, ) -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventBus, EventEnvelope +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventBus, EventEnvelope def _make_run_started(session_id: str = "s1") -> RunStartedEvent: diff --git a/tests/orchestrator/test_resume_integration.py b/tests/orchestrator/test_resume_integration.py index d32f2ea4b..73d739186 100644 --- a/tests/orchestrator/test_resume_integration.py +++ b/tests/orchestrator/test_resume_integration.py @@ -12,13 +12,13 @@ import pytest -from agentpool.agents.events.events import SessionResumeEvent -from agentpool.orchestrator.core import SessionBusyError, SessionPool -from agentpool.sessions.models import PendingDeferredCall, SessionData +from wolfharness.agents.events.events import SessionResumeEvent +from wolfharness.orchestrator.core import SessionBusyError, SessionPool +from wolfharness.sessions.models import PendingDeferredCall, SessionData if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool def _stream_empty(queue: asyncio.Queue[Any]) -> bool: @@ -125,7 +125,7 @@ def approvals(self) -> dict[str, Any]: @pytest.fixture async def session_pool(minimal_pool: AgentPool) -> SessionPool: """Return a SessionPool backed by a real AgentPool with MemoryStorageProvider.""" - from agentpool_storage.memory_provider.provider import MemoryStorageProvider + from wolfharness_storage.memory_provider.provider import MemoryStorageProvider store = MemoryStorageProvider() return SessionPool(pool=minimal_pool, store=store) @@ -141,7 +141,7 @@ async def test_resume_session_raises_session_not_found_error( session_pool: SessionPool, ) -> None: """resume_session raises SessionNotFoundError for non-existent session.""" - from agentpool.orchestrator.core import SessionNotFoundError + from wolfharness.orchestrator.core import SessionNotFoundError results = make_deferred_tool_results(["call-1"]) with pytest.raises(SessionNotFoundError, match="sess-nonexistent"): @@ -158,7 +158,7 @@ async def test_resume_session_raises_busy_error_when_active_run( session_pool: SessionPool, ) -> None: """resume_session raises SessionBusyError when the session has an active run.""" - from agentpool.orchestrator.core import SessionBusyError + from wolfharness.orchestrator.core import SessionBusyError # Create session and fake an active run state, _ = await session_pool.sessions.get_or_create_session("sess-1", agent_name="test-agent") @@ -179,7 +179,7 @@ async def test_resume_session_raises_mismatch_error_missing_results( session_pool: SessionPool, ) -> None: """resume_session raises CheckpointMismatchError when results don't cover all pending calls.""" - from agentpool.orchestrator.core import CheckpointMismatchError + from wolfharness.orchestrator.core import CheckpointMismatchError store = session_pool.sessions.store assert store is not None @@ -202,7 +202,7 @@ async def test_resume_session_raises_mismatch_error_extra_results( session_pool: SessionPool, ) -> None: """resume_session raises CheckpointMismatchError when results include unknown call IDs.""" - from agentpool.orchestrator.core import CheckpointMismatchError + from wolfharness.orchestrator.core import CheckpointMismatchError store = session_pool.sessions.store assert store is not None @@ -275,7 +275,7 @@ async def test_resume_native_agent_loads_checkpoint_and_runs( ) # Create a fake checkpoint - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], @@ -341,7 +341,7 @@ async def test_resume_native_agent_clears_pending_after_success( ) ) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], @@ -388,7 +388,7 @@ async def test_resume_native_agent_does_not_clear_pending_on_failure( ) ) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], @@ -442,7 +442,7 @@ async def test_resume_session_emits_resume_event( ) ) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], @@ -511,7 +511,7 @@ async def test_resume_session_transitions_status_to_active( ) ) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], @@ -562,7 +562,7 @@ async def test_resume_session_keeps_checkpointed_status_on_failure( ) ) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], @@ -621,7 +621,7 @@ async def test_resume_acp_agent_reopens_subprocess( mock_acp.run = AsyncMock(return_value=MagicMock()) mock_acp._resume_session = AsyncMock(return_value=None) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], @@ -666,7 +666,7 @@ async def test_resume_session_with_empty_pending_calls( ) ) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], @@ -717,7 +717,7 @@ async def _fail_gen_rc(*args: Any, **kwargs: Any) -> Any: @pytest.fixture async def session_pool_rc(minimal_pool: AgentPool) -> SessionPool: """Return a SessionPool backed by a real AgentPool with MemoryStorageProvider.""" - from agentpool_storage.memory_provider.provider import MemoryStorageProvider + from wolfharness_storage.memory_provider.provider import MemoryStorageProvider store = MemoryStorageProvider() return SessionPool(pool=minimal_pool, store=store) @@ -801,7 +801,7 @@ async def test_resume_session_concurrent_calls_serialize(session_pool_rc: Sessio metadata={"agent_type": "native"}, ) ) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], pending_calls=[make_pending_call("call-1")] @@ -855,7 +855,7 @@ async def test_resume_session_rejects_second_after_success(session_pool_rc: Sess metadata={"agent_type": "native"}, ) ) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], pending_calls=[make_pending_call("call-1")] @@ -898,7 +898,7 @@ async def test_resume_session_does_not_clear_pending_on_failure( metadata={"agent_type": "native"}, ) ) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], pending_calls=[make_pending_call("call-1")] @@ -944,7 +944,7 @@ async def test_resume_session_allows_retry_after_failure(session_pool_rc: Sessio metadata={"agent_type": "native"}, ) ) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], pending_calls=[make_pending_call("call-1")] @@ -1002,7 +1002,7 @@ async def test_resume_session_status_transitions_checkpointed_to_resuming_to_act metadata={"agent_type": "native"}, ) ) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], pending_calls=[make_pending_call("call-1")] @@ -1051,7 +1051,7 @@ async def test_resume_session_status_reverts_to_checkpointed_on_failure( metadata={"agent_type": "native"}, ) ) - from agentpool.agents.native_agent.checkpoint import CheckpointData + from wolfharness.agents.native_agent.checkpoint import CheckpointData checkpoint_data = CheckpointData( message_history=[], pending_calls=[make_pending_call("call-1")] diff --git a/tests/orchestrator/test_route_message_event.py b/tests/orchestrator/test_route_message_event.py index f7c25ddbf..4eff93659 100644 --- a/tests/orchestrator/test_route_message_event.py +++ b/tests/orchestrator/test_route_message_event.py @@ -12,12 +12,12 @@ import pytest -from agentpool.agents.events import UserMessageInsertedEvent -from agentpool.orchestrator.core import EventBus, SessionController, SessionState +from wolfharness.agents.events import UserMessageInsertedEvent +from wolfharness.orchestrator.core import EventBus, SessionController, SessionState if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit diff --git a/tests/orchestrator/test_run_event_agent_name.py b/tests/orchestrator/test_run_event_agent_name.py index cf9118079..db04745b3 100644 --- a/tests/orchestrator/test_run_event_agent_name.py +++ b/tests/orchestrator/test_run_event_agent_name.py @@ -16,16 +16,16 @@ import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( RunErrorEvent, RunStartedEvent, StreamCompleteEvent, ) -from agentpool.lifecycle.comm_channel import DirectChannel -from agentpool.lifecycle.journal import MemoryJournal -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.run import RunHandle -from agentpool.orchestrator.turn import Turn +from wolfharness.lifecycle.comm_channel import DirectChannel +from wolfharness.lifecycle.journal import MemoryJournal +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.run import RunHandle +from wolfharness.orchestrator.turn import Turn pytestmark = pytest.mark.unit @@ -71,7 +71,7 @@ def _make_handle( Returns (handle, event_bus) so the caller can inspect published events. """ - from agentpool.orchestrator.core import SessionState + from wolfharness.orchestrator.core import SessionState agent = MagicMock() agent.name = agent_name diff --git a/tests/orchestrator/test_run_failure_context_redflag.py b/tests/orchestrator/test_run_failure_context_redflag.py index d27ef3a0c..7094e2716 100644 --- a/tests/orchestrator/test_run_failure_context_redflag.py +++ b/tests/orchestrator/test_run_failure_context_redflag.py @@ -13,9 +13,9 @@ import pytest -from agentpool import AgentPool, AgentsManifest, NativeAgentConfig -from agentpool.agents.native_agent.turn import NativeTurn -from agentpool.lifecycle.types import DeliveryMode +from wolfharness import AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness.agents.native_agent.turn import NativeTurn +from wolfharness.lifecycle.types import DeliveryMode pytestmark = pytest.mark.integration diff --git a/tests/orchestrator/test_run_handle.py b/tests/orchestrator/test_run_handle.py index 6660cde0f..c7a91bca4 100644 --- a/tests/orchestrator/test_run_handle.py +++ b/tests/orchestrator/test_run_handle.py @@ -27,19 +27,19 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import ( +from wolfharness import Agent +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import ( RunErrorEvent, StreamCompleteEvent, ) -from agentpool.lifecycle import RunOutcome -from agentpool.lifecycle.comm_channel import DirectChannel -from agentpool.lifecycle.journal import MemoryJournal -from agentpool.messaging import ChatMessage, MessageHistory -from agentpool.orchestrator.core import EventBus, SessionState -from agentpool.orchestrator.run import RunHandle -from agentpool.orchestrator.turn import Turn +from wolfharness.lifecycle import RunOutcome +from wolfharness.lifecycle.comm_channel import DirectChannel +from wolfharness.lifecycle.journal import MemoryJournal +from wolfharness.messaging import ChatMessage, MessageHistory +from wolfharness.orchestrator.core import EventBus, SessionState +from wolfharness.orchestrator.run import RunHandle +from wolfharness.orchestrator.turn import Turn pytestmark = pytest.mark.unit @@ -190,7 +190,7 @@ async def test_steer_with_agent_run_emits_user_message_inserted_event() -> None: ``source="processed"`` instead of the fire-and-forget ``_schedule_user_message_emission()`` path. """ - from agentpool.agents.events.events import UserMessageInsertedEvent + from wolfharness.agents.events.events import UserMessageInsertedEvent bus = EventBus() handle = _make_run_handle(event_bus=bus) @@ -416,7 +416,7 @@ async def test_start_allows_event_bus_none_with_comm_channel() -> None: Regression test: _initialize_lifecycle_and_recovery() now creates a DirectChannel when event_bus is None, so start() must allow it. """ - from agentpool.lifecycle import DirectChannel, MemoryJournal + from wolfharness.lifecycle import DirectChannel, MemoryJournal agent = MagicMock() agent.create_turn = MagicMock(return_value=_StubTurn()) @@ -784,7 +784,7 @@ async def test_input_provider_contextvar_set_during_turn() -> None: MCP elicitation depends on this ContextVar. Without it, _current_input_provider.get() returns None during turn execution. """ - from agentpool.mcp_server.manager import _current_input_provider + from wolfharness.mcp_server.manager import _current_input_provider captured_provider: list[Any] = [] @@ -849,7 +849,7 @@ def test_start_sets_current_task() -> None: Without this, cancel() in _interrupt() gets None for current_task and cannot interrupt the running turn. """ - import agentpool.orchestrator.run as run_module + import wolfharness.orchestrator.run as run_module source = inspect.getsource(run_module.RunHandle.start) assert "current_task" in source, ( @@ -1036,7 +1036,7 @@ async def test_start_empty_prompt_no_staged_content_terminates_immediately() -> In the per-prompt model, an empty prompt with no staged_content means no turn is executed and the generator returns immediately. """ - from agentpool.agents.staged_content import StagedContent + from wolfharness.agents.staged_content import StagedContent agent = MagicMock() agent.create_turn = MagicMock(return_value=_StubTurn()) @@ -1070,7 +1070,7 @@ async def test_start_empty_list_no_staged_content_terminates_immediately() -> No An empty list is falsy and should be treated the same as an empty string — no turn executes. """ - from agentpool.agents.staged_content import StagedContent + from wolfharness.agents.staged_content import StagedContent agent = MagicMock() agent.create_turn = MagicMock(return_value=_StubTurn()) @@ -1104,7 +1104,7 @@ async def test_start_empty_list_with_staged_content_executes_turn() -> None: consume the staged content. Without this, skill instructions are silently discarded (issue #284). """ - from agentpool.agents.staged_content import StagedContent + from wolfharness.agents.staged_content import StagedContent staged = StagedContent() staged.add_text("IMPORTANT_SKILL_DIRECTIVE") @@ -1354,7 +1354,7 @@ async def test_lifecycle_dimensions_not_closed_when_run_handle_terminates() -> N In the per-prompt model, lifecycle dimensions are session-owned. RunHandle.close() only sets complete_event and clears steer_callback. """ - from agentpool.lifecycle import DirectChannel, MemoryJournal + from wolfharness.lifecycle import DirectChannel, MemoryJournal journal = MemoryJournal() comm_channel = DirectChannel(journal) @@ -1447,8 +1447,8 @@ async def test_standalone_session_without_event_bus_executes_turn() -> None: to fail in _execute_turn(). Now a DirectChannel is created and start() allows event_bus=None when session._comm_channel is set. """ - from agentpool.lifecycle import DirectChannel, MemoryJournal - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.lifecycle import DirectChannel, MemoryJournal + from wolfharness.orchestrator.session_controller import SessionState agent = MagicMock() agent.create_turn = MagicMock(return_value=_StubTurn(events=[_stream_complete_event()])) @@ -1493,8 +1493,8 @@ async def test_feedback_queue_drained_on_new_run_handle_start() -> None: The fix drains feedback_queue in start() before the turn begins, routing messages to queued_steer_messages via self.steer(). """ - from agentpool.lifecycle import DirectChannel, Feedback, MemoryJournal - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.lifecycle import DirectChannel, Feedback, MemoryJournal + from wolfharness.orchestrator.session_controller import SessionState agent = MagicMock() agent.create_turn = MagicMock(return_value=_StubTurn()) @@ -1541,8 +1541,8 @@ async def test_multiple_steer_messages_drained_fifo_from_feedback_queue() -> Non all their steer messages should be enqueued to feedback_queue and drained in FIFO order when the next RunHandle starts. """ - from agentpool.lifecycle import DirectChannel, Feedback, MemoryJournal - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.lifecycle import DirectChannel, Feedback, MemoryJournal + from wolfharness.orchestrator.session_controller import SessionState agent = MagicMock() agent.create_turn = MagicMock(return_value=_StubTurn()) @@ -1604,9 +1604,9 @@ async def test_empty_prompt_drains_feedback_queue_but_messages_unprocessed() -> queued_steer_messages after start() returns and re-enqueue any unprocessed messages back to feedback_queue for the next RunHandle. """ - from agentpool.agents.staged_content import StagedContent - from agentpool.lifecycle import DirectChannel, Feedback, MemoryJournal - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.agents.staged_content import StagedContent + from wolfharness.lifecycle import DirectChannel, Feedback, MemoryJournal + from wolfharness.orchestrator.session_controller import SessionState agent = MagicMock() agent.create_turn = MagicMock(return_value=_StubTurn()) @@ -1659,8 +1659,8 @@ async def test_feedback_queue_drains_multimodal_content_blocks() -> None: text), the Feedback object has content_blocks set instead of content. The draining code should handle both paths. """ - from agentpool.lifecycle import DirectChannel, Feedback, MemoryJournal - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.lifecycle import DirectChannel, Feedback, MemoryJournal + from wolfharness.orchestrator.session_controller import SessionState agent = MagicMock() agent.create_turn = MagicMock(return_value=_StubTurn()) diff --git a/tests/orchestrator/test_run_lifecycle.py b/tests/orchestrator/test_run_lifecycle.py index ffc0a5140..2c7c79887 100644 --- a/tests/orchestrator/test_run_lifecycle.py +++ b/tests/orchestrator/test_run_lifecycle.py @@ -14,13 +14,13 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, AgentPool -from agentpool.agents.base_agent import _current_run_ctx_var -from agentpool.agents.context import AgentRunContext -from agentpool.lifecycle import RunOutcome -from agentpool.orchestrator.core import SessionPool -from agentpool.orchestrator.metrics import MetricsCollector -from agentpool.orchestrator.run import RunHandle +from wolfharness import Agent, AgentPool +from wolfharness.agents.base_agent import _current_run_ctx_var +from wolfharness.agents.context import AgentRunContext +from wolfharness.lifecycle import RunOutcome +from wolfharness.orchestrator.core import SessionPool +from wolfharness.orchestrator.metrics import MetricsCollector +from wolfharness.orchestrator.run import RunHandle pytestmark = [pytest.mark.unit, pytest.mark.anyio] diff --git a/tests/orchestrator/test_run_status.py b/tests/orchestrator/test_run_status.py index e2aa23c95..5e7d6583a 100644 --- a/tests/orchestrator/test_run_status.py +++ b/tests/orchestrator/test_run_status.py @@ -1,4 +1,4 @@ -"""Tests for the RunState and RunOutcome enums in agentpool.lifecycle.types.""" +"""Tests for the RunState and RunOutcome enums in wolfharness.lifecycle.types.""" from __future__ import annotations @@ -6,7 +6,7 @@ import pytest -from agentpool.lifecycle import RunOutcome, RunState +from wolfharness.lifecycle import RunOutcome, RunState pytestmark = pytest.mark.unit diff --git a/tests/orchestrator/test_runhandle_emission.py b/tests/orchestrator/test_runhandle_emission.py index 1b68c5e58..e1e95738e 100644 --- a/tests/orchestrator/test_runhandle_emission.py +++ b/tests/orchestrator/test_runhandle_emission.py @@ -27,12 +27,12 @@ import pytest -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import UserMessageInsertedEvent -from agentpool.lifecycle.comm_channel import DirectChannel -from agentpool.lifecycle.journal import MemoryJournal -from agentpool.orchestrator.core import SessionState -from agentpool.orchestrator.run import RunHandle +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import UserMessageInsertedEvent +from wolfharness.lifecycle.comm_channel import DirectChannel +from wolfharness.lifecycle.journal import MemoryJournal +from wolfharness.orchestrator.core import SessionState +from wolfharness.orchestrator.run import RunHandle pytestmark = pytest.mark.unit diff --git a/tests/orchestrator/test_session_controller.py b/tests/orchestrator/test_session_controller.py index 127d6eca4..1a037ae27 100644 --- a/tests/orchestrator/test_session_controller.py +++ b/tests/orchestrator/test_session_controller.py @@ -13,19 +13,19 @@ import pytest -from agentpool.lifecycle.types import DeliveryMode -from agentpool.orchestrator.core import ( +from tests._controller_helpers import send_via_controller +from wolfharness.lifecycle.types import DeliveryMode +from wolfharness.orchestrator.core import ( DEFAULT_SESSION_TTL_SECONDS, EventBus, SessionController, SessionState, ) -from agentpool.orchestrator.run import RunHandle -from tests._controller_helpers import send_via_controller +from wolfharness.orchestrator.run import RunHandle if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit @@ -116,7 +116,7 @@ async def test_list_sessions_returns_session_info( controller: SessionController, ) -> None: """list_sessions returns SessionInfo DTOs for all active sessions.""" - from agentpool_server.opencode_server.models.session_info import SessionInfo + from wolfharness_server.opencode_server.models.session_info import SessionInfo await controller.get_or_create_session("sess-1", agent_name="agent-a") await controller.get_or_create_session("sess-2", agent_name="agent-b") @@ -452,7 +452,7 @@ async def test_steer_followup_inside_request_lock(minimal_pool: AgentPool) -> No Without this, current_run_id can be cleared between the check and the steer()/followup() call, causing silent message drops. """ - from agentpool.orchestrator.core import SessionController + from wolfharness.orchestrator.core import SessionController controller = SessionController(pool=minimal_pool) controller._event_bus = EventBus() @@ -498,7 +498,7 @@ def test_background_task_strong_reference() -> None: Without a strong reference, Python's GC can destroy the task mid-execution. """ - import agentpool.orchestrator.core as core_module + import wolfharness.orchestrator.core as core_module source = inspect.getsource(core_module.SessionController._start_run_handle) assert "_background_tasks" in source, ( @@ -543,7 +543,7 @@ def test_background_tasks_initialized_in_init(minimal_pool: AgentPool) -> None: Without early initialization, the first call to _start_run_handle hits a hasattr check that could mask bugs. """ - from agentpool.orchestrator.core import SessionController + from wolfharness.orchestrator.core import SessionController controller = SessionController(pool=minimal_pool) assert hasattr(controller, "_background_tasks"), ( @@ -559,7 +559,7 @@ def test_background_task_callback_is_named_function() -> None: """ import re - import agentpool.orchestrator.core as core_module + import wolfharness.orchestrator.core as core_module source = inspect.getsource(core_module.SessionController._start_run_handle) # Should NOT contain the lambda tuple pattern diff --git a/tests/orchestrator/test_session_lifecycle.py b/tests/orchestrator/test_session_lifecycle.py index 7556b9495..45d7c4b55 100644 --- a/tests/orchestrator/test_session_lifecycle.py +++ b/tests/orchestrator/test_session_lifecycle.py @@ -16,23 +16,23 @@ import pytest -from agentpool.agents.events import RunStartedEvent -from agentpool.orchestrator.core import ( +from wolfharness.agents.events import RunStartedEvent +from wolfharness.orchestrator.core import ( EventBus, SessionController, SessionLifecyclePolicy, SessionPool, SessionState, ) -from agentpool.orchestrator.run import RunHandle -from agentpool.sessions.models import PendingDeferredCall, SessionData +from wolfharness.orchestrator.run import RunHandle +from wolfharness.sessions.models import PendingDeferredCall, SessionData if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool import AgentPool - from agentpool.agents.context import AgentRunContext + from wolfharness import AgentPool + from wolfharness.agents.context import AgentRunContext pytestmark = pytest.mark.unit @@ -303,7 +303,7 @@ async def _patched_acquire(self: asyncio.Lock, *args: Any, **kwargs: Any) -> boo if TYPE_CHECKING: - from agentpool.agents.context import AgentRunContext + from wolfharness.agents.context import AgentRunContext @pytest.fixture @@ -380,7 +380,7 @@ async def test_close_session_releases_lock_on_cancelled(minimal_pool: AgentPool) Without try/finally, CancelledError during complete_event.wait() skips the lock release, leaving the session permanently locked. """ - from agentpool.orchestrator.core import SessionController + from wolfharness.orchestrator.core import SessionController controller_cs = SessionController(pool=minimal_pool) controller_cs._event_bus = EventBus() @@ -435,9 +435,9 @@ async def test_close_session_after_cancel(minimal_pool: AgentPool) -> None: _turn_complete_event, and the turn completes — releasing turn_lock. close_session() should acquire turn_lock quickly and return. """ - from agentpool.agents.events import StreamCompleteEvent - from agentpool.messaging import ChatMessage - from agentpool.orchestrator.turn import Turn + from wolfharness.agents.events import StreamCompleteEvent + from wolfharness.messaging import ChatMessage + from wolfharness.orchestrator.turn import Turn class _BlockingTurn(Turn): """Turn that blocks until run_ctx.cancelled, then returns.""" diff --git a/tests/orchestrator/test_session_pool.py b/tests/orchestrator/test_session_pool.py index c144c199f..8a867fdd7 100644 --- a/tests/orchestrator/test_session_pool.py +++ b/tests/orchestrator/test_session_pool.py @@ -10,12 +10,12 @@ import pytest -from agentpool.messaging import ChatMessage +from wolfharness.messaging import ChatMessage if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool.orchestrator.core import SessionPool + from wolfharness import AgentPool + from wolfharness.orchestrator.core import SessionPool pytestmark = pytest.mark.unit @@ -364,8 +364,8 @@ async def test_cache_copy_messages_invalidates_target_cache( # RunHandle delegation tests (feature-flag gated) # --------------------------------------------------------------------------- -from agentpool.lifecycle import RunState # noqa: E402 -from agentpool.orchestrator.run import RunHandle # noqa: E402 +from wolfharness.lifecycle import RunState # noqa: E402 +from wolfharness.orchestrator.run import RunHandle # noqa: E402 def _make_mock_agent() -> MagicMock: diff --git a/tests/orchestrator/test_session_pool_input_provider.py b/tests/orchestrator/test_session_pool_input_provider.py index 5b0ac5808..3853aad04 100644 --- a/tests/orchestrator/test_session_pool_input_provider.py +++ b/tests/orchestrator/test_session_pool_input_provider.py @@ -12,17 +12,17 @@ import pytest -from agentpool.agents.events import RunStartedEvent, StreamCompleteEvent -from agentpool.messaging import ChatMessage -from agentpool.ui.base import InputProvider +from wolfharness.agents.events import RunStartedEvent, StreamCompleteEvent +from wolfharness.messaging import ChatMessage +from wolfharness.ui.base import InputProvider if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool import AgentPool - from agentpool.agents.context import AgentRunContext - from agentpool.orchestrator.core import SessionPool + from wolfharness import AgentPool + from wolfharness.agents.context import AgentRunContext + from wolfharness.orchestrator.core import SessionPool pytestmark = pytest.mark.unit diff --git a/tests/orchestrator/test_session_pool_public_api.py b/tests/orchestrator/test_session_pool_public_api.py index 3aa7eea18..8725e332c 100644 --- a/tests/orchestrator/test_session_pool_public_api.py +++ b/tests/orchestrator/test_session_pool_public_api.py @@ -11,15 +11,15 @@ import pytest -from agentpool.agents.events import RunErrorEvent, StreamCompleteEvent -from agentpool.lifecycle.types import DeliveryMode -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.session_controller import SessionNotFoundError +from wolfharness.agents.events import RunErrorEvent, StreamCompleteEvent +from wolfharness.lifecycle.types import DeliveryMode +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.session_controller import SessionNotFoundError if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool.orchestrator.core import SessionPool + from wolfharness import AgentPool + from wolfharness.orchestrator.core import SessionPool pytestmark = pytest.mark.unit diff --git a/tests/orchestrator/test_sessionpool_integration.py b/tests/orchestrator/test_sessionpool_integration.py index 5ce95649e..cf9d92e06 100644 --- a/tests/orchestrator/test_sessionpool_integration.py +++ b/tests/orchestrator/test_sessionpool_integration.py @@ -51,22 +51,22 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, AgentPool, AgentsManifest, NativeAgentConfig -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import SpawnSessionStart, StreamCompleteEvent -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool.hooks import AgentHooks, CallableHook, HookResult -from agentpool.lifecycle.types import DeliveryMode -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventBus, SessionState -from agentpool.orchestrator.run import RunHandle -from agentpool.tools.base import Tool -from agentpool_server.opencode_server.models.parts import ( +from wolfharness import Agent, AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import SpawnSessionStart, StreamCompleteEvent +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.hooks import AgentHooks, CallableHook, HookResult +from wolfharness.lifecycle.types import DeliveryMode +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventBus, SessionState +from wolfharness.orchestrator.run import RunHandle +from wolfharness.tools.base import Tool +from wolfharness_server.opencode_server.models.parts import ( ToolPart, ToolStateCompleted, ToolStateRunning, ) -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -74,7 +74,7 @@ if TYPE_CHECKING: from collections.abc import Sequence - from agentpool.skills.skill import Skill + from wolfharness.skills.skill import Skill class MockServerState: @@ -96,7 +96,7 @@ async def broadcast_event(self, event: Any) -> None: self.events.append(event) def resolve_default_model_info(self) -> tuple[str, str]: - return "default", "agentpool" + return "default", "wolfharness" class MockMCPCapability(FunctionToolsetCapability): @@ -216,7 +216,7 @@ async def test_agent_level_mcp_not_inherited_by_child() -> None: # We test at the config level — we don't need to actually connect. # The key assertion is that the parent's MCPManager is dedicated # (not pool.mcp), and the child's IS pool.mcp. - from agentpool_config.mcp_server import StdioMCPServerConfig + from wolfharness_config.mcp_server import StdioMCPServerConfig parent_config = NativeAgentConfig( name="parent_agent", @@ -458,7 +458,7 @@ async def test_toolset_cache_exists_on_mcp_manager() -> None: so repeated calls reuse the same underlying connection. The ``MCP`` wrapper instances remain distinct. """ - from agentpool.mcp_server.manager import MCPManager + from wolfharness.mcp_server.manager import MCPManager manager = MCPManager(name="test") assert hasattr(manager, "_toolset_cache") @@ -474,8 +474,8 @@ async def test_get_capabilities_caches_toolset_by_client_id() -> None: with the same underlying ``MCPToolset`` instance (cached by ``client_id``). The MCP wrappers themselves are distinct. """ - from agentpool.mcp_server.manager import MCPManager - from agentpool_config.mcp_server import StdioMCPServerConfig + from wolfharness.mcp_server.manager import MCPManager + from wolfharness_config.mcp_server import StdioMCPServerConfig manager = MCPManager( servers=[ @@ -730,7 +730,7 @@ async def test_e2e_reasoning_events_through_sessionpool() -> None: ) event_types = [type(e).__name__ for e in server_state.events] print(f"Broadcast events: {event_types}") - from agentpool_server.opencode_server.models import PartUpdatedEvent + from wolfharness_server.opencode_server.models import PartUpdatedEvent part_events = [e for e in server_state.events if isinstance(e, PartUpdatedEvent)] assert len(part_events) > 0, ( @@ -796,7 +796,7 @@ def __init__(self): async def get_or_create_session(self, session_id, agent_name=None, **metadata): if session_id not in self._sessions: - from agentpool.orchestrator.core import SessionState + from wolfharness.orchestrator.core import SessionState state = SessionState(session_id=session_id, agent_name=agent_name or "default") self._sessions[session_id] = state @@ -1095,7 +1095,7 @@ def _fn(**kwargs: Any) -> HookResult: def _make_run_handle(agent: Agent[Any, Any], run_ctx: AgentRunContext) -> RunHandle: """Create a RunHandle wired for the SessionPool path.""" - from agentpool.lifecycle import DirectChannel, MemoryJournal + from wolfharness.lifecycle import DirectChannel, MemoryJournal event_bus = EventBus() session = SessionState(session_id="test-session", agent_name="test-agent") @@ -1177,7 +1177,7 @@ async def _consume() -> None: await consumer_task pre_turn_count = sum((1 for name, _ in hook_calls if name == "pre_turn")) assert pre_turn_count == 1, "pre_turn must fire in turn 1" - from agentpool.agents.native_agent.turn import NativeTurn + from wolfharness.agents.native_agent.turn import NativeTurn turn = NativeTurn( agent=agent, prompts=["second prompt"], run_ctx=run_ctx, message_history=[], hooks=hooks diff --git a/tests/orchestrator/test_sessionpool_reasoning_redflag.py b/tests/orchestrator/test_sessionpool_reasoning_redflag.py index c868bc1ce..b80ec52e4 100644 --- a/tests/orchestrator/test_sessionpool_reasoning_redflag.py +++ b/tests/orchestrator/test_sessionpool_reasoning_redflag.py @@ -15,10 +15,10 @@ ) import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( RunStartedEvent, ) -from agentpool.orchestrator.core import EventBus +from wolfharness.orchestrator.core import EventBus pytestmark = pytest.mark.unit @@ -149,7 +149,7 @@ async def test_eventbus_with_subagent_wrapping(): reasoning events that can be extracted. """ - from agentpool.agents.events import SubAgentEvent + from wolfharness.agents.events import SubAgentEvent event_bus = EventBus() parent_session = "parent" diff --git a/tests/orchestrator/test_staged_content_integration.py b/tests/orchestrator/test_staged_content_integration.py index 4bff93d9f..f120ebc62 100644 --- a/tests/orchestrator/test_staged_content_integration.py +++ b/tests/orchestrator/test_staged_content_integration.py @@ -25,18 +25,18 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, AgentPool -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events.events import StreamCompleteEvent -from agentpool.agents.native_agent.turn import NativeTurn -from agentpool.lifecycle import DirectChannel, MemoryJournal -from agentpool.orchestrator.core import EventBus, SessionState -from agentpool.orchestrator.run import RunHandle from tests._controller_helpers import send_via_controller +from wolfharness import Agent, AgentPool +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events.events import StreamCompleteEvent +from wolfharness.agents.native_agent.turn import NativeTurn +from wolfharness.lifecycle import DirectChannel, MemoryJournal +from wolfharness.orchestrator.core import EventBus, SessionState +from wolfharness.orchestrator.run import RunHandle if TYPE_CHECKING: - from agentpool.agents.events.events import RichAgentStreamEvent + from wolfharness.agents.events.events import RichAgentStreamEvent pytestmark = pytest.mark.unit @@ -194,7 +194,7 @@ async def test_receive_request_empty_list_not_converted_to_string(minimal_pool: followup()/steer() without stringification. The initial prompt is routed through followup() (D17), and start() is called with "". """ - from agentpool.orchestrator.core import SessionController + from wolfharness.orchestrator.core import SessionController controller = SessionController(pool=minimal_pool) event_bus = EventBus() diff --git a/tests/orchestrator/test_steer_background_acp_integration.py b/tests/orchestrator/test_steer_background_acp_integration.py index a278856bd..d8b95a854 100644 --- a/tests/orchestrator/test_steer_background_acp_integration.py +++ b/tests/orchestrator/test_steer_background_acp_integration.py @@ -13,12 +13,12 @@ import pytest -from agentpool.agents.events.events import UserMessageInsertedEvent -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.agents.events.events import UserMessageInsertedEvent +from wolfharness_server.acp_server.event_converter import ACPEventConverter if TYPE_CHECKING: - from agentpool.delegation.pool import AgentPool + from wolfharness.delegation.pool import AgentPool pytestmark = [pytest.mark.integration] @@ -51,8 +51,8 @@ async def test_steer_from_background_task_acp_converter( async def _blocking_create_turn(*args: Any, **kwargs: Any) -> Any: await release.wait() - from agentpool.agents.events.events import StreamCompleteEvent - from agentpool.messaging.messagenode import ChatMessage + from wolfharness.agents.events.events import StreamCompleteEvent + from wolfharness.messaging.messagenode import ChatMessage return StreamCompleteEvent(message=ChatMessage(role="assistant", content="done")) diff --git a/tests/orchestrator/test_steer_message_loss.py b/tests/orchestrator/test_steer_message_loss.py index 70e9992e4..26ee08ca9 100644 --- a/tests/orchestrator/test_steer_message_loss.py +++ b/tests/orchestrator/test_steer_message_loss.py @@ -24,14 +24,14 @@ import anyio import pytest -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import RunStartedEvent, StreamCompleteEvent -from agentpool.lifecycle import Feedback -from agentpool.lifecycle.comm_channel import DirectChannel -from agentpool.lifecycle.journal import MemoryJournal -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventBus, SessionState -from agentpool.orchestrator.run import RunHandle +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import RunStartedEvent, StreamCompleteEvent +from wolfharness.lifecycle import Feedback +from wolfharness.lifecycle.comm_channel import DirectChannel +from wolfharness.lifecycle.journal import MemoryJournal +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventBus, SessionState +from wolfharness.orchestrator.run import RunHandle pytestmark = [pytest.mark.unit] @@ -271,7 +271,7 @@ async def test_start_drain_feedback_queue_to_queued_steer_messages() -> None: The messages in queued_steer_messages are later drained by NativeTurn.execute() via drain_queued_steer_messages(). """ - from agentpool.orchestrator.turn import Turn + from wolfharness.orchestrator.turn import Turn class _CapturingStubTurn(Turn): """Stub turn that captures prompts and simulates drain.""" diff --git a/tests/orchestrator/test_steer_queue_events.py b/tests/orchestrator/test_steer_queue_events.py index da0d77768..fcbb481ca 100644 --- a/tests/orchestrator/test_steer_queue_events.py +++ b/tests/orchestrator/test_steer_queue_events.py @@ -21,13 +21,13 @@ import anyio import pytest -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import RunErrorEvent, RunStartedEvent, StreamCompleteEvent -from agentpool.lifecycle.comm_channel import DirectChannel -from agentpool.lifecycle.journal import MemoryJournal -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventBus, SessionState -from agentpool.orchestrator.run import RunHandle +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import RunErrorEvent, RunStartedEvent, StreamCompleteEvent +from wolfharness.lifecycle.comm_channel import DirectChannel +from wolfharness.lifecycle.journal import MemoryJournal +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventBus, SessionState +from wolfharness.orchestrator.run import RunHandle pytestmark = [pytest.mark.integration, pytest.mark.anyio] diff --git a/tests/orchestrator/test_steer_user_message.py b/tests/orchestrator/test_steer_user_message.py index cf4b38d09..7897b92d8 100644 --- a/tests/orchestrator/test_steer_user_message.py +++ b/tests/orchestrator/test_steer_user_message.py @@ -19,12 +19,12 @@ import pytest -from agentpool.agents.context import AgentRunContext -from agentpool.agents.events import UserMessageInsertedEvent -from agentpool.lifecycle.comm_channel import DirectChannel -from agentpool.lifecycle.journal import MemoryJournal -from agentpool.orchestrator.core import SessionState -from agentpool.orchestrator.run import RunHandle +from wolfharness.agents.context import AgentRunContext +from wolfharness.agents.events import UserMessageInsertedEvent +from wolfharness.lifecycle.comm_channel import DirectChannel +from wolfharness.lifecycle.journal import MemoryJournal +from wolfharness.orchestrator.core import SessionState +from wolfharness.orchestrator.run import RunHandle pytestmark = pytest.mark.unit diff --git a/tests/orchestrator/test_streaming_redflag_tool_calls.py b/tests/orchestrator/test_streaming_redflag_tool_calls.py index 43b5e1558..cce7f9daf 100644 --- a/tests/orchestrator/test_streaming_redflag_tool_calls.py +++ b/tests/orchestrator/test_streaming_redflag_tool_calls.py @@ -18,14 +18,14 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import AgentPool, AgentsManifest, NativeAgentConfig -from agentpool.agents.base_agent import _in_turn_context -from agentpool.agents.events import ( +from wolfharness import AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness.agents.base_agent import _in_turn_context +from wolfharness.agents.events import ( StreamCompleteEvent, ToolCallCompleteEvent, ToolCallStartEvent, ) -from agentpool.tools import Tool +from wolfharness.tools import Tool if TYPE_CHECKING: @@ -105,7 +105,7 @@ async def test_tool_call_only_response_has_no_text_deltas() -> None: # Categorise events for analysis event_types = [type(e).__name__ for e in events] - # Native agent emits pydantic-ai PartDeltaEvent directly (not agentpool's subclass) + # Native agent emits pydantic-ai PartDeltaEvent directly (not wolfharness's subclass) text_deltas = [e for e in events if isinstance(e, PyAIPartDeltaEvent)] tool_call_starts = [e for e in events if isinstance(e, ToolCallStartEvent)] tool_call_completes = [e for e in events if isinstance(e, ToolCallCompleteEvent)] @@ -232,7 +232,7 @@ async def test_text_response_yields_deltas() -> None: event_types = [type(e).__name__ for e in events] print(f"\nEvents with text response: {event_types}") - # Native agent emits pydantic-ai PartDeltaEvent directly (not agentpool's subclass) + # Native agent emits pydantic-ai PartDeltaEvent directly (not wolfharness's subclass) text_deltas = [e for e in events if isinstance(e, PyAIPartDeltaEvent)] stream_completes = [e for e in events if isinstance(e, StreamCompleteEvent)] diff --git a/tests/orchestrator/test_subagent_events.py b/tests/orchestrator/test_subagent_events.py index a75e80ebd..8c0e3ccf9 100644 --- a/tests/orchestrator/test_subagent_events.py +++ b/tests/orchestrator/test_subagent_events.py @@ -23,21 +23,21 @@ import pytest -from agentpool import AgentPool, AgentsManifest, NativeAgentConfig -from agentpool.agents.events import ( +from wolfharness import AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness.agents.events import ( RunErrorEvent, SpawnSessionStart, StreamCompleteEvent, ) -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventEnvelope -from agentpool_server.opencode_server.models.parts import ( +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventEnvelope +from wolfharness_server.opencode_server.models.parts import ( ToolPart, ToolStateCompleted, ToolStateError, ToolStateRunning, ) -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -84,7 +84,7 @@ async def broadcast_event(self, event: Any) -> None: self.events.append(event) def resolve_default_model_info(self) -> tuple[str, str]: - return "default", "agentpool" + return "default", "wolfharness" def _get_last_assistant_message(state: MockServerState, session_id: str) -> Any | None: diff --git a/tests/orchestrator/test_user_message_display_integration.py b/tests/orchestrator/test_user_message_display_integration.py index 07b3bff96..761033117 100644 --- a/tests/orchestrator/test_user_message_display_integration.py +++ b/tests/orchestrator/test_user_message_display_integration.py @@ -27,13 +27,13 @@ from pydantic_ai.models.function import AgentInfo, FunctionModel import pytest -from agentpool import AgentPool, AgentsManifest, NativeAgentConfig -from agentpool.agents.events.events import ( +from wolfharness import AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness.agents.events.events import ( StreamCompleteEvent, UserMessageInsertedEvent, ) -from agentpool.lifecycle.types import DeliveryMode -from agentpool.orchestrator.event_bus import EventEnvelope +from wolfharness.lifecycle.types import DeliveryMode +from wolfharness.orchestrator.event_bus import EventEnvelope if TYPE_CHECKING: diff --git a/tests/orchestrator/test_user_message_inserted_integration.py b/tests/orchestrator/test_user_message_inserted_integration.py index 1e4770271..d9a174dda 100644 --- a/tests/orchestrator/test_user_message_inserted_integration.py +++ b/tests/orchestrator/test_user_message_inserted_integration.py @@ -15,21 +15,21 @@ import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( RunStartedEvent, StreamCompleteEvent, ToolCallStartEvent, UserMessageInsertedEvent, ) -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.event_bus import EventEnvelope -from agentpool.orchestrator.turn import Turn -from agentpool.utils.identifiers import ascending +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.event_bus import EventEnvelope +from wolfharness.orchestrator.turn import Turn +from wolfharness.utils.identifiers import ascending if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool.agents.context import AgentRunContext + from wolfharness import AgentPool + from wolfharness.agents.context import AgentRunContext pytestmark = [pytest.mark.integration, pytest.mark.anyio] diff --git a/tests/phase8_merge_queue_removal_test.py b/tests/phase8_merge_queue_removal_test.py index 73fca95c6..e90412a58 100644 --- a/tests/phase8_merge_queue_removal_test.py +++ b/tests/phase8_merge_queue_removal_test.py @@ -10,7 +10,7 @@ import pytest -from agentpool.utils.streams import FileChange, FileOpsTracker +from wolfharness.utils.streams import FileChange, FileOpsTracker def test_merge_queue_into_iterator_raises_import_error() -> None: @@ -22,7 +22,7 @@ def test_merge_queue_into_iterator_raises_import_error() -> None: - Other stream utilities should still work """ with pytest.raises(ImportError): - from agentpool.utils.streams import merge_queue_into_iterator # noqa: F401 + from wolfharness.utils.streams import merge_queue_into_iterator # noqa: F401 # Verify other utilities still work assert FileChange is not None diff --git a/tests/phase8_shutdown_race_condition_test.py b/tests/phase8_shutdown_race_condition_test.py index cf75fb1f8..cb82b1b14 100644 --- a/tests/phase8_shutdown_race_condition_test.py +++ b/tests/phase8_shutdown_race_condition_test.py @@ -9,7 +9,7 @@ import anyio import pytest -from agentpool import AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness import AgentPool, AgentsManifest, NativeAgentConfig @pytest.mark.asyncio diff --git a/tests/phase8_subagent_cascade_test.py b/tests/phase8_subagent_cascade_test.py index fa5134aa4..dbeaafb5a 100644 --- a/tests/phase8_subagent_cascade_test.py +++ b/tests/phase8_subagent_cascade_test.py @@ -9,7 +9,7 @@ import anyio import pytest -from agentpool import AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness import AgentPool, AgentsManifest, NativeAgentConfig @pytest.mark.asyncio diff --git a/tests/prompts/test_instructions_types.py b/tests/prompts/test_instructions_types.py index ea3aa56f6..462a3e8a1 100644 --- a/tests/prompts/test_instructions_types.py +++ b/tests/prompts/test_instructions_types.py @@ -8,7 +8,7 @@ import pytest # Test that all types can be imported (will fail if they don't exist) -from agentpool.prompts.instructions import ( +from wolfharness.prompts.instructions import ( AgentContextInstruction, BothContextsInstruction, InstructionFunc, @@ -26,7 +26,7 @@ from pydantic_ai import RunContext - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext class TestSimpleInstruction: diff --git a/tests/prompts/test_prompt_manager.py b/tests/prompts/test_prompt_manager.py index ae7df4c51..b16b50a6d 100644 --- a/tests/prompts/test_prompt_manager.py +++ b/tests/prompts/test_prompt_manager.py @@ -3,8 +3,8 @@ import pytest import yaml -from agentpool import AgentsManifest -from agentpool.prompts.manager import PromptManager +from wolfharness import AgentsManifest +from wolfharness.prompts.manager import PromptManager pytestmark = pytest.mark.unit diff --git a/tests/prompts/test_sys_prompts.py b/tests/prompts/test_sys_prompts.py index 578e6e857..deed12eba 100644 --- a/tests/prompts/test_sys_prompts.py +++ b/tests/prompts/test_sys_prompts.py @@ -3,7 +3,7 @@ from pydantic import BaseModel import pytest -from agentpool import Agent +from wolfharness import Agent pytestmark = pytest.mark.unit diff --git a/tests/providers/test_multimodal.py b/tests/providers/test_multimodal.py index 400ec2fd3..bfb34c5cb 100644 --- a/tests/providers/test_multimodal.py +++ b/tests/providers/test_multimodal.py @@ -5,7 +5,7 @@ from pydantic_ai import ImageUrl import pytest -from agentpool import Agent +from wolfharness import Agent @pytest.mark.flaky(reruns=2) diff --git a/tests/providers/test_structured.py b/tests/providers/test_structured.py index 2f143747a..9b2d930a4 100644 --- a/tests/providers/test_structured.py +++ b/tests/providers/test_structured.py @@ -4,7 +4,7 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent +from wolfharness import Agent pytestmark = pytest.mark.unit diff --git a/tests/repomap/test_repomap_imports.py b/tests/repomap/test_repomap_imports.py index fd1a1dd67..363341547 100644 --- a/tests/repomap/test_repomap_imports.py +++ b/tests/repomap/test_repomap_imports.py @@ -15,13 +15,13 @@ REPOMAP_MODULES = [ - "agentpool.repomap.context", - "agentpool.repomap.core", - "agentpool.repomap.languages", - "agentpool.repomap.outline", - "agentpool.repomap.tags", - "agentpool.repomap.types", - "agentpool.repomap.utils", + "wolfharness.repomap.context", + "wolfharness.repomap.core", + "wolfharness.repomap.languages", + "wolfharness.repomap.outline", + "wolfharness.repomap.tags", + "wolfharness.repomap.types", + "wolfharness.repomap.utils", ] diff --git a/tests/resources/test_loading_resources.py b/tests/resources/test_loading_resources.py index 583bdad3a..249632c2f 100644 --- a/tests/resources/test_loading_resources.py +++ b/tests/resources/test_loading_resources.py @@ -4,8 +4,8 @@ from upathtools.filesystems import UnionFileSystem import yamling -from agentpool import AgentPool -from agentpool.models import AgentsManifest +from wolfharness import AgentPool +from wolfharness.models import AgentsManifest pytestmark = pytest.mark.integration diff --git a/tests/running/test_delegation.py b/tests/running/test_delegation.py index 4127cd548..328d03b58 100644 --- a/tests/running/test_delegation.py +++ b/tests/running/test_delegation.py @@ -6,16 +6,16 @@ import pytest -from agentpool.agents import Agent -from agentpool.agents.base_agent import BaseAgent # noqa: TC001 -from agentpool.running import NodeInjectionError, with_nodes +from wolfharness.agents import Agent +from wolfharness.agents.base_agent import BaseAgent # noqa: TC001 +from wolfharness.running import NodeInjectionError, with_nodes pytestmark = pytest.mark.unit if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool async def test_basic_injection(pool: AgentPool): diff --git a/tests/running/test_discovery.py b/tests/running/test_discovery.py index 200ffae2d..89eb4bd71 100644 --- a/tests/running/test_discovery.py +++ b/tests/running/test_discovery.py @@ -2,7 +2,7 @@ import pytest -from agentpool.running import NodeFunction, node_function +from wolfharness.running import NodeFunction, node_function pytestmark = pytest.mark.unit diff --git a/tests/running/test_executor.py b/tests/running/test_executor.py index 9527a4860..a0b5f6c66 100644 --- a/tests/running/test_executor.py +++ b/tests/running/test_executor.py @@ -6,9 +6,9 @@ import anyio import pytest -from agentpool import Agent # noqa: TC001 -from agentpool.running.discovery import node_function -from agentpool.running.executor import ( +from wolfharness import Agent # noqa: TC001 +from wolfharness.running.discovery import node_function +from wolfharness.running.executor import ( ExecutionError, _group_parallel, _sort_functions, diff --git a/tests/security/test_skill_security.py b/tests/security/test_skill_security.py index 4041fa9dd..1faa01ad8 100644 --- a/tests/security/test_skill_security.py +++ b/tests/security/test_skill_security.py @@ -17,8 +17,8 @@ import pytest from upathtools import UPath -from agentpool.skills.exceptions import SecurityError -from agentpool.skills.uri_resolver import ResolvedSkillURI +from wolfharness.skills.exceptions import SecurityError +from wolfharness.skills.uri_resolver import ResolvedSkillURI pytestmark = pytest.mark.unit @@ -31,7 +31,7 @@ def _make_skill(skill_dir): """Create a Skill object from a filesystem directory.""" - from agentpool.skills.skill import Skill + from wolfharness.skills.skill import Skill return Skill( name="test-skill", @@ -92,7 +92,7 @@ def local_skill(skill_with_references): @pytest.mark.security async def test_local_path_traversal_absolute_path(local_skill): """Test path traversal with absolute path attempt: /etc/passwd.""" - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness_toolsets.builtin.skills import _load_reference_content with pytest.raises(SecurityError): await _load_reference_content(local_skill, "/etc/passwd") @@ -102,7 +102,7 @@ async def test_local_path_traversal_absolute_path(local_skill): @pytest.mark.security async def test_local_path_traversal_basic_dotdot(local_skill): """Test basic path traversal: ../../../etc/passwd.""" - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness_toolsets.builtin.skills import _load_reference_content with pytest.raises(SecurityError) as exc_info: await _load_reference_content(local_skill, "../../../etc/passwd") @@ -114,7 +114,7 @@ async def test_local_path_traversal_basic_dotdot(local_skill): @pytest.mark.security async def test_local_path_traversal_embedded(local_skill): """Test embedded path traversal: subdir/../../../etc/passwd.""" - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness_toolsets.builtin.skills import _load_reference_content with pytest.raises(SecurityError) as exc_info: await _load_reference_content(local_skill, "subdir/../../../etc/passwd") @@ -126,7 +126,7 @@ async def test_local_path_traversal_embedded(local_skill): @pytest.mark.security async def test_local_path_traversal_multiple_dotdot(local_skill): """Test multiple .. sequences: ../../../../../../../etc/passwd.""" - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness_toolsets.builtin.skills import _load_reference_content with pytest.raises(SecurityError) as exc_info: await _load_reference_content(local_skill, "../../../../../../../etc/passwd") @@ -138,7 +138,7 @@ async def test_local_path_traversal_multiple_dotdot(local_skill): @pytest.mark.security async def test_local_path_traversal_leading_dotdot(local_skill): """Test leading .. sequence: ../etc/passwd.""" - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness_toolsets.builtin.skills import _load_reference_content with pytest.raises(SecurityError) as exc_info: await _load_reference_content(local_skill, "../etc/passwd") @@ -150,8 +150,8 @@ async def test_local_path_traversal_leading_dotdot(local_skill): @pytest.mark.security async def test_local_path_traversal_mixed_separators(local_skill): r"""Test path traversal with mixed separators: ..\..\..\etc\passwd.""" - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content # On Unix, backslash is treated as literal character # This test verifies the path is rejected @@ -168,8 +168,8 @@ async def test_local_path_traversal_mixed_separators(local_skill): @pytest.mark.security async def test_local_url_encoded_traversal_percent_2f(local_skill): """Test URL-encoded path traversal: ..%2f..%2f..%2fetc%2fpasswd.""" - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content # _load_reference_content does not URL-decode before checking # This should fail as file not found (path still blocked) @@ -181,8 +181,8 @@ async def test_local_url_encoded_traversal_percent_2f(local_skill): @pytest.mark.security async def test_local_url_encoded_traversal_lowercase(local_skill): """Test URL-encoded with lowercase: ..%2f..%2fetc%2fpasswd.""" - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content with pytest.raises((SecurityError, ReferenceNotFoundError)): await _load_reference_content(local_skill, "..%2f..%2fetc%2fpasswd") @@ -192,8 +192,8 @@ async def test_local_url_encoded_traversal_lowercase(local_skill): @pytest.mark.security async def test_local_url_encoded_traversal_uppercase(local_skill): """Test URL-encoded with uppercase: ..%2F..%2Fetc%2Fpasswd.""" - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content with pytest.raises((SecurityError, ReferenceNotFoundError)): await _load_reference_content(local_skill, "..%2F..%2Fetc%2Fpasswd") @@ -203,8 +203,8 @@ async def test_local_url_encoded_traversal_uppercase(local_skill): @pytest.mark.security async def test_local_url_encoded_dot(local_skill): """Test URL-encoded dot: %2e%2e/%2e%2e/%2e%2e/etc/passwd.""" - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content # %2e is encoded dot, but _load_reference_content doesn't URL-decode with pytest.raises((SecurityError, ReferenceNotFoundError)): @@ -220,8 +220,8 @@ async def test_local_url_encoded_dot(local_skill): @pytest.mark.security async def test_local_null_byte_injection(local_skill): r"""Test null byte injection: file\x00.txt.""" - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content with pytest.raises((SecurityError, ReferenceNotFoundError)): await _load_reference_content(local_skill, "file\x00.txt") @@ -231,8 +231,8 @@ async def test_local_null_byte_injection(local_skill): @pytest.mark.security async def test_local_null_byte_injection_with_path(local_skill): r"""Test null byte injection with path: subdir/file\x00.txt.""" - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content with pytest.raises((SecurityError, ReferenceNotFoundError)): await _load_reference_content(local_skill, "subdir/file\x00.txt") @@ -242,8 +242,8 @@ async def test_local_null_byte_injection_with_path(local_skill): @pytest.mark.security async def test_local_null_byte_at_start(local_skill): r"""Test null byte at start of path: \x00file.txt.""" - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content with pytest.raises((SecurityError, ReferenceNotFoundError)): await _load_reference_content(local_skill, "\x00file.txt") @@ -263,8 +263,8 @@ async def test_local_symlink_to_outside_directory(skill_with_references): the references directory. The _load_reference_content should resolve the symlink and reject the path. """ - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content refs_dir = skill_with_references / "references" @@ -295,8 +295,8 @@ async def test_local_symlink_chain_traversal(skill_with_references): Creates a chain of symlinks where the final target is outside the allowed directory. """ - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content refs_dir = skill_with_references / "references" subdir = refs_dir / "subdir" @@ -478,8 +478,8 @@ def test_uri_multiple_null_bytes(): @pytest.mark.security async def test_local_empty_path(local_skill): """Test empty path handling.""" - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content # Empty path resolves to the skill directory itself — read_text fails # because it's a directory, not a file. @@ -504,8 +504,8 @@ def test_uri_empty_path(): @pytest.mark.security async def test_local_single_dot(local_skill): """Test single dot path: ./file.txt.""" - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content # Single dot should be allowed (refers to current directory) # But file doesn't exist, so ReferenceNotFoundError @@ -517,7 +517,7 @@ async def test_local_single_dot(local_skill): @pytest.mark.security async def test_local_dot_slash_prefix(local_skill): """Test dot slash prefix: ./references/guide.md.""" - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness_toolsets.builtin.skills import _load_reference_content # This should work - single dot is not traversal content = await _load_reference_content(local_skill, "references/guide.md") @@ -528,8 +528,8 @@ async def test_local_dot_slash_prefix(local_skill): @pytest.mark.security async def test_local_path_with_special_chars(local_skill): """Test path with special characters that are NOT traversal.""" - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content # These should be treated as literal filenames (which don't exist) with pytest.raises(ReferenceNotFoundError): @@ -569,8 +569,8 @@ async def test_all_attacks_raise_security_error_or_blocked(local_skill): 3. Null byte injection 4. Symlink-based attacks """ - from agentpool.skills.exceptions import ReferenceNotFoundError - from agentpool_toolsets.builtin.skills import _load_reference_content + from wolfharness.skills.exceptions import ReferenceNotFoundError + from wolfharness_toolsets.builtin.skills import _load_reference_content attacks_blocked = [] @@ -619,7 +619,7 @@ def test_security_considerations_documented(): This test checks that SecurityError has appropriate docstrings and is properly exported from the exceptions module. """ - from agentpool.skills.exceptions import SecurityError + from wolfharness.skills.exceptions import SecurityError # Verify SecurityError can be instantiated error = SecurityError("Test security violation") @@ -627,7 +627,7 @@ def test_security_considerations_documented(): assert "Test security violation" in str(error) # Verify it's a proper exception hierarchy - from agentpool.skills.exceptions import SkillError + from wolfharness.skills.exceptions import SkillError assert issubclass(SecurityError, SkillError) diff --git a/tests/server/agui/test_skill_tools.py b/tests/server/agui/test_skill_tools.py index 88bdcf458..0d2cab42c 100644 --- a/tests/server/agui/test_skill_tools.py +++ b/tests/server/agui/test_skill_tools.py @@ -9,9 +9,9 @@ import pytest from upathtools import UPath -from agentpool.skills.command import SkillCommand -from agentpool.skills.skill import Skill -from agentpool_server.agui_server.skill_tools import ( +from wolfharness.skills.command import SkillCommand +from wolfharness.skills.skill import Skill +from wolfharness_server.agui_server.skill_tools import ( AGUISkillBridge, AGUISkillToolAdapter, ) diff --git a/tests/servers/acp_server/conftest.py b/tests/servers/acp_server/conftest.py index 94592e27d..581379a4e 100644 --- a/tests/servers/acp_server/conftest.py +++ b/tests/servers/acp_server/conftest.py @@ -8,11 +8,11 @@ from acp import ClientCapabilities, DefaultACPClient, FileSystemCapability from acp.agent.implementations import TestAgent -from agentpool import Agent -from agentpool.delegation import AgentPool -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness import Agent +from wolfharness.delegation import AgentPool +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent @pytest.fixture diff --git a/tests/servers/acp_server/test_acp_agent_integration.py b/tests/servers/acp_server/test_acp_agent_integration.py index 8c8e70d03..d204c7e91 100644 --- a/tests/servers/acp_server/test_acp_agent_integration.py +++ b/tests/servers/acp_server/test_acp_agent_integration.py @@ -1,6 +1,6 @@ -"""Integration tests for ACPAgent connecting to real agentpool ACP server. +"""Integration tests for ACPAgent connecting to real wolfharness ACP server. -These tests spawn an actual agentpool serve-acp process with a TestModel +These tests spawn an actual wolfharness serve-acp process with a TestModel and connect to it using ACPAgent, testing the full roundtrip. Note: These are slow integration tests that spawn real subprocesses. @@ -16,12 +16,12 @@ import anyio import pytest -from agentpool.agents.acp_agent import ACPAgent -from agentpool.models.acp_agents import ACPAgentConfig +from wolfharness.agents.acp_agent import ACPAgent +from wolfharness.models.acp_agents import ACPAgentConfig if TYPE_CHECKING: - from agentpool.agents.events import RichAgentStreamEvent + from wolfharness.agents.events import RichAgentStreamEvent # Mark all tests in this module as slow/integration @@ -53,12 +53,12 @@ def test_config_file(test_agent_config_yaml: str, tmp_path: Path) -> Path: @pytest.fixture def acp_agent_config(test_config_file: Path) -> ACPAgentConfig: - """Create ACPAgentConfig that spawns agentpool serve-acp.""" + """Create ACPAgentConfig that spawns wolfharness serve-acp.""" return ACPAgentConfig( command="uv", args=[ "run", - "agentpool", + "wolfharness", "serve-acp", str(test_config_file), "--agent", @@ -137,7 +137,7 @@ async def test_acp_agent_file_operations(tmp_path: Path, test_config_file: Path) command="uv", args=[ "run", - "agentpool", + "wolfharness", "serve-acp", str(test_config_file), "--agent", @@ -160,7 +160,7 @@ async def test_acp_agent_terminal_operations(tmp_path: Path, test_config_file: P command="uv", args=[ "run", - "agentpool", + "wolfharness", "serve-acp", str(test_config_file), "--agent", @@ -207,7 +207,7 @@ async def test_acp_agent_stats(acp_agent_config: ACPAgentConfig): async def test_acp_agent_with_input_provider(acp_agent_config: ACPAgentConfig): """Test ACPAgent with custom input provider.""" - from agentpool.ui.stdlib_provider import StdlibInputProvider + from wolfharness.ui.stdlib_provider import StdlibInputProvider input_provider = StdlibInputProvider() @@ -234,7 +234,7 @@ async def test_acp_agent_with_input_provider(acp_agent_config: ACPAgentConfig): async def test_acp_agent_input_provider_in_run_stream(acp_agent_config: ACPAgentConfig): """Test input_provider parameter in run_stream method.""" - from agentpool.ui.stdlib_provider import StdlibInputProvider + from wolfharness.ui.stdlib_provider import StdlibInputProvider input_provider = StdlibInputProvider() diff --git a/tests/servers/acp_server/test_acp_available_commands.py b/tests/servers/acp_server/test_acp_available_commands.py index 39ae53e52..ca578bbdc 100644 --- a/tests/servers/acp_server/test_acp_available_commands.py +++ b/tests/servers/acp_server/test_acp_available_commands.py @@ -13,15 +13,15 @@ import pytest from acp.schema import AvailableCommand -from agentpool import Agent, AgentPool -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent -from agentpool_server.acp_server.session import ACPSession +from wolfharness import Agent, AgentPool +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness_server.acp_server.session import ACPSession def _make_pool_and_agent() -> tuple[AgentPool, Agent]: """Create a simple pool with one agent.""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) diff --git a/tests/servers/acp_server/test_acp_cancel_then_prompt.py b/tests/servers/acp_server/test_acp_cancel_then_prompt.py index 67f66b921..06736124c 100644 --- a/tests/servers/acp_server/test_acp_cancel_then_prompt.py +++ b/tests/servers/acp_server/test_acp_cancel_then_prompt.py @@ -19,16 +19,16 @@ import pytest -from agentpool.agents.events import RunFailedEvent, RunStartedEvent, StreamCompleteEvent -from agentpool.lifecycle import DirectChannel, MemoryJournal -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventEnvelope -from agentpool.orchestrator.turn import Turn +from wolfharness.agents.events import RunFailedEvent, RunStartedEvent, StreamCompleteEvent +from wolfharness.lifecycle import DirectChannel, MemoryJournal +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventEnvelope +from wolfharness.orchestrator.turn import Turn if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool.agents.context import AgentRunContext + from wolfharness import AgentPool + from wolfharness.agents.context import AgentRunContext pytestmark = [pytest.mark.unit, pytest.mark.anyio] diff --git a/tests/servers/acp_server/test_acp_elicitation_resume.py b/tests/servers/acp_server/test_acp_elicitation_resume.py index 3af817eaf..b6d0b253c 100644 --- a/tests/servers/acp_server/test_acp_elicitation_resume.py +++ b/tests/servers/acp_server/test_acp_elicitation_resume.py @@ -20,14 +20,14 @@ import pytest -from agentpool.agents.events.events import ElicitationDeferredEvent -from agentpool_server.acp_server.event_converter import ACPEventConverter -from agentpool_server.acp_server.handler import ACPProtocolHandler -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness.agents.events.events import ElicitationDeferredEvent +from wolfharness_server.acp_server.event_converter import ACPEventConverter +from wolfharness_server.acp_server.handler import ACPProtocolHandler +from wolfharness_server.acp_server.session_manager import ACPSessionManager if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit @@ -130,7 +130,7 @@ async def mock_resume(sid: str, **kwargs: object) -> None: "client", ), patch( - "agentpool_server.acp_server.handler.ACPRequests", + "wolfharness_server.acp_server.handler.ACPRequests", ) as mock_acp_requests_class, ): mock_acp_requests = MagicMock() @@ -177,7 +177,7 @@ async def mock_resume(sid: str, **kwargs: object) -> None: minimal_pool.session_pool.resume_session = mock_resume # type: ignore[assignment] with patch( - "agentpool_server.acp_server.handler.ACPRequests", + "wolfharness_server.acp_server.handler.ACPRequests", ) as mock_acp_requests_class: mock_acp_requests = MagicMock() mock_acp_requests.elicitation_create = AsyncMock( diff --git a/tests/servers/acp_server/test_acp_integration.py b/tests/servers/acp_server/test_acp_integration.py index 3c0546d00..a5b27e962 100644 --- a/tests/servers/acp_server/test_acp_integration.py +++ b/tests/servers/acp_server/test_acp_integration.py @@ -10,10 +10,10 @@ from acp import ClientCapabilities # Add another agent to the pool for switching -from agentpool import Agent -from agentpool.delegation import AgentPool -from agentpool_server.acp_server import ACPServer -from agentpool_server.acp_server.session import ACPSession +from wolfharness import Agent +from wolfharness.delegation import AgentPool +from wolfharness_server.acp_server import ACPServer +from wolfharness_server.acp_server.session import ACPSession pytestmark = pytest.mark.integration @@ -22,8 +22,8 @@ @pytest.fixture async def agent_pool(): """Create a real agent pool from config.""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) @@ -47,8 +47,8 @@ async def test_acp_server_creation(agent_pool: AgentPool): async def test_agent_switching_workflow(agent_pool: AgentPool, mock_acp_agent): """Test the complete agent switching workflow.""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest config1 = NativeAgentConfig(name="agent1", model="test") config2 = NativeAgentConfig(name="agent2", model="test") diff --git a/tests/servers/acp_server/test_acp_load.py b/tests/servers/acp_server/test_acp_load.py index e005892b6..747d0730a 100644 --- a/tests/servers/acp_server/test_acp_load.py +++ b/tests/servers/acp_server/test_acp_load.py @@ -21,13 +21,13 @@ import pytest from acp.schema import LoadSessionRequest, LoadSessionResponse -from agentpool import Agent -from agentpool.delegation import AgentPool -from agentpool.sessions.models import PendingDeferredCall -from agentpool.storage.manager import StorageManager -from agentpool.storage.serialization import serialize_messages -from agentpool_config.storage import MemoryStorageConfig, StorageConfig -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness import Agent +from wolfharness.delegation import AgentPool +from wolfharness.sessions.models import PendingDeferredCall +from wolfharness.storage.manager import StorageManager +from wolfharness.storage.serialization import serialize_messages +from wolfharness_config.storage import MemoryStorageConfig, StorageConfig +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent # ── Helpers ───────────────────────────────────────────────────────────── @@ -90,7 +90,7 @@ def _make_chat_messages_from_model_messages( Returns objects compatible with what ACPSession expects after agent.load_session() populates conversation.chat_messages. """ - from agentpool.messaging import ChatMessage + from wolfharness.messaging import ChatMessage return [ ChatMessage[Any]( @@ -119,8 +119,8 @@ def mock_agent_pool_with_agent() -> tuple[AgentPool, Agent]: def simple_callback(message: str) -> str: return f"Test response: {message}" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) diff --git a/tests/servers/acp_server/test_acp_mcp_transport_reuse.py b/tests/servers/acp_server/test_acp_mcp_transport_reuse.py index 71406b2b2..6c5f67cad 100644 --- a/tests/servers/acp_server/test_acp_mcp_transport_reuse.py +++ b/tests/servers/acp_server/test_acp_mcp_transport_reuse.py @@ -13,8 +13,8 @@ import pytest -from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnection -from agentpool_server.acp_server.acp_mcp_transport import AcpMcpTransport +from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnection +from wolfharness_server.acp_server.acp_mcp_transport import AcpMcpTransport pytestmark = pytest.mark.integration diff --git a/tests/servers/acp_server/test_acp_protocol_handler_cancel.py b/tests/servers/acp_server/test_acp_protocol_handler_cancel.py index 11e14b452..6af101e67 100644 --- a/tests/servers/acp_server/test_acp_protocol_handler_cancel.py +++ b/tests/servers/acp_server/test_acp_protocol_handler_cancel.py @@ -15,13 +15,13 @@ import pytest -from agentpool_server.acp_server.event_converter import ACPEventConverter -from agentpool_server.acp_server.handler import ACPProtocolHandler -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness_server.acp_server.event_converter import ACPEventConverter +from wolfharness_server.acp_server.handler import ACPProtocolHandler +from wolfharness_server.acp_server.session_manager import ACPSessionManager if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit diff --git a/tests/servers/acp_server/test_acp_protocol_handler_input_provider.py b/tests/servers/acp_server/test_acp_protocol_handler_input_provider.py index 474ef8ca9..2eb21872c 100644 --- a/tests/servers/acp_server/test_acp_protocol_handler_input_provider.py +++ b/tests/servers/acp_server/test_acp_protocol_handler_input_provider.py @@ -19,10 +19,10 @@ import pytest from acp.schema import TextContentBlock -from agentpool.orchestrator.core import EventEnvelope -from agentpool.orchestrator.run import RunHandle -from agentpool_server.acp_server.handler import ACPProtocolHandler, _ACPSessionProxy -from agentpool_server.acp_server.input_provider import ACPInputProvider +from wolfharness.orchestrator.core import EventEnvelope +from wolfharness.orchestrator.run import RunHandle +from wolfharness_server.acp_server.handler import ACPProtocolHandler, _ACPSessionProxy +from wolfharness_server.acp_server.input_provider import ACPInputProvider pytestmark = pytest.mark.unit @@ -281,7 +281,7 @@ async def test_event_consumer_passes_turn_complete_true( ) -> None: """When client supports turn_complete, converter is created with flag=True.""" from acp.schema.capabilities import ClientCapabilities - from agentpool_server.acp_server.handler import ACPEventConverter + from wolfharness_server.acp_server.handler import ACPEventConverter handler = ACPProtocolHandler( host_context=mock_pool, @@ -460,7 +460,7 @@ async def test_event_consumer_defaults_turn_complete_when_no_capabilities( mock_client: MagicMock, ) -> None: """When client_capabilities is None, converter defaults to flag=False.""" - from agentpool_server.acp_server.handler import ACPEventConverter + from wolfharness_server.acp_server.handler import ACPEventConverter handler = ACPProtocolHandler( host_context=mock_pool, @@ -510,8 +510,8 @@ async def mock_convert(event): mock_converter.subagent_meta = {} handler._converters["parent-sid"] = mock_converter - from agentpool.agents.events import StreamCompleteEvent - from agentpool.messaging import ChatMessage + from wolfharness.agents.events import StreamCompleteEvent + from wolfharness.messaging import ChatMessage # Child event wrapped in EventEnvelope with source_session_id event = StreamCompleteEvent( @@ -556,8 +556,8 @@ async def mock_convert(event): mock_converter.subagent_meta = {} handler._converters["parent-sid"] = mock_converter - from agentpool.agents.events import StreamCompleteEvent - from agentpool.messaging import ChatMessage + from wolfharness.agents.events import StreamCompleteEvent + from wolfharness.messaging import ChatMessage # Event without session_id wrapped in EventEnvelope with empty source_session_id event = StreamCompleteEvent( diff --git a/tests/servers/acp_server/test_acp_resume.py b/tests/servers/acp_server/test_acp_resume.py index 0349614e4..3b319104a 100644 --- a/tests/servers/acp_server/test_acp_resume.py +++ b/tests/servers/acp_server/test_acp_resume.py @@ -20,10 +20,10 @@ import pytest from acp.schema import ClientCapabilities, ResumeSessionRequest -from agentpool import Agent -from agentpool.delegation import AgentPool -from agentpool.sessions.models import SessionData -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness import Agent +from wolfharness.delegation import AgentPool +from wolfharness.sessions.models import SessionData +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent # --------------------------------------------------------------------------- @@ -44,8 +44,8 @@ def mock_agent_pool_with_agent(): def simple_callback(message: str) -> str: return f"Test response: {message}" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) @@ -273,8 +273,8 @@ async def test_resume_loads_agent_state(mocked_acp_agent): @pytest.mark.unit async def test_handle_prompt_checkpointed_session_resumes(mocked_acp_agent, mock_connection): """handle_prompt should resume a checkpointed session instead of creating a new one.""" - from agentpool_server.acp_server.event_converter import ACPEventConverter - from agentpool_server.acp_server.handler import ACPProtocolHandler + from wolfharness_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.handler import ACPProtocolHandler session_data = _make_session_data(status="checkpointed") @@ -330,8 +330,8 @@ async def test_handle_prompt_checkpointed_session_resumes(mocked_acp_agent, mock @pytest.mark.unit async def test_handle_prompt_active_session_uses_create_session(mocked_acp_agent, mock_connection): """handle_prompt for a non-checkpointed (active/new) session should call create_session.""" - from agentpool_server.acp_server.event_converter import ACPEventConverter - from agentpool_server.acp_server.handler import ACPProtocolHandler + from wolfharness_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.handler import ACPProtocolHandler session_data = _make_session_data(status="active") @@ -532,8 +532,8 @@ async def test_resume_then_handle_prompt_no_duplicate_agent_creation( mocked_acp_agent, mock_connection ): from acp.schema.content_blocks import TextContentBlock - from agentpool_server.acp_server.event_converter import ACPEventConverter - from agentpool_server.acp_server.handler import ACPProtocolHandler + from wolfharness_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.handler import ACPProtocolHandler session_data = _make_session_data() mock_session = _make_mock_session() diff --git a/tests/servers/acp_server/test_acp_resume_integration.py b/tests/servers/acp_server/test_acp_resume_integration.py index bbd97246c..87f104c24 100644 --- a/tests/servers/acp_server/test_acp_resume_integration.py +++ b/tests/servers/acp_server/test_acp_resume_integration.py @@ -15,13 +15,13 @@ import pytest from acp.schema import LoadSessionRequest, ResumeSessionRequest -from agentpool.sessions.models import SessionData -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness.sessions.models import SessionData +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness_server.acp_server.session_manager import ACPSessionManager if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool # --------------------------------------------------------------------------- @@ -124,7 +124,7 @@ async def test_create_then_resume_preserves_conversation_history( # Arrange: store session data session_manager.session_store.load_session = AsyncMock(return_value=known_session_data) # type: ignore[union-attr] - with patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls: + with patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls: mock_session_instance = MagicMock() mock_session_instance.session_id = "sess-abc-123" mock_session_instance.initialize = AsyncMock() @@ -162,7 +162,7 @@ async def test_resume_preserves_created_at_timestamp( # Arrange session_manager.session_store.load_session = AsyncMock(return_value=known_session_data) # type: ignore[union-attr] - with patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls: + with patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls: mock_session_instance = MagicMock() mock_session_instance.initialize = AsyncMock() mock_session_instance.initialize_mcp_servers = AsyncMock() @@ -197,7 +197,7 @@ async def test_resume_preserves_status_field( # Arrange session_manager.session_store.load_session = AsyncMock(return_value=checkpointed_session_data) # type: ignore[union-attr] - with patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls: + with patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls: mock_session_instance = MagicMock() mock_session_instance.initialize = AsyncMock() mock_session_instance.initialize_mcp_servers = AsyncMock() @@ -232,7 +232,7 @@ async def test_resume_with_mcp_servers_initializes_connections( session_manager.session_store.load_session = AsyncMock(return_value=known_session_data) # type: ignore[union-attr] mock_mcp_server = MagicMock() - with patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls: + with patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls: mock_session_instance = MagicMock() mock_session_instance.initialize = AsyncMock() mock_session_instance.initialize_mcp_servers = AsyncMock() @@ -327,7 +327,7 @@ async def test_no_duplicate_load_session_call_on_resume( # Arrange session_manager.session_store.load_session = AsyncMock(return_value=known_session_data) # type: ignore[union-attr] - with patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls: + with patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls: mock_session_instance = MagicMock() mock_session_instance.initialize = AsyncMock() mock_session_instance.initialize_mcp_servers = AsyncMock() diff --git a/tests/servers/acp_server/test_acp_session_load.py b/tests/servers/acp_server/test_acp_session_load.py index f47fafd54..68c94988f 100644 --- a/tests/servers/acp_server/test_acp_session_load.py +++ b/tests/servers/acp_server/test_acp_session_load.py @@ -14,10 +14,10 @@ SessionModelState, SessionModeState, ) -from agentpool import Agent -from agentpool.delegation import AgentPool -from agentpool.messaging import ChatMessage -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness import Agent +from wolfharness.delegation import AgentPool +from wolfharness.messaging import ChatMessage +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent @pytest.fixture @@ -33,8 +33,8 @@ def mock_agent_pool_with_agent(): def simple_callback(message: str) -> str: return f"Test response: {message}" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) @@ -252,7 +252,7 @@ async def test_load_session_with_nested_acp_agent( mock_acp_agent, mock_session, load_session_request ): """Test load_session with nested ACP agent populates models/modes from agent state.""" - from agentpool.agents.acp_agent import ACPAgent + from wolfharness.agents.acp_agent import ACPAgent nested_agent = MagicMock(spec=ACPAgent) nested_agent._state = MagicMock() diff --git a/tests/servers/acp_server/test_acp_session_manager_child_session.py b/tests/servers/acp_server/test_acp_session_manager_child_session.py index 4b7300a79..58981917c 100644 --- a/tests/servers/acp_server/test_acp_session_manager_child_session.py +++ b/tests/servers/acp_server/test_acp_session_manager_child_session.py @@ -7,12 +7,12 @@ import pytest -from agentpool import Agent -from agentpool.delegation import AgentPool -from agentpool.orchestrator.core import SessionPool -from agentpool.sessions import SessionData -from agentpool_server.acp_server.session_manager import ACPSessionManager -from agentpool_storage.memory_provider.provider import MemoryStorageProvider +from wolfharness import Agent +from wolfharness.delegation import AgentPool +from wolfharness.orchestrator.core import SessionPool +from wolfharness.sessions import SessionData +from wolfharness_server.acp_server.session_manager import ACPSessionManager +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider pytestmark = pytest.mark.unit @@ -20,8 +20,8 @@ def _make_pool_with_sessions() -> tuple[AgentPool, Agent, SessionPool, MemoryStorageProvider]: """Create a pool with a real SessionPool backed by MemoryStorageProvider.""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) @@ -48,7 +48,7 @@ def _make_acp_session_manager(pool: AgentPool) -> ACPSessionManager: # Mock out ACPSession creation and initialization to avoid needing # a real ACP client and all the initialization machinery. - with patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls: + with patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls: mock_session = MagicMock() mock_session.session_id = "session_top_001" mock_session.register_update_callback = MagicMock() @@ -68,8 +68,8 @@ async def test_top_level_session_has_no_parent(): mock_acp_agent = MagicMock() with ( - patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls, - patch("agentpool_server.acp_server.session_manager.ClientCapabilities"), + patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls, + patch("wolfharness_server.acp_server.session_manager.ClientCapabilities"), ): mock_session = MagicMock() mock_session.register_update_callback = MagicMock() @@ -97,7 +97,7 @@ async def test_child_session_inherits_parent_project_id(): pool, agent, _sessions, store = _make_pool_with_sessions() # Create a parent session in the store first - from agentpool_storage.opencode_provider.helpers import compute_project_id + from wolfharness_storage.opencode_provider.helpers import compute_project_id parent_cwd = tempfile.gettempdir() parent_project_id = compute_project_id(parent_cwd) @@ -114,8 +114,8 @@ async def test_child_session_inherits_parent_project_id(): mock_acp_agent = MagicMock() with ( - patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls, - patch("agentpool_server.acp_server.session_manager.ClientCapabilities"), + patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls, + patch("wolfharness_server.acp_server.session_manager.ClientCapabilities"), ): mock_session = MagicMock() mock_session.register_update_callback = MagicMock() @@ -149,7 +149,7 @@ async def test_child_session_uses_effective_cwd_for_acp_session(): pool, agent, _sessions, store = _make_pool_with_sessions() parent_cwd = tempfile.gettempdir() - from agentpool_storage.opencode_provider.helpers import compute_project_id + from wolfharness_storage.opencode_provider.helpers import compute_project_id parent_project_id = compute_project_id(parent_cwd) parent_data = SessionData( @@ -165,8 +165,8 @@ async def test_child_session_uses_effective_cwd_for_acp_session(): mock_acp_agent = MagicMock() with ( - patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls, - patch("agentpool_server.acp_server.session_manager.ClientCapabilities"), + patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls, + patch("wolfharness_server.acp_server.session_manager.ClientCapabilities"), ): mock_session = MagicMock() mock_session.register_update_callback = MagicMock() @@ -198,8 +198,8 @@ async def test_no_parent_session_id_preserves_existing_behavior(): mock_acp_agent = MagicMock() with ( - patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls, - patch("agentpool_server.acp_server.session_manager.ClientCapabilities"), + patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls, + patch("wolfharness_server.acp_server.session_manager.ClientCapabilities"), ): mock_session = MagicMock() mock_session.register_update_callback = MagicMock() @@ -226,8 +226,8 @@ async def test_no_parent_session_id_preserves_existing_behavior(): async def test_child_session_without_pool_sessions_falls_back_to_top_level(): """When pool.sessions is None but parent_session_id is provided, should fall back to....""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) @@ -247,8 +247,8 @@ def simple_callback(message: str) -> str: mock_acp_agent = MagicMock() with ( - patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls, - patch("agentpool_server.acp_server.session_manager.ClientCapabilities"), + patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls, + patch("wolfharness_server.acp_server.session_manager.ClientCapabilities"), ): mock_session = MagicMock() mock_session.register_update_callback = MagicMock() diff --git a/tests/servers/acp_server/test_acp_session_process_prompt_turn_complete.py b/tests/servers/acp_server/test_acp_session_process_prompt_turn_complete.py index c43f6d9f7..15afa1171 100644 --- a/tests/servers/acp_server/test_acp_session_process_prompt_turn_complete.py +++ b/tests/servers/acp_server/test_acp_session_process_prompt_turn_complete.py @@ -14,9 +14,9 @@ from acp.schema import TextContentBlock from acp.schema.capabilities import ClientCapabilities -from agentpool import Agent, AgentPool -from agentpool_server.acp_server.event_converter import ACPEventConverter -from agentpool_server.acp_server.session import ACPSession +from wolfharness import Agent, AgentPool +from wolfharness_server.acp_server.event_converter import ACPEventConverter +from wolfharness_server.acp_server.session import ACPSession pytestmark = pytest.mark.unit @@ -33,8 +33,8 @@ def agent_pool() -> AgentPool: def simple_callback(message: str) -> str: return f"Response: {message}" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) diff --git a/tests/servers/acp_server/test_acp_session_resume.py b/tests/servers/acp_server/test_acp_session_resume.py index a45b2addf..51d8354b6 100644 --- a/tests/servers/acp_server/test_acp_session_resume.py +++ b/tests/servers/acp_server/test_acp_session_resume.py @@ -8,13 +8,13 @@ from acp.schema import LoadSessionRequest, ResumeSessionRequest, ResumeSessionResponse from acp.schema.mcp import StdioMcpServer -from agentpool import Agent -from agentpool.delegation import AgentPool -from agentpool.orchestrator.core import SessionPool -from agentpool.sessions import SessionData -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent -from agentpool_server.acp_server.session_manager import ACPSessionManager -from agentpool_storage.memory_provider.provider import MemoryStorageProvider +from wolfharness import Agent +from wolfharness.delegation import AgentPool +from wolfharness.orchestrator.core import SessionPool +from wolfharness.sessions import SessionData +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness_server.acp_server.session_manager import ACPSessionManager +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider @pytest.fixture @@ -30,8 +30,8 @@ def mock_agent_pool_with_agent(): def simple_callback(message: str) -> str: return f"Test response: {message}" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) @@ -189,8 +189,8 @@ async def test_resume_session_exception_returns_empty_response( @pytest.mark.unit async def test_resume_session_passes_mcp_servers_to_constructor(): """Test that resume_session passes mcp_servers to the ACPSession constructor.""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) @@ -219,8 +219,8 @@ def _callback(message: str) -> str: mock_server = MagicMock() with ( - patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls, - patch("agentpool_server.acp_server.session_manager.ClientCapabilities"), + patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls, + patch("wolfharness_server.acp_server.session_manager.ClientCapabilities"), ): mock_session = MagicMock() mock_session.register_update_callback = MagicMock() @@ -246,8 +246,8 @@ def _callback(message: str) -> str: @pytest.mark.unit async def test_resume_session_initializes_mcp_servers(): """Test that resume_session calls initialize_mcp_servers on the session.""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) @@ -275,8 +275,8 @@ def _callback(message: str) -> str: mock_acp_agent = MagicMock() with ( - patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls, - patch("agentpool_server.acp_server.session_manager.ClientCapabilities"), + patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls, + patch("wolfharness_server.acp_server.session_manager.ClientCapabilities"), ): mock_session = MagicMock() mock_session.register_update_callback = MagicMock() @@ -298,8 +298,8 @@ def _callback(message: str) -> str: @pytest.mark.unit async def test_resume_session_with_none_mcp_servers_calls_initialize(): """Test that resume_session still calls initialize_mcp_servers when mcp_servers is None....""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) @@ -327,8 +327,8 @@ def _callback(message: str) -> str: mock_acp_agent = MagicMock() with ( - patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls, - patch("agentpool_server.acp_server.session_manager.ClientCapabilities"), + patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls, + patch("wolfharness_server.acp_server.session_manager.ClientCapabilities"), ): mock_session = MagicMock() mock_session.register_update_callback = MagicMock() @@ -356,8 +356,8 @@ async def test_resume_session_does_not_call_load_session(): get_or_create_session_agent(), so resume_session no longer calls agent.load_session() directly. """ - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) @@ -385,8 +385,8 @@ def _callback(message: str) -> str: mock_acp_agent = MagicMock() with ( - patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls, - patch("agentpool_server.acp_server.session_manager.ClientCapabilities"), + patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls, + patch("wolfharness_server.acp_server.session_manager.ClientCapabilities"), ): mock_session = MagicMock() mock_session.register_update_callback = MagicMock() @@ -408,8 +408,8 @@ def _callback(message: str) -> str: @pytest.mark.unit async def test_resume_session_closes_old_and_recreates(): """Test resume_session closes old session and creates a fresh one.""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest manifest = AgentsManifest(agents={"test_agent": NativeAgentConfig(model="test")}) @@ -437,8 +437,8 @@ def _callback(message: str) -> str: mock_acp_agent = MagicMock() with ( - patch("agentpool_server.acp_server.session_manager.ACPSession") as mock_session_cls, - patch("agentpool_server.acp_server.session_manager.ClientCapabilities"), + patch("wolfharness_server.acp_server.session_manager.ACPSession") as mock_session_cls, + patch("wolfharness_server.acp_server.session_manager.ClientCapabilities"), ): mock_session = MagicMock() mock_session.register_update_callback = MagicMock() diff --git a/tests/servers/acp_server/test_acp_skills_red_flags.py b/tests/servers/acp_server/test_acp_skills_red_flags.py index 5bdd0eefe..0e2ca8e5b 100644 --- a/tests/servers/acp_server/test_acp_skills_red_flags.py +++ b/tests/servers/acp_server/test_acp_skills_red_flags.py @@ -13,8 +13,8 @@ import pytest from upathtools import UPath -from agentpool.skills.manager import SkillsManager -from agentpool_config.skills import SkillsConfig +from wolfharness.skills.manager import SkillsManager +from wolfharness_config.skills import SkillsConfig pytestmark = pytest.mark.unit @@ -54,12 +54,12 @@ def test_skills_config_include_default_true(self) -> None: assert UPath("./custom-skills/") in paths, "Custom path missing" assert len(paths) > 1, "Default paths not included when include_default=true" - def test_agentpool_acp_agent_load_skills_defaults_to_none(self) -> None: + def test_wolfharness_acp_agent_load_skills_defaults_to_none(self) -> None: """AgentPoolACPAgent.load_skills defaults to None. None means "use manifest's include_default setting". """ - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent assert AgentPoolACPAgent.load_skills is None, ( "AgentPoolACPAgent.load_skills should default to None, " @@ -73,9 +73,9 @@ def test_acp_server_from_config_uses_manifest_include_default(self) -> None: use manifest.skills.include_default as the default. """ # Create a manifest with include_default=False - from agentpool.models.manifest import AgentsManifest - from agentpool_config.skills import SkillsConfig - from agentpool_server.acp_server.server import ACPServer + from wolfharness.models.manifest import AgentsManifest + from wolfharness_config.skills import SkillsConfig + from wolfharness_server.acp_server.server import ACPServer manifest = AgentsManifest( skills=SkillsConfig( @@ -97,9 +97,9 @@ def test_acp_server_from_config_uses_manifest_include_default(self) -> None: def test_acp_server_from_config_explicit_load_skills_overrides_manifest(self) -> None: """Explicit load_skills argument must override manifest's include_default.""" - from agentpool.models.manifest import AgentsManifest - from agentpool_config.skills import SkillsConfig - from agentpool_server.acp_server.server import ACPServer + from wolfharness.models.manifest import AgentsManifest + from wolfharness_config.skills import SkillsConfig + from wolfharness_server.acp_server.server import ACPServer manifest = AgentsManifest( skills=SkillsConfig( @@ -133,8 +133,8 @@ async def test_init_client_skills_respects_none_load_skills(self) -> None: # Create a real AgentPool with include_default=False import yamling - from agentpool import AgentPool, AgentsManifest - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness import AgentPool, AgentsManifest + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent config = """\ agents: @@ -175,7 +175,7 @@ def test_serve_acp_cli_load_skills_defaults_to_none(self) -> None: """ import inspect - from agentpool_cli.serve_acp import acp_command + from wolfharness_cli.serve_acp import acp_command sig = inspect.signature(acp_command) load_skills_param = sig.parameters.get("load_skills") @@ -191,8 +191,8 @@ def test_manifest_include_default_controls_acp_skill_loading(self) -> None: When skills.include_default=false in manifest and no explicit CLI override, ACP server should NOT load .claude/skills/. """ - from agentpool.models.manifest import AgentsManifest - from agentpool_config.skills import SkillsConfig + from wolfharness.models.manifest import AgentsManifest + from wolfharness_config.skills import SkillsConfig manifest = AgentsManifest( skills=SkillsConfig( @@ -202,7 +202,7 @@ def test_manifest_include_default_controls_acp_skill_loading(self) -> None: ) # Without explicit override, load_skills should follow manifest - from agentpool_server.acp_server.server import ACPServer + from wolfharness_server.acp_server.server import ACPServer server = ACPServer.from_config(manifest) assert server.load_skills is False, ( @@ -212,9 +212,9 @@ def test_manifest_include_default_controls_acp_skill_loading(self) -> None: def test_manifest_include_default_true_loads_skills(self) -> None: """Manifest's include_default=True must enable ACP skill loading.""" - from agentpool.models.manifest import AgentsManifest - from agentpool_config.skills import SkillsConfig - from agentpool_server.acp_server.server import ACPServer + from wolfharness.models.manifest import AgentsManifest + from wolfharness_config.skills import SkillsConfig + from wolfharness_server.acp_server.server import ACPServer manifest = AgentsManifest( skills=SkillsConfig( @@ -238,10 +238,10 @@ async def test_local_resource_provider_respects_include_default_false(self, tmp_ """ import logging - from agentpool_config.skills import SkillsConfig + from wolfharness_config.skills import SkillsConfig # Enable debug logging - logging.getLogger("agentpool.skills").setLevel(logging.DEBUG) + logging.getLogger("wolfharness.skills").setLevel(logging.DEBUG) # Create a custom skill directory with one skill custom_skills_dir = tmp_path / "custom-skills" diff --git a/tests/servers/acp_server/test_acp_v2_extensions.py b/tests/servers/acp_server/test_acp_v2_extensions.py index d4ede8f01..b787732f1 100644 --- a/tests/servers/acp_server/test_acp_v2_extensions.py +++ b/tests/servers/acp_server/test_acp_v2_extensions.py @@ -11,9 +11,9 @@ import pytest from acp.schema.session_state import SessionInfo -from agentpool.sessions.models import PendingDeferredCall, SessionData -from agentpool_server.acp_server.converters import to_session_info -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.sessions.models import PendingDeferredCall, SessionData +from wolfharness_server.acp_server.converters import to_session_info +from wolfharness_server.acp_server.event_converter import ACPEventConverter pytestmark = pytest.mark.integration @@ -135,7 +135,7 @@ async def test_close_session_preserves_checkpointed_with_pending_calls( pending deferred calls, the session should be marked as 'checkpointed' and NOT deleted from storage. """ - from agentpool_storage.memory_provider.provider import MemoryStorageProvider + from wolfharness_storage.memory_provider.provider import MemoryStorageProvider store = MemoryStorageProvider() @@ -154,7 +154,7 @@ async def test_close_session_deletes_when_no_pending_calls( Normal close (no deferred calls) should delete the session from storage. """ - from agentpool_storage.memory_provider.provider import MemoryStorageProvider + from wolfharness_storage.memory_provider.provider import MemoryStorageProvider store = MemoryStorageProvider() diff --git a/tests/servers/acp_server/test_agent_role.py b/tests/servers/acp_server/test_agent_role.py index 5b5a673af..f67b2d983 100644 --- a/tests/servers/acp_server/test_agent_role.py +++ b/tests/servers/acp_server/test_agent_role.py @@ -9,8 +9,8 @@ from acp.exceptions import RequestError from acp.schema import SessionConfigOption -from agentpool import AgentPool, AgentsManifest -from agentpool_server.acp_server.acp_agent import ( +from wolfharness import AgentPool, AgentsManifest +from wolfharness_server.acp_server.acp_agent import ( AgentPoolACPAgent, get_agent_role_config_option, ) diff --git a/tests/servers/acp_server/test_claude_acp_toolset_integration.py b/tests/servers/acp_server/test_claude_acp_toolset_integration.py index 0c10b4403..a426ab14c 100644 --- a/tests/servers/acp_server/test_claude_acp_toolset_integration.py +++ b/tests/servers/acp_server/test_claude_acp_toolset_integration.py @@ -12,10 +12,10 @@ import pytest -from agentpool import AgentPool -from agentpool.agents.acp_agent import ACPAgent -from agentpool.models.acp_agents.base import ACPAgentConfig -from agentpool_config.toolsets import SubagentToolsetConfig +from wolfharness import AgentPool +from wolfharness.agents.acp_agent import ACPAgent +from wolfharness.models.acp_agents.base import ACPAgentConfig +from wolfharness_config.toolsets import SubagentToolsetConfig if not shutil.which("claude-code-acp"): @@ -51,7 +51,7 @@ async def test_claude_acp_tool_bridge_mcp_config(claude_config_with_subagent: AC async def test_claude_acp_multiple_toolsets(): """Test Claude ACP agent with multiple toolsets.""" - from agentpool_config.toolsets import DebugToolsetConfig + from wolfharness_config.toolsets import DebugToolsetConfig tools = [SubagentToolsetConfig(), DebugToolsetConfig()] config = ACPAgentConfig( diff --git a/tests/servers/acp_server/test_client_filesystem_tools.py b/tests/servers/acp_server/test_client_filesystem_tools.py index 29c61590b..800a7bb94 100644 --- a/tests/servers/acp_server/test_client_filesystem_tools.py +++ b/tests/servers/acp_server/test_client_filesystem_tools.py @@ -5,9 +5,9 @@ from exxec import MockExecutionEnvironment import pytest -from agentpool import Agent, AgentContext -from agentpool.tools.base import ToolResult -from agentpool_toolsets.fsspec_toolset import FSSpecTools +from wolfharness import Agent, AgentContext +from wolfharness.tools.base import ToolResult +from wolfharness_toolsets.fsspec_toolset import FSSpecTools pytestmark = pytest.mark.integration diff --git a/tests/servers/acp_server/test_command_bridge_streaming.py b/tests/servers/acp_server/test_command_bridge_streaming.py index 7558065eb..86c61c3cb 100644 --- a/tests/servers/acp_server/test_command_bridge_streaming.py +++ b/tests/servers/acp_server/test_command_bridge_streaming.py @@ -12,8 +12,8 @@ from slashed import Command from acp import ClientCapabilities -from agentpool import Agent, AgentPool -from agentpool_server.acp_server.session import ACPSession +from wolfharness import Agent, AgentPool +from wolfharness_server.acp_server.session import ACPSession pytestmark = pytest.mark.integration @@ -176,7 +176,7 @@ async def capture_message( sent_messages.append(message) async def capture_ext_notification(method: str, params: dict): - if method == "_agentpool/toast": + if method == "_wolfharness/toast": toast_messages.append(params.get("message", "")) session.notifications.send_agent_text = capture_message # type: ignore[method-assign] diff --git a/tests/servers/acp_server/test_dedup.py b/tests/servers/acp_server/test_dedup.py index 63c59870a..374cc256c 100644 --- a/tests/servers/acp_server/test_dedup.py +++ b/tests/servers/acp_server/test_dedup.py @@ -15,8 +15,8 @@ import pytest from acp.schema import UserMessageChunk -from agentpool.agents.events.events import UserMessageInsertedEvent -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.agents.events.events import UserMessageInsertedEvent +from wolfharness_server.acp_server.event_converter import ACPEventConverter pytestmark = pytest.mark.unit diff --git a/tests/servers/acp_server/test_deferred_acp.py b/tests/servers/acp_server/test_deferred_acp.py index 6d192f485..88e73f6c1 100644 --- a/tests/servers/acp_server/test_deferred_acp.py +++ b/tests/servers/acp_server/test_deferred_acp.py @@ -16,8 +16,8 @@ from acp.schema import ToolCallStart from acp.tool_call_reporter import ToolCallReporter from acp.tool_call_state import ToolCallState -from agentpool.agents.events.events import ToolCallDeferredEvent -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.agents.events.events import ToolCallDeferredEvent +from wolfharness_server.acp_server.event_converter import ACPEventConverter pytestmark = pytest.mark.integration diff --git a/tests/servers/acp_server/test_elicitation_task_isolation.py b/tests/servers/acp_server/test_elicitation_task_isolation.py index 8f90c0b40..82320193f 100644 --- a/tests/servers/acp_server/test_elicitation_task_isolation.py +++ b/tests/servers/acp_server/test_elicitation_task_isolation.py @@ -19,7 +19,7 @@ def _make_handler() -> Any: """Create a minimal ACPProtocolHandler-like object with the elicitation task dict.""" - from agentpool_server.acp_server.handler import ACPProtocolHandler + from wolfharness_server.acp_server.handler import ACPProtocolHandler host_context = MagicMock() host_context.session_pool = MagicMock() diff --git a/tests/servers/acp_server/test_enum_elicitation.py b/tests/servers/acp_server/test_enum_elicitation.py index b4796220a..b24e31b35 100644 --- a/tests/servers/acp_server/test_enum_elicitation.py +++ b/tests/servers/acp_server/test_enum_elicitation.py @@ -6,7 +6,7 @@ import pytest from acp import RequestPermissionResponse -from agentpool_server.acp_server.input_provider import ( +from wolfharness_server.acp_server.input_provider import ( _create_array_enum_elicitation_options, _create_oneof_elicitation_options, _handle_array_enum_elicitation_response, diff --git a/tests/servers/acp_server/test_event_converter_tool_call_fix.py b/tests/servers/acp_server/test_event_converter_tool_call_fix.py index 2d21a4c5a..b538004bb 100644 --- a/tests/servers/acp_server/test_event_converter_tool_call_fix.py +++ b/tests/servers/acp_server/test_event_converter_tool_call_fix.py @@ -14,11 +14,11 @@ import pytest from acp.schema import ToolCallProgress, ToolCallStart -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( ToolCallProgressEvent, ToolCallStartEvent, ) -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness_server.acp_server.event_converter import ACPEventConverter pytestmark = [pytest.mark.unit, pytest.mark.anyio] diff --git a/tests/servers/acp_server/test_event_converter_user_message.py b/tests/servers/acp_server/test_event_converter_user_message.py index 2d132358e..95e4d7ad2 100644 --- a/tests/servers/acp_server/test_event_converter_user_message.py +++ b/tests/servers/acp_server/test_event_converter_user_message.py @@ -13,8 +13,8 @@ import pytest from acp.schema import UserMessageChunk -from agentpool.agents.events.events import UserMessageInsertedEvent -from agentpool_server.acp_server.event_converter import ( +from wolfharness.agents.events.events import UserMessageInsertedEvent +from wolfharness_server.acp_server.event_converter import ( ACPEventConverter, ACPUserMessageMeta, ) diff --git a/tests/servers/acp_server/test_event_converter_user_message_integration.py b/tests/servers/acp_server/test_event_converter_user_message_integration.py index ec9b52e0d..152653f1a 100644 --- a/tests/servers/acp_server/test_event_converter_user_message_integration.py +++ b/tests/servers/acp_server/test_event_converter_user_message_integration.py @@ -20,8 +20,8 @@ import pytest from acp.schema import TextContentBlock, UserMessageChunk -from agentpool.agents.events.events import UserMessageInsertedEvent -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.agents.events.events import UserMessageInsertedEvent +from wolfharness_server.acp_server.event_converter import ACPEventConverter pytestmark = [pytest.mark.integration, pytest.mark.anyio] diff --git a/tests/servers/acp_server/test_get_session_red_flag.py b/tests/servers/acp_server/test_get_session_red_flag.py index 2a1b4f6af..e96e74d47 100644 --- a/tests/servers/acp_server/test_get_session_red_flag.py +++ b/tests/servers/acp_server/test_get_session_red_flag.py @@ -14,7 +14,7 @@ if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit @@ -26,7 +26,7 @@ def _make_manager_with_controller(pool: AgentPool) -> tuple[object, object]: Uses a real AgentPool — the SessionController returns None for non-existent sessions naturally. """ - from agentpool_server.acp_server.session_manager import ACPSessionManager + from wolfharness_server.acp_server.session_manager import ACPSessionManager manager = ACPSessionManager(pool=pool) controller = pool.session_pool.sessions if pool.session_pool else None @@ -39,7 +39,7 @@ def _make_manager_without_controller(pool: AgentPool) -> object: Sets pool._session_pool = None to simulate no SessionPool. Caller is responsible for restoring pool._session_pool after the test. """ - from agentpool_server.acp_server.session_manager import ACPSessionManager + from wolfharness_server.acp_server.session_manager import ACPSessionManager pool._session_pool = None return ACPSessionManager(pool=pool) diff --git a/tests/servers/acp_server/test_handle_prompt_delivery.py b/tests/servers/acp_server/test_handle_prompt_delivery.py index 47139c36e..0913b4416 100644 --- a/tests/servers/acp_server/test_handle_prompt_delivery.py +++ b/tests/servers/acp_server/test_handle_prompt_delivery.py @@ -15,7 +15,7 @@ import pytest -from agentpool.lifecycle.types import DeliveryMode +from wolfharness.lifecycle.types import DeliveryMode pytestmark = [pytest.mark.unit, pytest.mark.anyio] @@ -29,7 +29,7 @@ async def test_meta_delivery_ster_routes_as_asap() -> None: Then: ``handle_prompt`` receives ``delivery="steer"`` and ``send_message`` is called with ``mode=DeliveryMode.STEER``. """ - from agentpool_server.acp_server.handler import ACPProtocolHandler + from wolfharness_server.acp_server.handler import ACPProtocolHandler host_context = MagicMock() session_pool = MagicMock() @@ -59,7 +59,7 @@ async def test_meta_delivery_ster_routes_as_asap() -> None: handler._ensure_event_consumer = AsyncMock() with patch( - "agentpool_server.acp_server.handler.ACPEventConverter.build_user_message_chunks", + "wolfharness_server.acp_server.handler.ACPEventConverter.build_user_message_chunks", return_value=[], ): await handler.handle_prompt( @@ -80,7 +80,7 @@ async def test_meta_delivery_followup_routes_as_when_idle() -> None: When: ``handle_prompt(delivery="followup")`` is called. Then: ``send_message`` is called with ``mode=DeliveryMode.QUEUE``. """ - from agentpool_server.acp_server.handler import ACPProtocolHandler + from wolfharness_server.acp_server.handler import ACPProtocolHandler host_context = MagicMock() session_pool = MagicMock() @@ -110,7 +110,7 @@ async def test_meta_delivery_followup_routes_as_when_idle() -> None: handler._ensure_event_consumer = AsyncMock() with patch( - "agentpool_server.acp_server.handler.ACPEventConverter.build_user_message_chunks", + "wolfharness_server.acp_server.handler.ACPEventConverter.build_user_message_chunks", return_value=[], ): await handler.handle_prompt( @@ -131,7 +131,7 @@ async def test_no_meta_delivery_defaults_to_queue() -> None: When: ``handle_prompt(delivery=None)`` is called. Then: ``send_message`` is called with ``mode=DeliveryMode.QUEUE``. """ - from agentpool_server.acp_server.handler import ACPProtocolHandler + from wolfharness_server.acp_server.handler import ACPProtocolHandler host_context = MagicMock() session_pool = MagicMock() @@ -161,7 +161,7 @@ async def test_no_meta_delivery_defaults_to_queue() -> None: handler._ensure_event_consumer = AsyncMock() with patch( - "agentpool_server.acp_server.handler.ACPEventConverter.build_user_message_chunks", + "wolfharness_server.acp_server.handler.ACPEventConverter.build_user_message_chunks", return_value=[], ): await handler.handle_prompt( @@ -182,7 +182,7 @@ async def test_message_id_generated_and_passed_through() -> None: When: The prompt is processed. Then: ``send_message`` is called with a non-None ``message_id`` UUID string. """ - from agentpool_server.acp_server.handler import ACPProtocolHandler + from wolfharness_server.acp_server.handler import ACPProtocolHandler host_context = MagicMock() session_pool = MagicMock() @@ -212,7 +212,7 @@ async def test_message_id_generated_and_passed_through() -> None: handler._ensure_event_consumer = AsyncMock() with patch( - "agentpool_server.acp_server.handler.ACPEventConverter.build_user_message_chunks", + "wolfharness_server.acp_server.handler.ACPEventConverter.build_user_message_chunks", return_value=[], ): await handler.handle_prompt( diff --git a/tests/servers/acp_server/test_input_provider_elicitation.py b/tests/servers/acp_server/test_input_provider_elicitation.py index a6b800391..6202b02c7 100644 --- a/tests/servers/acp_server/test_input_provider_elicitation.py +++ b/tests/servers/acp_server/test_input_provider_elicitation.py @@ -7,7 +7,7 @@ from mcp.types import ElicitResult import pytest -from agentpool_server.acp_server.input_provider import ACPInputProvider +from wolfharness_server.acp_server.input_provider import ACPInputProvider class _FakeElicitationResponse: diff --git a/tests/servers/acp_server/test_mcp_integration.py b/tests/servers/acp_server/test_mcp_integration.py index 676d81a2b..662dedee5 100644 --- a/tests/servers/acp_server/test_mcp_integration.py +++ b/tests/servers/acp_server/test_mcp_integration.py @@ -9,13 +9,13 @@ import pytest from acp import EnvVariable, StdioMcpServer -from agentpool import Agent -from agentpool.delegation import AgentPool -from agentpool.log import get_logger -from agentpool.tools.base import Tool -from agentpool_server.acp_server.converters import convert_acp_mcp_server_to_config -from agentpool_server.acp_server.session import ACPSession -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness import Agent +from wolfharness.delegation import AgentPool +from wolfharness.log import get_logger +from wolfharness.tools.base import Tool +from wolfharness_server.acp_server.converters import convert_acp_mcp_server_to_config +from wolfharness_server.acp_server.session import ACPSession +from wolfharness_server.acp_server.session_manager import ACPSessionManager pytestmark = pytest.mark.integration @@ -23,7 +23,7 @@ if TYPE_CHECKING: from acp import ClientCapabilities - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent logger = get_logger(__name__) @@ -116,7 +116,7 @@ def simple_callback(message: str) -> str: mcp_servers = [StdioMcpServer(name="tools", command="echo", args=["tools"], env=[])] async with agent_pool: # Register agent config in runtime registry so create_session() can find it - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig agent_pool.session_pool.sessions.runtime_registry.register( "test_agent", NativeAgentConfig(name="test_agent", model="test:") diff --git a/tests/servers/acp_server/test_model_state.py b/tests/servers/acp_server/test_model_state.py index ca93eb878..b182a2bb2 100644 --- a/tests/servers/acp_server/test_model_state.py +++ b/tests/servers/acp_server/test_model_state.py @@ -7,8 +7,8 @@ import pytest from acp.schema import SessionModelState -from agentpool_server.acp_server.provider_router import ProviderRouter -from agentpool_server.shared.model_utils import build_model_state_for_acp +from wolfharness_server.acp_server.provider_router import ProviderRouter +from wolfharness_server.shared.model_utils import build_model_state_for_acp pytestmark = pytest.mark.unit @@ -55,7 +55,7 @@ def create_toko_model(model_id, name, description="", provider=""): @pytest.fixture def manifest_with_variants(): """Manifest with configured variants.""" - from agentpool.models.model_configs import StringModelConfig + from wolfharness.models.model_configs import StringModelConfig variants = { "fast_gpt": StringModelConfig(identifier="openai:gpt-4o-mini"), diff --git a/tests/servers/acp_server/test_process_tools_integration.py b/tests/servers/acp_server/test_process_tools_integration.py index b2dbbfcad..0c2d7497f 100644 --- a/tests/servers/acp_server/test_process_tools_integration.py +++ b/tests/servers/acp_server/test_process_tools_integration.py @@ -7,9 +7,9 @@ from exxec.models import ExecutionResult import pytest -from agentpool import Agent, AgentContext -from agentpool.agents.context import AgentRunContext -from agentpool_toolsets.builtin.execution_environment import ProcessManagementTools +from wolfharness import Agent, AgentContext +from wolfharness.agents.context import AgentRunContext +from wolfharness_toolsets.builtin.execution_environment import ProcessManagementTools pytestmark = pytest.mark.integration @@ -218,7 +218,7 @@ async def test_execute_command( test_agent: Agent[None], ): """Test executing a command directly.""" - from agentpool.tool_impls.bash import create_bash_tool + from wolfharness.tool_impls.bash import create_bash_tool bash_tool = create_bash_tool(env=mock_env) diff --git a/tests/servers/acp_server/test_prompt_meta_delivery.py b/tests/servers/acp_server/test_prompt_meta_delivery.py index 1bdbdc54f..572d5c33b 100644 --- a/tests/servers/acp_server/test_prompt_meta_delivery.py +++ b/tests/servers/acp_server/test_prompt_meta_delivery.py @@ -33,7 +33,7 @@ def _make_agent() -> MagicMock: async def _call_prompt(agent: MagicMock, meta: dict | None) -> None: """Call agent.prompt() with a PromptRequest carrying the given _meta.""" - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent request = PromptRequest( session_id="test-session", diff --git a/tests/servers/acp_server/test_provider_router.py b/tests/servers/acp_server/test_provider_router.py index 518a41499..b6d571150 100644 --- a/tests/servers/acp_server/test_provider_router.py +++ b/tests/servers/acp_server/test_provider_router.py @@ -6,8 +6,8 @@ import pytest -from agentpool.models.model_configs import StringModelConfig -from agentpool_server.acp_server.provider_router import ProviderRouter +from wolfharness.models.model_configs import StringModelConfig +from wolfharness_server.acp_server.provider_router import ProviderRouter pytestmark = pytest.mark.integration diff --git a/tests/servers/acp_server/test_raw_input_mode.py b/tests/servers/acp_server/test_raw_input_mode.py index 064978259..e9d7acc1b 100644 --- a/tests/servers/acp_server/test_raw_input_mode.py +++ b/tests/servers/acp_server/test_raw_input_mode.py @@ -13,11 +13,11 @@ import pytest from acp.schema import ToolCallProgress, ToolCallStart -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( ToolCallProgressEvent, ToolCallStartEvent, ) -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness_server.acp_server.event_converter import ACPEventConverter pytestmark = [pytest.mark.unit, pytest.mark.anyio] diff --git a/tests/servers/acp_server/test_steer_event_pipeline.py b/tests/servers/acp_server/test_steer_event_pipeline.py index daa686b94..958543b0a 100644 --- a/tests/servers/acp_server/test_steer_event_pipeline.py +++ b/tests/servers/acp_server/test_steer_event_pipeline.py @@ -18,13 +18,13 @@ import pytest from acp.schema import UserMessageChunk -from agentpool.agents.events.events import UserMessageInsertedEvent -from agentpool.lifecycle.comm_channel import DirectChannel -from agentpool.lifecycle.journal import MemoryJournal -from agentpool.messaging import MessageHistory -from agentpool.orchestrator.core import EventBus, SessionState -from agentpool.orchestrator.run import RunHandle -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.agents.events.events import UserMessageInsertedEvent +from wolfharness.lifecycle.comm_channel import DirectChannel +from wolfharness.lifecycle.journal import MemoryJournal +from wolfharness.messaging import MessageHistory +from wolfharness.orchestrator.core import EventBus, SessionState +from wolfharness.orchestrator.run import RunHandle +from wolfharness_server.acp_server.event_converter import ACPEventConverter pytestmark = [pytest.mark.integration, pytest.mark.anyio] diff --git a/tests/servers/acp_server/test_step_usage_converter.py b/tests/servers/acp_server/test_step_usage_converter.py index d1d3e2c25..922d950db 100644 --- a/tests/servers/acp_server/test_step_usage_converter.py +++ b/tests/servers/acp_server/test_step_usage_converter.py @@ -11,12 +11,12 @@ import pytest from acp.schema import UsageUpdate -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( StepUsageEvent, StreamCompleteEvent, ) -from agentpool.messaging import ChatMessage -from agentpool_server.acp_server.event_converter import ACPEventConverter +from wolfharness.messaging import ChatMessage +from wolfharness_server.acp_server.event_converter import ACPEventConverter pytestmark = [pytest.mark.integration, pytest.mark.anyio] diff --git a/tests/servers/acp_server/test_subagent_events.py b/tests/servers/acp_server/test_subagent_events.py index cf1f59aac..7c6a5e838 100644 --- a/tests/servers/acp_server/test_subagent_events.py +++ b/tests/servers/acp_server/test_subagent_events.py @@ -16,17 +16,17 @@ from acp.schema import ClientCapabilities from acp.schema.notifications import SessionNotification -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( PartDeltaEvent, RunErrorEvent, SpawnSessionStart, StreamCompleteEvent, ToolCallStartEvent, ) -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventBus, EventEnvelope -from agentpool_server.acp_server.event_converter import ACPEventConverter -from agentpool_server.acp_server.handler import ACPProtocolHandler +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventBus, EventEnvelope +from wolfharness_server.acp_server.event_converter import ACPEventConverter +from wolfharness_server.acp_server.handler import ACPProtocolHandler pytestmark = [pytest.mark.unit, pytest.mark.anyio] @@ -239,13 +239,13 @@ async def test_notify_completed_called_when_done_event_set( Then: _notify_completed sends a ToolCallProgress completion notification. """ # Set up parent converter in zed mode so build_subagent_completed yields - from agentpool_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.event_converter import ACPEventConverter zed_converter = ACPEventConverter(subagent_display_mode="zed") zed_converter._current_message_id = "test-msg" acp_handler._converters["parent-ses"] = zed_converter # Seed the converter's _subagent_tool_call_ids map - from agentpool.agents.events import SpawnSessionStart + from wolfharness.agents.events import SpawnSessionStart spawn = SpawnSessionStart( child_session_id="child-ses", @@ -296,12 +296,12 @@ async def test_done_event_none_race_immediate_notification( When: _on_spawn_session_start processes a SpawnSessionStart. Then: _notify_completed is called immediately (no closure spawned). """ - from agentpool_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.event_converter import ACPEventConverter zed_converter = ACPEventConverter(subagent_display_mode="zed") zed_converter._current_message_id = "test-msg" acp_handler._converters["parent-ses"] = zed_converter - from agentpool.agents.events import SpawnSessionStart + from wolfharness.agents.events import SpawnSessionStart spawn = SpawnSessionStart( child_session_id="child-race", @@ -321,7 +321,7 @@ async def test_done_event_none_race_immediate_notification( # Restore the real _on_spawn_session_start (fixture overrides it with AsyncMock) import types - from agentpool_server.acp_server.handler import ACPProtocolHandler as _HandlerCls + from wolfharness_server.acp_server.handler import ACPProtocolHandler as _HandlerCls acp_handler._on_spawn_session_start = types.MethodType( # type: ignore[assignment] _HandlerCls._on_spawn_session_start, acp_handler @@ -358,12 +358,12 @@ async def test_concurrent_children_each_get_completion_notification( When: Both done_events are set. Then: _notify_completed is called for each child with the correct tool_call_id. """ - from agentpool_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.event_converter import ACPEventConverter zed_converter = ACPEventConverter(subagent_display_mode="zed") zed_converter._current_message_id = "test-msg" acp_handler._converters["parent-ses"] = zed_converter - from agentpool.agents.events import SpawnSessionStart + from wolfharness.agents.events import SpawnSessionStart # Seed converter with two spawn events for i, child_sid in enumerate(["child-a", "child-b"]): @@ -420,12 +420,12 @@ async def test_closure_error_logged_not_swallowed( When: _await_child_and_notify completes (done_event set). Then: The closure does NOT re-raise the ValueError (caught by generic except). """ - from agentpool_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.event_converter import ACPEventConverter zed_converter = ACPEventConverter(subagent_display_mode="zed") zed_converter._current_message_id = "test-msg" acp_handler._converters["parent-ses"] = zed_converter - from agentpool.agents.events import SpawnSessionStart + from wolfharness.agents.events import SpawnSessionStart spawn = SpawnSessionStart( child_session_id="child-err", @@ -471,12 +471,12 @@ async def test_consumer_task_refs_cleanup_after_closure( When: The closure task completes (done_event set). Then: The task is removed from _consumer_task_refs. """ - from agentpool_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.event_converter import ACPEventConverter zed_converter = ACPEventConverter(subagent_display_mode="zed") zed_converter._current_message_id = "test-msg" acp_handler._converters["parent-ses"] = zed_converter - from agentpool.agents.events import SpawnSessionStart + from wolfharness.agents.events import SpawnSessionStart spawn = SpawnSessionStart( child_session_id="child-ref", @@ -522,12 +522,12 @@ async def test_parent_of_cleanup_on_child_exit( When: _await_child_and_notify's done_event is set (simulating child exit). Then: _parent_of[child_sid] is removed. """ - from agentpool_server.acp_server.event_converter import ACPEventConverter + from wolfharness_server.acp_server.event_converter import ACPEventConverter zed_converter = ACPEventConverter(subagent_display_mode="zed") zed_converter._current_message_id = "test-msg" acp_handler._converters["parent-ses"] = zed_converter - from agentpool.agents.events import SpawnSessionStart + from wolfharness.agents.events import SpawnSessionStart spawn = SpawnSessionStart( child_session_id="child-cleanup", @@ -761,7 +761,7 @@ async def test_on_spawn_creates_child_converter_with_subagent_context( """ import types - from agentpool_server.acp_server.handler import ACPProtocolHandler as _HandlerCls + from wolfharness_server.acp_server.handler import ACPProtocolHandler as _HandlerCls # Restore real method (fixture overrides it with AsyncMock) acp_handler._on_spawn_session_start = types.MethodType( # type: ignore[assignment] @@ -824,7 +824,7 @@ async def test_handle_event_stamps_field_meta_on_child_notification( When: A PartDeltaEvent is handled for that child session. Then: The resulting SessionNotification has the correct field_meta dict. """ - from agentpool_server.acp_server.event_converter import SubagentContext + from wolfharness_server.acp_server.event_converter import SubagentContext child_converter = ACPEventConverter( subagent_context=SubagentContext(parent_tool_call_id="tc-123", subagent_type="coder"), @@ -877,7 +877,7 @@ async def test_nested_subagents_each_have_own_context( When: Inspecting their subagent_context values. Then: Each converter has its own context pointing to its parent_tool_call_id. """ - from agentpool_server.acp_server.event_converter import SubagentContext + from wolfharness_server.acp_server.event_converter import SubagentContext child_converter = ACPEventConverter( subagent_context=SubagentContext( diff --git a/tests/servers/acp_server/test_tool_call_snapshots.py b/tests/servers/acp_server/test_tool_call_snapshots.py index 837b6b41c..503a0db31 100644 --- a/tests/servers/acp_server/test_tool_call_snapshots.py +++ b/tests/servers/acp_server/test_tool_call_snapshots.py @@ -12,8 +12,8 @@ import pytest from syrupy.extensions.json import JSONSnapshotExtension -from agentpool_config.agentpool_tools import BashToolConfig, ExecuteCodeToolConfig -from agentpool_config.toolsets import FSSpecToolsetConfig +from wolfharness_config.toolsets import FSSpecToolsetConfig +from wolfharness_config.wolfharness_tools import BashToolConfig, ExecuteCodeToolConfig from .tool_call_harness import ToolCallTestHarness @@ -305,7 +305,7 @@ async def test_mcp_tool_with_progress( """Test MCP tool with progress notifications produces expected messages.""" from pathlib import Path - from agentpool_config.mcp_server import StdioMCPServerConfig + from wolfharness_config.mcp_server import StdioMCPServerConfig server_path = Path(__file__).parent.parent.parent / "mcp_server" / "server.py" mcp_server = StdioMCPServerConfig( diff --git a/tests/servers/acp_server/test_turn_completion.py b/tests/servers/acp_server/test_turn_completion.py index 3783aef4e..c3bf7dbc8 100644 --- a/tests/servers/acp_server/test_turn_completion.py +++ b/tests/servers/acp_server/test_turn_completion.py @@ -14,7 +14,7 @@ if TYPE_CHECKING: - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent pytestmark = pytest.mark.unit diff --git a/tests/servers/acp_server/tool_call_harness.py b/tests/servers/acp_server/tool_call_harness.py index 5c198ad8f..7bfe723cb 100644 --- a/tests/servers/acp_server/tool_call_harness.py +++ b/tests/servers/acp_server/tool_call_harness.py @@ -32,19 +32,19 @@ async def test_my_tool(harness: ToolCallTestHarness, snapshot): from acp import ClientCapabilities from acp.client.implementations import HeadlessACPClient from acp.schema import TextContentBlock -from agentpool import AgentsManifest -from agentpool.delegation import AgentPool -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.model_configs import TestModelConfig -from agentpool_server.acp_server.session import ACPSession +from wolfharness import AgentsManifest +from wolfharness.delegation import AgentPool +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.model_configs import TestModelConfig +from wolfharness_server.acp_server.session import ACPSession if TYPE_CHECKING: from collections.abc import Sequence from acp.schema import SessionNotification - from agentpool_config import AnyToolConfig - from agentpool_config.mcp_server import MCPServerConfig + from wolfharness_config import AnyToolConfig + from wolfharness_config.mcp_server import MCPServerConfig class RecordingACPClient(HeadlessACPClient): diff --git a/tests/servers/opencode_server/conftest.py b/tests/servers/opencode_server/conftest.py index da34e72b9..cf7391833 100644 --- a/tests/servers/opencode_server/conftest.py +++ b/tests/servers/opencode_server/conftest.py @@ -23,25 +23,25 @@ from httpx import ASGITransport, AsyncClient import pytest -from agentpool.models.manifest import AgentsManifest -from agentpool.storage import StorageManager -from agentpool.utils.streams import FileOpsTracker -from agentpool.utils.time_utils import now_ms -from agentpool.utils.todos import TodoTracker -from agentpool_server.opencode_server.dependencies import get_state -from agentpool_server.opencode_server.models import Session -from agentpool_server.opencode_server.models.common import TimeCreatedUpdated -from agentpool_server.opencode_server.routes import agent_router, file_router, session_router -from agentpool_server.opencode_server.routes.global_routes import router as global_router -from agentpool_server.opencode_server.routes.message_routes import router as message_router -from agentpool_server.opencode_server.state import ServerState +from wolfharness.models.manifest import AgentsManifest +from wolfharness.storage import StorageManager +from wolfharness.utils.streams import FileOpsTracker +from wolfharness.utils.time_utils import now_ms +from wolfharness.utils.todos import TodoTracker +from wolfharness_server.opencode_server.dependencies import get_state +from wolfharness_server.opencode_server.models import Session +from wolfharness_server.opencode_server.models.common import TimeCreatedUpdated +from wolfharness_server.opencode_server.routes import agent_router, file_router, session_router +from wolfharness_server.opencode_server.routes.global_routes import router as global_router +from wolfharness_server.opencode_server.routes.message_routes import router as message_router +from wolfharness_server.opencode_server.state import ServerState if TYPE_CHECKING: from collections.abc import AsyncIterator, Iterator - from agentpool.sessions.models import SessionData - from agentpool_server.opencode_server.models.message import MessageRequest, MessageWithParts + from wolfharness.sessions.models import SessionData + from wolfharness_server.opencode_server.models.message import MessageRequest, MessageWithParts def _make_functional_event_bus() -> Mock: @@ -97,7 +97,7 @@ async def _publish(session_id: str, event: Any) -> None: async def _check_event_stream_for_failure(event_stream: Any, failure_type: type) -> bool: """Check an event stream for a failure event. Returns True if found.""" - from agentpool.orchestrator.core import drain_and_merge + from wolfharness.orchestrator.core import drain_and_merge async for event in drain_and_merge(event_stream): if isinstance(event.event, failure_type): @@ -128,7 +128,7 @@ async def run_message_phases( Returns the ``_MessageRunContext``. """ - from agentpool_server.opencode_server.routes.message_routes import ( + from wolfharness_server.opencode_server.routes.message_routes import ( _route_message_locked, ) @@ -178,7 +178,7 @@ async def run_message_phases( # Drain early event stream: feed events to adapter and check for RunFailedEvent if early_event_stream is not None: - from agentpool.agents.events.events import RunFailedEvent + from wolfharness.agents.events.events import RunFailedEvent with contextlib.suppress(Exception): found_failure = await _drain_events_and_check_failure( @@ -227,7 +227,7 @@ async def _finalize_assistant_inline( Note: EventBus events should already be drained and fed to the adapter by the caller (run_message_phases via _drain_events_and_check_failure). """ - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( AssistantMessage, MessageAbortedError, MessageAbortedErrorData, @@ -277,7 +277,7 @@ async def _finalize_assistant_inline( if sp_session_pool is not None and hasattr(sp_session_pool, "sessions"): sp_session = sp_session_pool.sessions.get_session(session_id) if sp_session is not None and getattr(sp_session, "agent", None) is not None: - from agentpool_server.opencode_server.routes.message_routes import ( + from wolfharness_server.opencode_server.routes.message_routes import ( opencode_to_chat_message, ) @@ -382,7 +382,7 @@ def storage_manager() -> StorageManager: Uses MemoryStorageProvider so session CRUD, message storage, etc. all work without any external dependencies or I/O. """ - from agentpool_config.storage import MemoryStorageConfig, StorageConfig + from wolfharness_config.storage import MemoryStorageConfig, StorageConfig config = StorageConfig(providers=[MemoryStorageConfig()]) return StorageManager(config=config) @@ -450,7 +450,7 @@ async def _mock_create_session( ) -> Mock: from datetime import datetime - from agentpool.sessions.models import SessionData + from wolfharness.sessions.models import SessionData data = SessionData( session_id=session_id, @@ -551,7 +551,7 @@ def mock_agent(mock_env: Mock, mock_pool: Mock, storage_manager: StorageManager) """ agent = Mock() agent.name = "test-agent" - agent.model_name = None # resolve_default_model_info() falls back to ("default", "agentpool") + agent.model_name = None # resolve_default_model_info() falls back to ("default", "wolfharness") agent.env = mock_env agent._input_provider = None agent.run = AsyncMock(return_value=Mock(data="test response")) @@ -638,7 +638,7 @@ async def _mock_route_message( input_provider: Any | None = None, **kwargs: Any, ) -> Any: - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode # D14: Store the canonical assistant_msg_id (or fallback to # message_id) so _before_consumer_loop can reuse it instead of @@ -682,16 +682,16 @@ async def _mock_route_message( if message_id is not None: import time as _time - from agentpool_server.opencode_server.event_processor import ( + from wolfharness_server.opencode_server.event_processor import ( OpenCodeUserMessageMeta, _deserialize_part, ) - from agentpool_server.opencode_server.models.common import TimeCreated - from agentpool_server.opencode_server.models.message import ( + from wolfharness_server.opencode_server.models.common import TimeCreated + from wolfharness_server.opencode_server.models.message import ( MessageWithParts, UserMessage, ) - from agentpool_server.opencode_server.opencode_message_bridge import ( + from wolfharness_server.opencode_server.opencode_message_bridge import ( append_message_to_session, ) @@ -723,7 +723,7 @@ async def _mock_route_message( # session_controller is present, but ensure it's initialized for cases # where the mock pool's event_bus isn't available at construction time. if state.event_bridge is None and state._pool is not None: - from agentpool_server.opencode_server.event_bridge import OpenCodeEventBridge + from wolfharness_server.opencode_server.event_bridge import OpenCodeEventBridge session_pool = getattr(state._pool, "session_pool", None) if session_pool is not None: diff --git a/tests/servers/opencode_server/test_agent_model_propagation.py b/tests/servers/opencode_server/test_agent_model_propagation.py index 88b76d23c..0753d85cc 100644 --- a/tests/servers/opencode_server/test_agent_model_propagation.py +++ b/tests/servers/opencode_server/test_agent_model_propagation.py @@ -2,24 +2,24 @@ Regression tests for the bug where the OpenCode TUI showed correct agent name and model in the input box, but after execution started, both agent and model -became 'default'/'agentpool' for the lead agent AND sub-agents. +became 'default'/'wolfharness' for the lead agent AND sub-agents. Root cause: ``_before_consumer_loop`` and ``_reconstruct_tool_parts_from_checkpoint`` -hardcoded ``agent_name="agentpool"``, ``model_id="default"``, -``provider_id="agentpool"`` when creating the assistant message for the async +hardcoded ``agent_name="wolfharness"``, ``model_id="default"``, +``provider_id="wolfharness"`` when creating the assistant message for the async path. The sync path (``_process_message_locked``) correctly used values from the HTTP request, but the TUI uses ``prompt_async`` which goes through the async path. These tests verify that: 1. ``_before_consumer_loop`` uses ``agent_name`` from the session state - (not the hardcoded "agentpool"). + (not the hardcoded "wolfharness"). 2. ``_before_consumer_loop`` uses model info from pending metadata when - provided by the REST handler (not the hardcoded "default"/"agentpool"). -3. ``_before_consumer_loop`` falls back to "default"/"agentpool" only when + provided by the REST handler (not the hardcoded "default"/"wolfharness"). +3. ``_before_consumer_loop`` falls back to "default"/"wolfharness" only when no model info is available. 4. ``_reconstruct_tool_parts_from_checkpoint`` uses ``agent_name`` from the - session state (not the hardcoded "agentpool"). + session state (not the hardcoded "wolfharness"). """ from __future__ import annotations @@ -29,7 +29,7 @@ import pytest -from agentpool.orchestrator.session_controller import SessionState +from wolfharness.orchestrator.session_controller import SessionState pytestmark = pytest.mark.unit @@ -49,7 +49,7 @@ def _make_integration( server_state: Mock | None = None, ) -> Any: """Build an OpenCodeSessionPoolIntegration with mocked deps.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -58,7 +58,7 @@ def _make_integration( if server_state is None: server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) server_state.model_variants = {} return OpenCodeSessionPoolIntegration(session_pool, server_state) @@ -72,8 +72,8 @@ class TestBeforeConsumerLoopAgentName: """_before_consumer_loop must use agent_name from session state.""" @pytest.mark.asyncio - async def test_uses_session_agent_name_not_agentpool(self) -> None: - """Assistant message should carry the session's agent_name, not 'agentpool'.""" + async def test_uses_session_agent_name_not_wolfharness(self) -> None: + """Assistant message should carry the session's agent_name, not 'wolfharness'.""" session_pool = Mock() session_pool.sessions = Mock() session_pool.sessions.get_session = Mock( @@ -111,8 +111,8 @@ def _get_session(session_id: str) -> SessionState: assert ctx_l.assistant_msg.info.agent == "logician" @pytest.mark.asyncio - async def test_falls_back_to_agentpool_when_no_session_state(self) -> None: - """When session state is unavailable, fall back to 'agentpool' (graceful degradation).""" + async def test_falls_back_to_wolfharness_when_no_session_state(self) -> None: + """When session state is unavailable, fall back to 'wolfharness' (graceful degradation).""" session_pool = Mock() session_pool.sessions = Mock() session_pool.sessions.get_session = Mock(return_value=None) @@ -125,7 +125,7 @@ async def test_falls_back_to_agentpool_when_no_session_state(self) -> None: assert ctx is not None # Graceful fallback — should still create a message, just with the # default agent_name. - assert ctx.assistant_msg.info.agent == "agentpool" + assert ctx.assistant_msg.info.agent == "wolfharness" # ============================================================================= @@ -167,7 +167,7 @@ async def test_uses_pending_model_id_and_provider_id(self) -> None: @pytest.mark.asyncio async def test_falls_back_to_default_when_no_pending_model(self) -> None: - """Without pending model metadata, fall back to 'default'/'agentpool'.""" + """Without pending model metadata, fall back to 'default'/'wolfharness'.""" session_pool = Mock() session_pool.sessions = Mock() session_pool.sessions.get_session = Mock( @@ -184,7 +184,7 @@ async def test_falls_back_to_default_when_no_pending_model(self) -> None: assert ctx.assistant_msg.info.agent == "engineer" # model falls back to defaults assert ctx.assistant_msg.info.model_id == "default" - assert ctx.assistant_msg.info.provider_id == "agentpool" + assert ctx.assistant_msg.info.provider_id == "wolfharness" @pytest.mark.asyncio async def test_pending_message_id_still_works_with_metadata(self) -> None: @@ -238,7 +238,7 @@ def _get_session(session_id: str) -> SessionState: ctx = integration._contexts.get(child_id) assert ctx is not None assert ctx.assistant_msg.info.agent == "researcher" - assert ctx.assistant_msg.info.agent != "agentpool" + assert ctx.assistant_msg.info.agent != "wolfharness" @pytest.mark.asyncio async def test_child_session_uses_child_agent_model(self) -> None: @@ -323,7 +323,7 @@ class TestReconstructToolPartsAgentName: @pytest.mark.asyncio async def test_uses_session_agent_name(self) -> None: """Checkpoint recovery should preserve the session's agent_name on the assistant message.""" - from agentpool_server.opencode_server.opencode_message_bridge import ( + from wolfharness_server.opencode_server.opencode_message_bridge import ( _reconstruct_tool_parts_from_checkpoint, ) @@ -338,7 +338,7 @@ async def test_uses_session_agent_name(self) -> None: server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) server_state.model_variants = {} server_state.pool_or_none = pool server_state.messages = {} @@ -359,12 +359,12 @@ async def test_uses_session_agent_name(self) -> None: assert len(messages) == 1 assistant_msg = messages[0] assert assistant_msg.info.agent == "visionary" - assert assistant_msg.info.agent != "agentpool" + assert assistant_msg.info.agent != "wolfharness" @pytest.mark.asyncio - async def test_falls_back_to_agentpool_when_no_session_state(self) -> None: - """When session state is unavailable, fall back to 'agentpool'.""" - from agentpool_server.opencode_server.opencode_message_bridge import ( + async def test_falls_back_to_wolfharness_when_no_session_state(self) -> None: + """When session state is unavailable, fall back to 'wolfharness'.""" + from wolfharness_server.opencode_server.opencode_message_bridge import ( _reconstruct_tool_parts_from_checkpoint, ) @@ -377,7 +377,7 @@ async def test_falls_back_to_agentpool_when_no_session_state(self) -> None: server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) server_state.model_variants = {} server_state.pool_or_none = pool server_state.messages = {} @@ -395,12 +395,12 @@ async def test_falls_back_to_agentpool_when_no_session_state(self) -> None: messages = server_state.messages.get("test-session", []) assert len(messages) == 1 - assert messages[0].info.agent == "agentpool" + assert messages[0].info.agent == "wolfharness" @pytest.mark.asyncio async def test_no_op_when_no_pending_calls(self) -> None: """Function should be a no-op when pending_calls is empty.""" - from agentpool_server.opencode_server.opencode_message_bridge import ( + from wolfharness_server.opencode_server.opencode_message_bridge import ( _reconstruct_tool_parts_from_checkpoint, ) diff --git a/tests/servers/opencode_server/test_auto_resume_message_redflag.py b/tests/servers/opencode_server/test_auto_resume_message_redflag.py index 0daba393b..95a368899 100644 --- a/tests/servers/opencode_server/test_auto_resume_message_redflag.py +++ b/tests/servers/opencode_server/test_auto_resume_message_redflag.py @@ -34,19 +34,19 @@ ) import pytest -from agentpool.agents.events import StreamCompleteEvent -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import SessionPool -from agentpool_server.opencode_server.models import ( +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import SessionPool +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessageUpdatedEvent, PartUpdatedEvent, ) -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, get_messages_for_session, ) -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -59,8 +59,8 @@ @pytest.fixture def mock_agent_pool() -> Mock: """Create a mock AgentPool for SessionPool construction.""" - from agentpool.agents.events import RunStartedEvent, StreamCompleteEvent - from agentpool.messaging.messages import ChatMessage + from wolfharness.agents.events import RunStartedEvent, StreamCompleteEvent + from wolfharness.messaging.messages import ChatMessage pool = Mock() pool.main_agent = Mock() diff --git a/tests/servers/opencode_server/test_cancelled_message.py b/tests/servers/opencode_server/test_cancelled_message.py index 6d39b736b..1d40e83c7 100644 --- a/tests/servers/opencode_server/test_cancelled_message.py +++ b/tests/servers/opencode_server/test_cancelled_message.py @@ -22,9 +22,10 @@ import pytest -from agentpool.utils import identifiers as identifier -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.models import ( +from tests.servers.opencode_server.conftest import run_message_phases +from wolfharness.utils import identifiers as identifier +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessageRequest, MessageUpdatedEvent, @@ -32,12 +33,11 @@ TimeCreated, UserMessage, ) -from agentpool_server.opencode_server.models.message import ( +from wolfharness_server.opencode_server.models.message import ( MessageAbortedError, MessageWithParts, ) -from agentpool_server.opencode_server.state import ServerState -from tests.servers.opencode_server.conftest import run_message_phases +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -62,7 +62,7 @@ def __init__(self) -> None: self.model_name = "test-model" self.session_id: str | None = None # Real MessageHistory so conversation state is testable - from agentpool.messaging.message_history import MessageHistory + from wolfharness.messaging.message_history import MessageHistory self.conversation = MessageHistory() @@ -120,7 +120,7 @@ def cancellable_mock_agent(): agent._agent_pool = pool # state.py resolves _pool via agent._agent_pool # Set up SessionPool mock for new architecture - from agentpool.lifecycle import RunState + from wolfharness.lifecycle import RunState session_pool = Mock() session_pool.sessions = Mock() @@ -188,8 +188,8 @@ def sample_message_request(): def _setup_session(state: ServerState, session_id: str) -> None: """Set up session state manually (bypassing ensure_session which needs pool.storage).""" - from agentpool_server.opencode_server.models import Session - from agentpool_server.opencode_server.models.common import TimeCreatedUpdated + from wolfharness_server.opencode_server.models import Session + from wolfharness_server.opencode_server.models.common import TimeCreatedUpdated now = now_ms() session = Session( diff --git a/tests/servers/opencode_server/test_command_execution.py b/tests/servers/opencode_server/test_command_execution.py index 2b3880965..a6c91e5d1 100644 --- a/tests/servers/opencode_server/test_command_execution.py +++ b/tests/servers/opencode_server/test_command_execution.py @@ -33,7 +33,7 @@ if TYPE_CHECKING: from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState pytestmark = [pytest.mark.asyncio, pytest.mark.integration] @@ -298,7 +298,7 @@ async def test_collision_warning_logged( mock_prompt.name = "collision-cmd" mock_agent.list_prompts = AsyncMock(return_value=[mock_prompt]) - with patch("agentpool_server.opencode_server.routes.session_routes.logger") as mock_logger: + with patch("wolfharness_server.opencode_server.routes.session_routes.logger") as mock_logger: response = await async_client.post( f"/session/{session_id}/command", json={"command": "collision-cmd"}, @@ -390,7 +390,7 @@ async def test_skill_command_routes_through_session_pool( # noqa: PLR0915 """ from slashed import Command as SlashedCommand - from agentpool_server.opencode_server.models import UserMessage + from wolfharness_server.opencode_server.models import UserMessage # Create session first response = await async_client.post("/session", json={"title": "Test Session"}) @@ -652,10 +652,10 @@ async def test_skill_command_full_chain_integration( # noqa: PLR0915 """ from slashed import Command as SlashedCommand - from agentpool_server.opencode_server.event_processor import ( + from wolfharness_server.opencode_server.event_processor import ( OpenCodeUserMessageMeta, ) - from agentpool_server.opencode_server.models import TextPart, UserMessage + from wolfharness_server.opencode_server.models import TextPart, UserMessage # Create session response = await async_client.post("/session", json={"title": "Integration Test"}) diff --git a/tests/servers/opencode_server/test_command_model_and_hints.py b/tests/servers/opencode_server/test_command_model_and_hints.py index 85c433a01..0cc47da97 100644 --- a/tests/servers/opencode_server/test_command_model_and_hints.py +++ b/tests/servers/opencode_server/test_command_model_and_hints.py @@ -7,8 +7,8 @@ import pytest -from agentpool_server.opencode_server.models.agent import Command -from agentpool_server.opencode_server.routes.agent_routes import _extract_hints +from wolfharness_server.opencode_server.models.agent import Command +from wolfharness_server.opencode_server.routes.agent_routes import _extract_hints pytestmark = pytest.mark.integration diff --git a/tests/servers/opencode_server/test_commit_revert.py b/tests/servers/opencode_server/test_commit_revert.py index 41cbb63e1..0f35a68d1 100644 --- a/tests/servers/opencode_server/test_commit_revert.py +++ b/tests/servers/opencode_server/test_commit_revert.py @@ -16,10 +16,10 @@ import pytest -from agentpool.messaging import ChatMessage -from agentpool.utils.streams import FileChange -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.models import ( +from wolfharness.messaging import ChatMessage +from wolfharness.utils.streams import FileChange +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessagePath, MessageRequest, @@ -33,14 +33,14 @@ TimeCreatedUpdated, UserMessage, ) -from agentpool_server.opencode_server.routes.message_routes import ( +from wolfharness_server.opencode_server.routes.message_routes import ( _commit_revert, _truncate_agent_history, ) if TYPE_CHECKING: - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.unit @@ -464,7 +464,7 @@ async def _tracking_truncate(sid: str, up_to: str) -> int: original_broadcast = server_state.broadcast_event async def _tracking_broadcast(event: Any) -> None: - from agentpool_server.opencode_server.models import SessionUpdatedEvent + from wolfharness_server.opencode_server.models import SessionUpdatedEvent if isinstance(event, SessionUpdatedEvent): call_order.append("broadcast_session_updated") diff --git a/tests/servers/opencode_server/test_commit_revert_integration.py b/tests/servers/opencode_server/test_commit_revert_integration.py index d025b92b9..7a2bc7897 100644 --- a/tests/servers/opencode_server/test_commit_revert_integration.py +++ b/tests/servers/opencode_server/test_commit_revert_integration.py @@ -24,11 +24,11 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlmodel import select -from agentpool.messaging import ChatMessage -from agentpool.storage import StorageManager -from agentpool.utils.time_utils import now_ms -from agentpool_config.storage import SQLStorageConfig, StorageConfig -from agentpool_server.opencode_server.models import ( +from wolfharness.messaging import ChatMessage +from wolfharness.storage import StorageManager +from wolfharness.utils.time_utils import now_ms +from wolfharness_config.storage import SQLStorageConfig, StorageConfig +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessagePath, MessageTime, @@ -40,19 +40,19 @@ TimeCreatedUpdated, UserMessage, ) -from agentpool_server.opencode_server.routes.message_routes import _commit_revert -from agentpool_server.opencode_server.routes.session_routes import ( +from wolfharness_server.opencode_server.routes.message_routes import _commit_revert +from wolfharness_server.opencode_server.routes.session_routes import ( RevertRequest, revert_session, ) -from agentpool_storage.sql_provider.models import Message -from agentpool_storage.sql_provider.sql_provider import SQLModelProvider +from wolfharness_storage.sql_provider.models import Message +from wolfharness_storage.sql_provider.sql_provider import SQLModelProvider if TYPE_CHECKING: from pathlib import Path - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration diff --git a/tests/servers/opencode_server/test_concurrent_messages.py b/tests/servers/opencode_server/test_concurrent_messages.py index 9b097c4db..bfb183d4b 100644 --- a/tests/servers/opencode_server/test_concurrent_messages.py +++ b/tests/servers/opencode_server/test_concurrent_messages.py @@ -12,14 +12,14 @@ import pytest -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessageRequest, TextPartInput, ) -from agentpool_server.opencode_server.models.message import UserMessage -from agentpool_server.opencode_server.routes.message_routes import _process_message -from agentpool_server.opencode_server.session_pool_integration import ensure_session -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.models.message import UserMessage +from wolfharness_server.opencode_server.routes.message_routes import _process_message +from wolfharness_server.opencode_server.session_pool_integration import ensure_session +from wolfharness_server.opencode_server.state import ServerState if TYPE_CHECKING: @@ -84,8 +84,8 @@ async def stream() -> AsyncIterator[Any]: await asyncio.sleep(self.delay) # Yield a simple text event - from agentpool.agents.events import StreamCompleteEvent, TextContentItem - from agentpool.messaging import ChatMessage + from wolfharness.agents.events import StreamCompleteEvent, TextContentItem + from wolfharness.messaging import ChatMessage yield TextContentItem(text=f"Response for {session_id}") yield StreamCompleteEvent(message=ChatMessage(role="assistant", content="done")) @@ -142,7 +142,7 @@ async def save_session(session_data: Any) -> None: pool.session_pool.sessions.get_session = Mock(return_value=None) # Set up a real EventBus so adapter can subscribe/unsubscribe - from agentpool.orchestrator.core import EventBus + from wolfharness.orchestrator.core import EventBus event_bus = EventBus(max_queue_size=100) pool.session_pool.event_bus = event_bus @@ -157,8 +157,8 @@ async def _mock_receive_request( message_id: str | None = None, **kwargs: Any, ): - from agentpool.lifecycle import RunOutcome, RunState - from agentpool.orchestrator.run import RunHandle + from wolfharness.lifecycle import RunOutcome, RunState + from wolfharness.orchestrator.run import RunHandle handle = Mock(spec=RunHandle) handle.run_id = "test-run" @@ -258,12 +258,12 @@ async def _wrapping_send_message(*args: Any, **kwargs: Any) -> Any: if message_id is not None and content is not None: import time as _time - from agentpool_server.opencode_server.models.common import TimeCreated - from agentpool_server.opencode_server.models.message import ( + from wolfharness_server.opencode_server.models.common import TimeCreated + from wolfharness_server.opencode_server.models.message import ( MessageWithParts, UserMessage, ) - from agentpool_server.opencode_server.opencode_message_bridge import ( + from wolfharness_server.opencode_server.opencode_message_bridge import ( append_message_to_session, ) @@ -344,7 +344,7 @@ async def send_message_with_id(msg_id: str): ) # Debug: capture all error events first - from agentpool_server.opencode_server.models.events import SessionErrorEvent + from wolfharness_server.opencode_server.models.events import SessionErrorEvent error_events = [e for e in all_events if isinstance(e, SessionErrorEvent)] if error_events: diff --git a/tests/servers/opencode_server/test_config_routes.py b/tests/servers/opencode_server/test_config_routes.py index 967a5d7fe..418d569ad 100644 --- a/tests/servers/opencode_server/test_config_routes.py +++ b/tests/servers/opencode_server/test_config_routes.py @@ -6,8 +6,8 @@ import pytest -from agentpool.agents.modes import ModeCategory, ModeInfo -from agentpool_server.opencode_server.routes.config_routes import list_modes +from wolfharness.agents.modes import ModeCategory, ModeInfo +from wolfharness_server.opencode_server.routes.config_routes import list_modes pytestmark = pytest.mark.integration diff --git a/tests/servers/opencode_server/test_converter_thinking.py b/tests/servers/opencode_server/test_converter_thinking.py index 309de99b2..043288e75 100644 --- a/tests/servers/opencode_server/test_converter_thinking.py +++ b/tests/servers/opencode_server/test_converter_thinking.py @@ -18,12 +18,12 @@ ) import pytest -from agentpool.messaging.messages import ChatMessage -from agentpool_server.opencode_server.converters import ( +from wolfharness.messaging.messages import ChatMessage +from wolfharness_server.opencode_server.converters import ( chat_message_to_opencode, opencode_to_chat_message, ) -from agentpool_server.opencode_server.models import ReasoningPart +from wolfharness_server.opencode_server.models import ReasoningPart pytestmark = pytest.mark.integration @@ -114,7 +114,7 @@ def test_chat_message_to_opencode_preserves_text_and_thinking(): msg = _make_assistant_chat_message_with_thinking() result = chat_message_to_opencode(msg, session_id="s1") - from agentpool_server.opencode_server.models import TextPart + from wolfharness_server.opencode_server.models import TextPart reasoning_parts = [p for p in result.parts if isinstance(p, ReasoningPart)] text_parts = [p for p in result.parts if isinstance(p, TextPart)] diff --git a/tests/servers/opencode_server/test_d14_separation.py b/tests/servers/opencode_server/test_d14_separation.py index 0b7b00af2..9326ffb13 100644 --- a/tests/servers/opencode_server/test_d14_separation.py +++ b/tests/servers/opencode_server/test_d14_separation.py @@ -12,7 +12,7 @@ import pytest -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) diff --git a/tests/servers/opencode_server/test_dedup.py b/tests/servers/opencode_server/test_dedup.py index 254e4a03e..18f78f077 100644 --- a/tests/servers/opencode_server/test_dedup.py +++ b/tests/servers/opencode_server/test_dedup.py @@ -14,12 +14,12 @@ import pytest -from agentpool.agents.events.events import UserMessageInsertedEvent -from agentpool_server.opencode_server.event_processor import EventProcessor -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.agents.events.events import UserMessageInsertedEvent +from wolfharness_server.opencode_server.event_processor import EventProcessor +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models.message import ( +from wolfharness_server.opencode_server.models.message import ( MessagePath, MessageTime, MessageWithParts, @@ -38,7 +38,7 @@ def _make_ctx() -> EventProcessorContext: agent_name="agent", model_id="default", parent_id="", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) state = MagicMock() @@ -51,7 +51,9 @@ def _make_ctx() -> EventProcessorContext: ) -_BRIDGE_PATH = "agentpool_server.opencode_server.opencode_message_bridge.append_message_to_session" +_BRIDGE_PATH = ( + "wolfharness_server.opencode_server.opencode_message_bridge.append_message_to_session" +) async def test_accepted_source_produces_events() -> None: diff --git a/tests/servers/opencode_server/test_deferred_opencode.py b/tests/servers/opencode_server/test_deferred_opencode.py index 3d8dab6e3..d5ddefab8 100644 --- a/tests/servers/opencode_server/test_deferred_opencode.py +++ b/tests/servers/opencode_server/test_deferred_opencode.py @@ -12,18 +12,18 @@ import pytest -from agentpool.agents.events.events import ToolCallDeferredEvent -from agentpool_server.opencode_server.event_processor import EventProcessor -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.agents.events.events import ToolCallDeferredEvent +from wolfharness_server.opencode_server.event_processor import EventProcessor +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, PartUpdatedEvent, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( TimeStartEndCompacted, ToolPart, ToolStateCompleted, @@ -35,7 +35,7 @@ if TYPE_CHECKING: - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState # ============================================================================= @@ -64,7 +64,7 @@ async def test_deferred_event_creates_tool_part_running(server_state: ServerStat agent_name="test-agent", model_id="test-model", parent_id="parent-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -130,7 +130,7 @@ async def test_deferred_event_sets_title_with_deferred_strategy( agent_name="test-agent", model_id="test-model", parent_id="parent-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -191,7 +191,7 @@ async def test_deferred_event_skipped_when_already_completed( agent_name="test-agent", model_id="test-model", parent_id="parent-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -250,7 +250,7 @@ async def test_deferred_event_skipped_when_already_errored( Similar to the completed dedup test, but for ToolStateError. """ - from agentpool_server.opencode_server.models.parts import ( + from wolfharness_server.opencode_server.models.parts import ( TimeStartEnd, ToolStateError, ) @@ -264,7 +264,7 @@ async def test_deferred_event_skipped_when_already_errored( agent_name="test-agent", model_id="test-model", parent_id="parent-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( diff --git a/tests/servers/opencode_server/test_diagnostic.py b/tests/servers/opencode_server/test_diagnostic.py index d878f9b7f..a58b124bb 100644 --- a/tests/servers/opencode_server/test_diagnostic.py +++ b/tests/servers/opencode_server/test_diagnostic.py @@ -7,11 +7,11 @@ import pytest -from agentpool_server.opencode_server.routes.global_routes import ( +from wolfharness_server.opencode_server.routes.global_routes import ( VERSION, GlobalEventFactory, ) -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -38,7 +38,7 @@ def __init__(self, working_dir: str | None = "/tmp/test_wd") -> None: def get_event_factory(self) -> GlobalEventFactory: if self._event_factory is None: - from agentpool_storage.opencode_provider import helpers + from wolfharness_storage.opencode_provider import helpers self._event_factory = GlobalEventFactory( directory=self.working_dir or "", @@ -132,8 +132,8 @@ async def test_diagnostic_working_dir_none_returns_directory_null() -> None: from fastapi import FastAPI from httpx import ASGITransport, AsyncClient - from agentpool_server.opencode_server.dependencies import get_state - from agentpool_server.opencode_server.routes.global_routes import router as global_router + from wolfharness_server.opencode_server.dependencies import get_state + from wolfharness_server.opencode_server.routes.global_routes import router as global_router state = _make_state_with_none_working_dir() app = FastAPI() diff --git a/tests/servers/opencode_server/test_duplicate_message_id.py b/tests/servers/opencode_server/test_duplicate_message_id.py index c0ec6ca94..2f1f71624 100644 --- a/tests/servers/opencode_server/test_duplicate_message_id.py +++ b/tests/servers/opencode_server/test_duplicate_message_id.py @@ -9,7 +9,7 @@ Fix: ``append_message_to_session`` catches ``ValueError`` for duplicate message IDs and treats the write as idempotent. -See: https://github.com/Leoyzen/agentpool/issues/229 +See: https://github.com/Leoyzen/wolfharness/issues/229 """ from __future__ import annotations @@ -19,18 +19,18 @@ import pytest -from agentpool_server.opencode_server.models.message import ( +from wolfharness_server.opencode_server.models.message import ( MessagePath, MessageTime, MessageWithParts, ) -from agentpool_server.opencode_server.opencode_message_bridge import ( +from wolfharness_server.opencode_server.opencode_message_bridge import ( append_message_to_session, ) if TYPE_CHECKING: - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.unit diff --git a/tests/servers/opencode_server/test_duplication_reproduction.py b/tests/servers/opencode_server/test_duplication_reproduction.py index 6a29b1583..443646a0a 100644 --- a/tests/servers/opencode_server/test_duplication_reproduction.py +++ b/tests/servers/opencode_server/test_duplication_reproduction.py @@ -22,15 +22,15 @@ import pytest -from agentpool.orchestrator.core import EventBus, EventEnvelope -from agentpool_server.opencode_server.models import ( +from wolfharness.orchestrator.core import EventBus, EventEnvelope +from wolfharness_server.opencode_server.models import ( MessageUpdatedEvent, MessageWithParts, PartUpdatedEvent, TextPart, UserMessage, ) -from agentpool_server.opencode_server.models.common import TimeCreated +from wolfharness_server.opencode_server.models.common import TimeCreated pytestmark = pytest.mark.integration @@ -57,7 +57,7 @@ def _make_user_message(session_id: str = "sess-dup") -> MessageWithParts: def _wrap_sse_event(data: Any, session_id: str) -> EventEnvelope: """Wrap an SSE event as the event bridge does (CustomEvent wrapper).""" - from agentpool.agents.events.events import CustomEvent + from wolfharness.agents.events.events import CustomEvent return EventEnvelope( source_session_id=session_id, diff --git a/tests/servers/opencode_server/test_elicitation_bug_coverage.py b/tests/servers/opencode_server/test_elicitation_bug_coverage.py index 18468609f..d392def65 100644 --- a/tests/servers/opencode_server/test_elicitation_bug_coverage.py +++ b/tests/servers/opencode_server/test_elicitation_bug_coverage.py @@ -30,14 +30,14 @@ from pydantic_ai.tools import DeferredToolRequests, RunContext import pytest -from agentpool.agents.context import AgentContext, AgentRunContext -from agentpool.agents.events.events import ElicitationDeferredEvent -from agentpool.agents.native_agent.elicitation_bridge import ( +from wolfharness.agents.context import AgentContext, AgentRunContext +from wolfharness.agents.events.events import ElicitationDeferredEvent +from wolfharness.agents.native_agent.elicitation_bridge import ( ElicitationFutureRegistry, create_elicitation_bridge_capability, ) -from agentpool_server.opencode_server.input_provider import OpenCodeInputProvider -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.input_provider import OpenCodeInputProvider +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -50,7 +50,7 @@ def _make_mock_session_controller(session_id: str, *, checkpoint_enabled: bool = False) -> Mock: """Create a mock SessionController with a SessionState for the given session.""" - from agentpool.orchestrator.core import SessionState + from wolfharness.orchestrator.core import SessionState session = SessionState(session_id=session_id, agent_name="test-agent") session.checkpoint_enabled = checkpoint_enabled @@ -125,8 +125,8 @@ def _make_provider( session_id, checkpoint_enabled=checkpoint_enabled ) - from agentpool_server.opencode_server.models import Session - from agentpool_server.opencode_server.models.common import TimeCreatedUpdated + from wolfharness_server.opencode_server.models import Session + from wolfharness_server.opencode_server.models.common import TimeCreatedUpdated now = 0 session = Session( @@ -188,7 +188,7 @@ async def test_mcp_elicitation_registers_pending_question( ) with patch( - "agentpool.agents.native_agent.elicitation_bridge._emit_elicitation_event", + "wolfharness.agents.native_agent.elicitation_bridge._emit_elicitation_event", new_callable=AsyncMock, ): await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -223,7 +223,7 @@ async def test_mcp_elicitation_event_published_to_event_bus( requests = _make_deferred_requests() with patch( - "agentpool.agents.native_agent.elicitation_bridge._emit_elicitation_event", + "wolfharness.agents.native_agent.elicitation_bridge._emit_elicitation_event", new_callable=AsyncMock, ) as mock_emit: await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -257,7 +257,7 @@ async def test_resolve_question_succeeds_for_mcp_handle( ) with patch( - "agentpool.agents.native_agent.elicitation_bridge._emit_elicitation_event", + "wolfharness.agents.native_agent.elicitation_bridge._emit_elicitation_event", new_callable=AsyncMock, ): await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -377,7 +377,7 @@ async def test_reply_to_mcp_elicitation_handle_succeeds( run_ctx: RunContext[Any], ) -> None: """reply_to_question succeeds for a handle registered via ElicitationBridgeCapability.""" - from agentpool_server.opencode_server.models import QuestionReply + from wolfharness_server.opencode_server.models import QuestionReply provider, _state, _controller = _make_provider("test-session") @@ -394,7 +394,7 @@ async def test_reply_to_mcp_elicitation_handle_succeeds( ) with patch( - "agentpool.agents.native_agent.elicitation_bridge._emit_elicitation_event", + "wolfharness.agents.native_agent.elicitation_bridge._emit_elicitation_event", new_callable=AsyncMock, ): await cap.handle_deferred_tool_calls(run_ctx, requests=requests) @@ -427,7 +427,7 @@ async def test_path3_broadcast_elicitation_question_called( agent_ctx: AgentContext, ) -> None: """handle_elicitation Path 3 calls broadcast_elicitation_question().""" - from agentpool.sessions.models import ElicitationResumePayload + from wolfharness.sessions.models import ElicitationResumePayload provider, _state, _controller = _make_provider("test-session", checkpoint_enabled=True) provider._broadcast_called = False @@ -493,7 +493,7 @@ class TestElicitationToolPartName: ToolPart is NOT auto-cleaned when it transitions to completed/error. This is an opencode TUI-side issue (session-data.ts) that cannot be - fixed in the agentpool repo. This test documents the behavior. + fixed in the wolfharness repo. This test documents the behavior. """ @pytest.mark.asyncio @@ -501,16 +501,16 @@ async def test_elicitation_tool_part_has_tool_name_elicitation( self, ) -> None: """ElicitationDeferredEvent creates a ToolPart with tool='elicitation'.""" - from agentpool_server.opencode_server.event_processor import EventProcessor - from agentpool_server.opencode_server.event_processor_context import ( + from wolfharness_server.opencode_server.event_processor import EventProcessor + from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) - from agentpool_server.opencode_server.models.message import ( + from wolfharness_server.opencode_server.models.message import ( MessagePath, MessageTime, MessageWithParts, ) - from agentpool_server.opencode_server.models.parts import ToolStateRunning + from wolfharness_server.opencode_server.models.parts import ToolStateRunning mock_state = MagicMock() assistant_msg = MessageWithParts.assistant( diff --git a/tests/servers/opencode_server/test_ensure_session.py b/tests/servers/opencode_server/test_ensure_session.py index 3a1bea7bf..99fe0d97a 100644 --- a/tests/servers/opencode_server/test_ensure_session.py +++ b/tests/servers/opencode_server/test_ensure_session.py @@ -6,16 +6,16 @@ import pytest -from agentpool.agents.base_agent import BaseAgent -from agentpool_server.opencode_server.models import ( +from wolfharness.agents.base_agent import BaseAgent +from wolfharness_server.opencode_server.models import ( Session, SessionIdleEvent, SessionStatusEvent, SessionUpdatedEvent, TimeCreatedUpdated, ) -from agentpool_server.opencode_server.session_pool_integration import ensure_session -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.session_pool_integration import ensure_session +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -63,12 +63,12 @@ async def test_ensure_session_creates_new_session(mock_state: ServerState) -> No parent_id = "parent_session_456" with patch( - "agentpool_server.opencode_server.converters.opencode_to_session_data" + "wolfharness_server.opencode_server.converters.opencode_to_session_data" ) as mock_converter: mock_converter.return_value = MagicMock() with patch( - "agentpool_server.opencode_server.input_provider.OpenCodeInputProvider" + "wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider" ) as mock_provider_class: mock_provider = MagicMock() mock_provider_class.return_value = mock_provider @@ -114,13 +114,13 @@ async def test_ensure_session_persists_to_storage(mock_state: ServerState) -> No session_id = "test_session_789" with patch( - "agentpool_server.opencode_server.converters.opencode_to_session_data" + "wolfharness_server.opencode_server.converters.opencode_to_session_data" ) as mock_converter: mock_session_data = MagicMock() mock_converter.return_value = mock_session_data with patch( - "agentpool_server.opencode_server.input_provider.OpenCodeInputProvider" + "wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider" ) as mock_provider_class: mock_provider_class.return_value = MagicMock() @@ -144,9 +144,9 @@ async def test_ensure_session_caches_in_memory(mock_state: ServerState) -> None: session_id = "test_session_abc" with ( - patch("agentpool_server.opencode_server.converters.opencode_to_session_data"), + patch("wolfharness_server.opencode_server.converters.opencode_to_session_data"), patch( - "agentpool_server.opencode_server.input_provider.OpenCodeInputProvider" + "wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider" ) as mock_provider_class, ): mock_provider = MagicMock() @@ -178,8 +178,8 @@ async def test_ensure_session_broadcasts_idle_events(mock_state: ServerState) -> session_id = "test_session_idle_event" with ( - patch("agentpool_server.opencode_server.converters.opencode_to_session_data"), - patch("agentpool_server.opencode_server.input_provider.OpenCodeInputProvider"), + patch("wolfharness_server.opencode_server.converters.opencode_to_session_data"), + patch("wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider"), patch.object(mock_state, "broadcast_event", new=AsyncMock()) as mock_broadcast, ): await ensure_session(mock_state, session_id) @@ -206,9 +206,9 @@ async def test_ensure_session_creates_input_provider(mock_state: ServerState) -> session_id = "test_session_def" with ( - patch("agentpool_server.opencode_server.converters.opencode_to_session_data"), + patch("wolfharness_server.opencode_server.converters.opencode_to_session_data"), patch( - "agentpool_server.opencode_server.input_provider.OpenCodeInputProvider" + "wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider" ) as mock_provider_class, ): mock_provider = MagicMock() @@ -227,8 +227,8 @@ async def test_ensure_session_without_parent_id(mock_state: ServerState) -> None session_id = "test_session_no_parent" with ( - patch("agentpool_server.opencode_server.converters.opencode_to_session_data"), - patch("agentpool_server.opencode_server.input_provider.OpenCodeInputProvider"), + patch("wolfharness_server.opencode_server.converters.opencode_to_session_data"), + patch("wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider"), ): result = await ensure_session(mock_state, session_id) @@ -242,8 +242,8 @@ async def test_ensure_session_is_idempotent(mock_state: ServerState) -> None: session_id = "test_session_idempotent" with ( - patch("agentpool_server.opencode_server.converters.opencode_to_session_data"), - patch("agentpool_server.opencode_server.input_provider.OpenCodeInputProvider"), + patch("wolfharness_server.opencode_server.converters.opencode_to_session_data"), + patch("wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider"), ): result1 = await ensure_session(mock_state, session_id) result2 = await ensure_session(mock_state, session_id) @@ -318,8 +318,8 @@ async def test_ensure_session_child_inherits_parent_project_and_directory( mock_state.sessions[parent_id] = parent_session with ( - patch("agentpool_server.opencode_server.converters.opencode_to_session_data"), - patch("agentpool_server.opencode_server.input_provider.OpenCodeInputProvider"), + patch("wolfharness_server.opencode_server.converters.opencode_to_session_data"), + patch("wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider"), ): child = await ensure_session(mock_state, child_id, parent_id=parent_id) @@ -340,8 +340,8 @@ async def test_ensure_session_child_falls_back_when_parent_missing( orphan_parent_id = "nonexistent_parent" with ( - patch("agentpool_server.opencode_server.converters.opencode_to_session_data"), - patch("agentpool_server.opencode_server.input_provider.OpenCodeInputProvider"), + patch("wolfharness_server.opencode_server.converters.opencode_to_session_data"), + patch("wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider"), ): child = await ensure_session(mock_state, child_id, parent_id=orphan_parent_id) @@ -362,8 +362,8 @@ async def test_ensure_session_child_skips_agent_binding(mock_state: ServerState) parent_id = "parent_session_xyz" with ( - patch("agentpool_server.opencode_server.converters.opencode_to_session_data"), - patch("agentpool_server.opencode_server.input_provider.OpenCodeInputProvider"), + patch("wolfharness_server.opencode_server.converters.opencode_to_session_data"), + patch("wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider"), ): result = await ensure_session(mock_state, session_id, parent_id=parent_id) diff --git a/tests/servers/opencode_server/test_ensure_session_idle.py b/tests/servers/opencode_server/test_ensure_session_idle.py index 2a11178ae..5b71d3765 100644 --- a/tests/servers/opencode_server/test_ensure_session_idle.py +++ b/tests/servers/opencode_server/test_ensure_session_idle.py @@ -15,11 +15,11 @@ import pytest -from agentpool_server.opencode_server.routes.session_routes import _ensure_session_idle +from wolfharness_server.opencode_server.routes.session_routes import _ensure_session_idle if TYPE_CHECKING: - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.unit @@ -126,7 +126,7 @@ async def _hang_forever(_session_id: str) -> str: state = _make_state(session_state=session_state, session_pool=session_pool) with patch( - "agentpool_server.opencode_server.routes.session_routes._IDLE_WAIT_TIMEOUT", + "wolfharness_server.opencode_server.routes.session_routes._IDLE_WAIT_TIMEOUT", 0.05, ): await _ensure_session_idle(state, "sess-1") diff --git a/tests/servers/opencode_server/test_event_adaptation.py b/tests/servers/opencode_server/test_event_adaptation.py index 82c74d322..568ff531f 100644 --- a/tests/servers/opencode_server/test_event_adaptation.py +++ b/tests/servers/opencode_server/test_event_adaptation.py @@ -21,7 +21,7 @@ ) import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( PartDeltaEvent as AgentPoolPartDeltaEvent, PartStartEvent, RunErrorEvent, @@ -32,11 +32,11 @@ ToolCallProgressEvent, ToolCallStartEvent, ) -from agentpool_server.opencode_server.event_adapter import OpenCodeEventAdapter -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness_server.opencode_server.event_adapter import OpenCodeEventAdapter +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, @@ -45,7 +45,7 @@ SessionErrorEvent, SessionStatusEvent, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( ReasoningPart, StepFinishPart, TextPart, @@ -79,7 +79,7 @@ def adapter_context() -> EventProcessorContext: time=MessageTime(created=0), agent_name="test-agent", model_id="test-model", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), parent_id="msg-000", ) @@ -746,7 +746,7 @@ async def test_part_end_produces_no_output( assert len(events) == 0, "PartEndEvent should not produce any OpenCode events" @pytest.mark.asyncio - async def test_no_agentpool_events_leak_through( + async def test_no_wolfharness_events_leak_through( self, adapter_context: EventProcessorContext, ) -> None: @@ -773,7 +773,7 @@ async def test_no_agentpool_events_leak_through( @pytest.fixture def event_context(): """Create an event context for testing event conversion.""" - from agentpool_server.opencode_server.event_processor_context import ( + from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) @@ -785,7 +785,7 @@ def event_context(): time=MessageTime(created=0), agent_name="test-agent", model_id="test-model", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), parent_id="msg-000", ) @@ -850,7 +850,7 @@ async def test_text_part_start_creates_text_part( event_context, ) -> None: """PartStartEvent with TextPart should yield PartUpdatedEvent with TextPart.""" - from agentpool.agents.events import PartStartEvent + from wolfharness.agents.events import PartStartEvent adapter = OpenCodeEventAdapter(context=event_context) @@ -868,7 +868,7 @@ async def test_thinking_part_start_creates_reasoning_part( event_context, ) -> None: """PartStartEvent with ThinkingPart should yield PartUpdatedEvent with ReasoningPart.""" - from agentpool.agents.events import PartStartEvent + from wolfharness.agents.events import PartStartEvent adapter = OpenCodeEventAdapter(context=event_context) @@ -877,7 +877,7 @@ async def test_thinking_part_start_creates_reasoning_part( part_updated = [e for e in events if isinstance(e, PartUpdatedEvent)] assert len(part_updated) == 1 - from agentpool_server.opencode_server.models.parts import ReasoningPart + from wolfharness_server.opencode_server.models.parts import ReasoningPart assert isinstance(part_updated[0].properties.part, ReasoningPart) assert part_updated[0].properties.part.text == "Let me think..." @@ -913,7 +913,7 @@ async def test_text_delta_yields_part_delta_event( event_context, ) -> None: """Text delta should yield PartDeltaEvent.""" - from agentpool.agents.events import ( + from wolfharness.agents.events import ( PartDeltaEvent as AgentPoolPartDeltaEvent, PartStartEvent, ) @@ -938,7 +938,7 @@ async def test_thinking_delta_yields_part_delta_event( event_context, ) -> None: """Thinking delta should yield PartDeltaEvent.""" - from agentpool.agents.events import ( + from wolfharness.agents.events import ( PartDeltaEvent as AgentPoolPartDeltaEvent, PartStartEvent, ) @@ -1335,7 +1335,7 @@ async def test_convert_stream_yields_all_events(self, event_context) -> None: """convert_stream should yield OpenCode events for all AgentPool events.""" async def _make_stream(): - from agentpool.agents.events import PartStartEvent + from wolfharness.agents.events import PartStartEvent yield PartStartEvent.text(index=0, content="Hello") yield PartStartEvent.text(index=1, content="World") @@ -1361,7 +1361,7 @@ async def test_all_required_events_have_handlers( event_context, ) -> None: """Every required AgentPool event type should have a conversion handler.""" - from agentpool.agents.events import ( + from wolfharness.agents.events import ( PartDeltaEvent, PartStartEvent, ToolCallCompleteEvent, @@ -1392,12 +1392,12 @@ async def test_all_required_events_have_handlers( assert len(events) >= 1, f"Event {type(event).__name__} produced no output" @pytest.mark.asyncio - async def test_no_agentpool_events_leak_through( + async def test_no_wolfharness_events_leak_through( self, event_context, ) -> None: """Converted events should all be OpenCode Event types, never raw AgentPool events.""" - from agentpool.agents.events import RunStartedEvent + from wolfharness.agents.events import RunStartedEvent adapter = OpenCodeEventAdapter(context=event_context) diff --git a/tests/servers/opencode_server/test_event_bridge.py b/tests/servers/opencode_server/test_event_bridge.py index df4f13bd2..de6ecab8d 100644 --- a/tests/servers/opencode_server/test_event_bridge.py +++ b/tests/servers/opencode_server/test_event_bridge.py @@ -13,18 +13,18 @@ import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( CustomEvent, RunFailedEvent, RunStartedEvent, StreamCompleteEvent, ) -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventBus, EventEnvelope -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventBus, EventEnvelope +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessagePath, MessageTime, @@ -34,11 +34,11 @@ SessionStatus, SessionStatusEvent, ) -from agentpool_server.opencode_server.models.events import ServerConnectedEvent -from agentpool_server.opencode_server.opencode_event_bridge import ( +from wolfharness_server.opencode_server.models.events import ServerConnectedEvent +from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -48,7 +48,7 @@ from collections.abc import AsyncIterator from pathlib import Path - from agentpool_server.opencode_server.models.events import Event + from wolfharness_server.opencode_server.models.events import Event # ============================================================================= @@ -59,7 +59,7 @@ @pytest.fixture def bridged_state(tmp_project_dir: Path, mock_agent: Mock) -> ServerState: """Create a ServerState with an active OpenCodeEventBridge.""" - from agentpool.orchestrator.core import EventBus + from wolfharness.orchestrator.core import EventBus # Wire a real EventBus into the mock pool so __post_init__ can discover it mock_agent.host_context.session_pool.event_bus = EventBus() @@ -535,11 +535,11 @@ async def test_stream_complete_sets_time_completed() -> None: with ( patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ) as mock_append, ): @@ -578,11 +578,11 @@ async def test_stream_complete_skips_if_already_completed() -> None: with ( patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ) as mock_append, ): @@ -632,11 +632,11 @@ async def test_d1_reset_finalizes_previous_turn() -> None: with ( patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ) as mock_append, ): @@ -699,11 +699,11 @@ async def test_d1_reset_skips_finalize_if_already_completed() -> None: with ( patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ) as mock_append, ): @@ -732,7 +732,7 @@ async def test_d2_warning_logged_on_incomplete_turn() -> None: """ from unittest.mock import AsyncMock, patch - import agentpool_server.opencode_server.opencode_event_bridge as bridge_module + import wolfharness_server.opencode_server.opencode_event_bridge as bridge_module session_id = "sess-d2" bridge, _ctx, _broadcast_calls = _setup_bridge_for_handle( @@ -748,11 +748,11 @@ async def test_d2_warning_logged_on_incomplete_turn() -> None: with ( patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ), patch.object(bridge_module.logger, "warning") as mock_warning, @@ -792,11 +792,11 @@ async def test_run_failed_sets_time_completed() -> None: with ( patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ) as mock_append, ): @@ -839,11 +839,11 @@ async def test_stream_complete_cancelled_sets_time_completed() -> None: with ( patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ), ): @@ -877,11 +877,11 @@ async def test_finalize_skips_when_no_context() -> None: with ( patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ) as mock_append, ): diff --git a/tests/servers/opencode_server/test_event_pipeline_e2e.py b/tests/servers/opencode_server/test_event_pipeline_e2e.py index 9b732460b..0c4a4a22b 100644 --- a/tests/servers/opencode_server/test_event_pipeline_e2e.py +++ b/tests/servers/opencode_server/test_event_pipeline_e2e.py @@ -23,37 +23,37 @@ ) import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( RunStartedEvent, StreamCompleteEvent, ToolCallCompleteEvent, ToolCallProgressEvent, ToolCallStartEvent, ) -from agentpool.messaging import ChatMessage -from agentpool_server.opencode_server.models import PartDeltaEvent, PartUpdatedEvent -from agentpool_server.opencode_server.models.events import ( +from wolfharness.messaging import ChatMessage +from wolfharness_server.opencode_server.models import PartDeltaEvent, PartUpdatedEvent +from wolfharness_server.opencode_server.models.events import ( SessionErrorEvent, SessionStatusEvent, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( StepFinishPart, TextPart, ToolPart, ToolStateCompleted, ToolStateRunning, ) -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration if TYPE_CHECKING: - from agentpool.orchestrator.core import SessionPool + from wolfharness.orchestrator.core import SessionPool # ============================================================================= @@ -74,8 +74,8 @@ def _extract_opencode_events(sse_queue: Any) -> list[Any]: event. This helper filters for CustomEvent wrappers and extracts the underlying OpenCode event from ``.event_data``. """ - from agentpool.agents.events.events import CustomEvent - from agentpool.orchestrator.core import EventEnvelope + from wolfharness.agents.events.events import CustomEvent + from wolfharness.orchestrator.core import EventEnvelope result: list[Any] = [] while not _stream_empty(sse_queue): @@ -117,7 +117,7 @@ def server_state(tmp_path: Any) -> ServerState: @pytest.fixture async def session_pool(server_state: ServerState): # type: ignore[no-untyped-def] """Create a real SessionPool with a real EventBus.""" - from agentpool.orchestrator.core import SessionPool + from wolfharness.orchestrator.core import SessionPool pool_mock = Mock() pool_mock.main_agent = Mock() @@ -144,7 +144,7 @@ async def session_pool(server_state: ServerState): # type: ignore[no-untyped-de server_state._pool = pool_mock pool_mock.session_pool = sp # Re-initialize event_bridge now that event_bus is available - from agentpool_server.opencode_server.event_bridge import OpenCodeEventBridge + from wolfharness_server.opencode_server.event_bridge import OpenCodeEventBridge server_state.event_bridge = OpenCodeEventBridge(server_state, sp.event_bus) @@ -480,7 +480,7 @@ async def test_run_error_produces_session_error( Verifies error events pass through event_bridge correctly. """ - from agentpool.agents.events import RunErrorEvent + from wolfharness.agents.events import RunErrorEvent integration = OpenCodeSessionPoolIntegration( session_pool=session_pool, diff --git a/tests/servers/opencode_server/test_event_processor.py b/tests/servers/opencode_server/test_event_processor.py index 827dd765f..617344308 100644 --- a/tests/servers/opencode_server/test_event_processor.py +++ b/tests/servers/opencode_server/test_event_processor.py @@ -16,11 +16,11 @@ ) import pytest -from agentpool_server.opencode_server.event_processor import EventProcessor -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness_server.opencode_server.event_processor import EventProcessor +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, @@ -35,7 +35,7 @@ if TYPE_CHECKING: - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState # ============================================================================= @@ -61,7 +61,7 @@ async def test_process_text_start_creates_text_part(server_state: ServerState) - agent_name="test-agent", model_id="test-model", parent_id="parent-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -112,7 +112,7 @@ async def test_process_text_delta_accumulates_text(server_state: ServerState) -> agent_name="test-agent", model_id="test-model", parent_id="parent-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -165,7 +165,7 @@ async def test_process_text_delta_without_start(server_state: ServerState) -> No agent_name="test-agent", model_id="test-model", parent_id="parent-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -209,7 +209,7 @@ def _make_stream_complete_context(server_state: ServerState) -> EventProcessorCo agent_name="test-agent", model_id="test-model", parent_id="parent-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) return EventProcessorContext( @@ -224,8 +224,8 @@ def _make_stream_complete_context(server_state: ServerState) -> EventProcessorCo @pytest.mark.asyncio async def test_stream_complete_emits_idle_status(server_state: ServerState) -> None: """Test that a completed StreamCompleteEvent emits SessionStatusEvent(idle).""" - from agentpool.agents.events import StreamCompleteEvent - from agentpool.messaging import ChatMessage + from wolfharness.agents.events import StreamCompleteEvent + from wolfharness.messaging import ChatMessage processor = EventProcessor() ctx = _make_stream_complete_context(server_state) @@ -243,8 +243,8 @@ async def test_stream_complete_emits_idle_status(server_state: ServerState) -> N @pytest.mark.asyncio async def test_stream_complete_emits_cancelled_status(server_state: ServerState) -> None: """Test that a cancelled StreamCompleteEvent emits SessionStatusEvent(cancelled).""" - from agentpool.agents.events import StreamCompleteEvent - from agentpool.messaging import ChatMessage + from wolfharness.agents.events import StreamCompleteEvent + from wolfharness.messaging import ChatMessage processor = EventProcessor() ctx = _make_stream_complete_context(server_state) @@ -266,7 +266,7 @@ async def test_stream_complete_emits_cancelled_status(server_state: ServerState) def test_create_mcp_tools_changed_event() -> None: """EventProcessor.create_mcp_tools_changed_event creates correct event.""" - from agentpool_server.opencode_server.models.events import McpToolsChangedEvent + from wolfharness_server.opencode_server.models.events import McpToolsChangedEvent processor = EventProcessor() event = processor.create_mcp_tools_changed_event(server="my_mcp_server") @@ -284,8 +284,8 @@ async def test_mcp_tools_changed_event_from_change_event() -> None: 1. McpServerCap.on_change() yields ChangeEvent(kind="tools_changed") 2. EventProcessor.create_mcp_tools_changed_event() converts to McpToolsChangedEvent """ - from agentpool.capabilities.change_event import ChangeEvent - from agentpool_server.opencode_server.models.events import McpToolsChangedEvent + from wolfharness.capabilities.change_event import ChangeEvent + from wolfharness_server.opencode_server.models.events import McpToolsChangedEvent processor = EventProcessor() diff --git a/tests/servers/opencode_server/test_event_processor_diff.py b/tests/servers/opencode_server/test_event_processor_diff.py index 2605a1165..fa1d24b40 100644 --- a/tests/servers/opencode_server/test_event_processor_diff.py +++ b/tests/servers/opencode_server/test_event_processor_diff.py @@ -2,7 +2,7 @@ The opencode TUI Edit component reads ``metadata.diff`` as a unified diff text string (produced by ``createTwoFilesPatch`` in opencode's edit.ts). -The agentpool event_processor must convert ``DiffContentItem`` from +The wolfharness event_processor must convert ``DiffContentItem`` from ``ToolCallProgressEvent`` into that text format and carry it through to ``ToolStateCompleted.metadata.diff`` so the TUI can render the diff view. """ @@ -11,13 +11,13 @@ import pytest -from agentpool.agents.events import DiffContentItem, ToolCallProgressEvent -from agentpool.agents.events.events import ToolCallCompleteEvent, ToolCallStartEvent -from agentpool_server.opencode_server.event_processor import EventProcessor -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.agents.events import DiffContentItem, ToolCallProgressEvent +from wolfharness.agents.events.events import ToolCallCompleteEvent, ToolCallStartEvent +from wolfharness_server.opencode_server.event_processor import EventProcessor +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models.message import ( +from wolfharness_server.opencode_server.models.message import ( MessagePath, MessageTime, MessageWithParts, @@ -33,7 +33,7 @@ def _make_ctx(server_state: object) -> EventProcessorContext: agent_name="test-agent", model_id="test-model", parent_id="parent-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) return EventProcessorContext( @@ -282,7 +282,7 @@ async def test_text_content_becomes_tool_output( server_state: object, ) -> None: """TextContentItem → appended to ctx.tool_outputs for the tool part.""" - from agentpool.agents.events import TextContentItem + from wolfharness.agents.events import TextContentItem processor = EventProcessor() ctx = _make_ctx(server_state) diff --git a/tests/servers/opencode_server/test_event_processor_user_message.py b/tests/servers/opencode_server/test_event_processor_user_message.py index 2e243eb82..505852d23 100644 --- a/tests/servers/opencode_server/test_event_processor_user_message.py +++ b/tests/servers/opencode_server/test_event_processor_user_message.py @@ -14,15 +14,15 @@ import pytest -from agentpool.agents.events import UserMessageInsertedEvent -from agentpool_server.opencode_server.event_processor import ( +from wolfharness.agents.events import UserMessageInsertedEvent +from wolfharness_server.opencode_server.event_processor import ( EventProcessor, OpenCodeUserMessageMeta, ) -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageUpdatedEvent, @@ -36,7 +36,7 @@ if TYPE_CHECKING: - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState def _make_ctx(server_state: ServerState) -> EventProcessorContext: @@ -48,7 +48,7 @@ def _make_ctx(server_state: ServerState) -> EventProcessorContext: agent_name="test-agent", model_id="test-model", parent_id="parent-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) return EventProcessorContext( diff --git a/tests/servers/opencode_server/test_event_processor_user_message_integration.py b/tests/servers/opencode_server/test_event_processor_user_message_integration.py index b91240303..d52d49909 100644 --- a/tests/servers/opencode_server/test_event_processor_user_message_integration.py +++ b/tests/servers/opencode_server/test_event_processor_user_message_integration.py @@ -14,15 +14,15 @@ import pytest -from agentpool.agents.events import UserMessageInsertedEvent -from agentpool_server.opencode_server.event_processor import ( +from wolfharness.agents.events import UserMessageInsertedEvent +from wolfharness_server.opencode_server.event_processor import ( EventProcessor, OpenCodeUserMessageMeta, ) -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageUpdatedEvent, @@ -36,7 +36,7 @@ if TYPE_CHECKING: - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState def _make_ctx(server_state: ServerState) -> EventProcessorContext: @@ -48,7 +48,7 @@ def _make_ctx(server_state: ServerState) -> EventProcessorContext: agent_name="test-agent", model_id="test-model", parent_id="parent-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) return EventProcessorContext( diff --git a/tests/servers/opencode_server/test_file_diff_models.py b/tests/servers/opencode_server/test_file_diff_models.py index ab9c71154..94e6cd940 100644 --- a/tests/servers/opencode_server/test_file_diff_models.py +++ b/tests/servers/opencode_server/test_file_diff_models.py @@ -6,7 +6,7 @@ import pytest -from agentpool_server.opencode_server.models.common import FileDiff +from wolfharness_server.opencode_server.models.common import FileDiff pytestmark = pytest.mark.integration @@ -22,7 +22,7 @@ class _StubFileChange: def to_unified_diff(self) -> str: """Return a minimal unified diff string.""" - from agentpool.utils.diffs import compute_unified_diff + from wolfharness.utils.diffs import compute_unified_diff return compute_unified_diff( self.old_content or "", diff --git a/tests/servers/opencode_server/test_global_compat_routes.py b/tests/servers/opencode_server/test_global_compat_routes.py index 7001cac0c..ddc8dea57 100644 --- a/tests/servers/opencode_server/test_global_compat_routes.py +++ b/tests/servers/opencode_server/test_global_compat_routes.py @@ -16,14 +16,14 @@ from fastapi.testclient import TestClient import pytest -from agentpool.models.manifest import AgentsManifest -from agentpool.storage import StorageManager -from agentpool.utils.streams import FileOpsTracker -from agentpool.utils.todos import TodoTracker -from agentpool_server.opencode_server.dependencies import get_state -from agentpool_server.opencode_server.routes.config_routes import router as config_router -from agentpool_server.opencode_server.routes.global_routes import router as global_router -from agentpool_server.opencode_server.state import ServerState +from wolfharness.models.manifest import AgentsManifest +from wolfharness.storage import StorageManager +from wolfharness.utils.streams import FileOpsTracker +from wolfharness.utils.todos import TodoTracker +from wolfharness_server.opencode_server.dependencies import get_state +from wolfharness_server.opencode_server.routes.config_routes import router as config_router +from wolfharness_server.opencode_server.routes.global_routes import router as global_router +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -36,7 +36,7 @@ @pytest.fixture def _server_state(tmp_path: Path) -> ServerState: """Build a ServerState with a mock agent for config route tests.""" - from agentpool_config.storage import MemoryStorageConfig, StorageConfig + from wolfharness_config.storage import MemoryStorageConfig, StorageConfig storage_manager = StorageManager(config=StorageConfig(providers=[MemoryStorageConfig()])) file_ops = FileOpsTracker() diff --git a/tests/servers/opencode_server/test_global_event.py b/tests/servers/opencode_server/test_global_event.py index 6a5ccbfa8..fe61910b7 100644 --- a/tests/servers/opencode_server/test_global_event.py +++ b/tests/servers/opencode_server/test_global_event.py @@ -11,10 +11,10 @@ import pytest -from agentpool_server.opencode_server.models import GlobalEvent -from agentpool_server.opencode_server.models.app import ProjectTime -from agentpool_server.opencode_server.models.common import TimeCreated -from agentpool_server.opencode_server.models.events import ( +from wolfharness_server.opencode_server.models import GlobalEvent +from wolfharness_server.opencode_server.models.app import ProjectTime +from wolfharness_server.opencode_server.models.common import TimeCreated +from wolfharness_server.opencode_server.models.events import ( CommandExecutedEvent, Event, FileEditedEvent, @@ -58,26 +58,26 @@ TuiToastShowEvent, VcsBranchUpdatedEvent, ) -from agentpool_server.opencode_server.models.message import ( +from wolfharness_server.opencode_server.models.message import ( UserMessage, ) -from agentpool_server.opencode_server.models.parts import Part, TextPart -from agentpool_server.opencode_server.models.pty import PtyInfo -from agentpool_server.opencode_server.models.question import ( +from wolfharness_server.opencode_server.models.parts import Part, TextPart +from wolfharness_server.opencode_server.models.pty import PtyInfo +from wolfharness_server.opencode_server.models.question import ( QuestionInfo, QuestionOption, ) -from agentpool_server.opencode_server.models.session import ( +from wolfharness_server.opencode_server.models.session import ( Session, TimeCreatedUpdated, ) -from agentpool_server.opencode_server.routes.global_routes import ( +from wolfharness_server.opencode_server.routes.global_routes import ( GlobalEventFactory, _event_generator, _extract_session_id, _serialize_event, ) -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.state import ServerState if TYPE_CHECKING: @@ -234,7 +234,7 @@ async def unsubscribe(self, session_id: str, queue: asyncio.Queue[Any]) -> None: queue.shutdown() async def publish(self, session_id: str, event: Any) -> None: - from agentpool.orchestrator.core import EventEnvelope + from wolfharness.orchestrator.core import EventEnvelope envelope = EventEnvelope(source_session_id=session_id, event=event) for subscriber_sid, subscribers in self._subscribers.items(): @@ -282,7 +282,7 @@ def __init__(self, working_dir: str = "/tmp/test_wd") -> None: def get_event_factory(self) -> GlobalEventFactory: if self._event_factory is None: - from agentpool_storage.opencode_provider import helpers + from wolfharness_storage.opencode_provider import helpers self._event_factory = GlobalEventFactory( directory=self.working_dir, @@ -541,7 +541,7 @@ async def test_global_event_integration_project_computed( server_state: ServerState, ) -> None: """Test project field is computed via compute_project_id.""" - from agentpool_storage.opencode_provider.helpers import compute_project_id + from wolfharness_storage.opencode_provider.helpers import compute_project_id event = SessionStatusEvent.create(session_id="s3", status_type="busy") results = await _collect_real_events(server_state, wrap_payload=True, events_to_send=[event]) @@ -1113,7 +1113,7 @@ def test_session_id_properties_base_class_hierarchy() -> None: SessionIdProperties, and that SessionErrorProperties (which has session_id: str | None) does NOT inherit from it. """ - from agentpool_server.opencode_server.models.events import SessionErrorProperties + from wolfharness_server.opencode_server.models.events import SessionErrorProperties # SessionIdProperties must have session_id: str assert "session_id" in SessionIdProperties.model_fields @@ -1364,7 +1364,7 @@ async def test_global_health_endpoint(async_client: AsyncClient) -> None: @pytest.mark.anyio async def test_global_health_endpoint_fields(async_client: AsyncClient) -> None: """GET /global/health returns correct healthy and version fields.""" - from agentpool_server.opencode_server.routes.global_routes import VERSION + from wolfharness_server.opencode_server.routes.global_routes import VERSION response = await async_client.get("/global/health") data = response.json() diff --git a/tests/servers/opencode_server/test_init_session.py b/tests/servers/opencode_server/test_init_session.py index bc2f5027b..e18003122 100644 --- a/tests/servers/opencode_server/test_init_session.py +++ b/tests/servers/opencode_server/test_init_session.py @@ -11,7 +11,7 @@ if TYPE_CHECKING: from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState pytestmark = [pytest.mark.asyncio, pytest.mark.integration] diff --git a/tests/servers/opencode_server/test_list_sessions_restore.py b/tests/servers/opencode_server/test_list_sessions_restore.py index 9bf051d2e..59d1b660d 100644 --- a/tests/servers/opencode_server/test_list_sessions_restore.py +++ b/tests/servers/opencode_server/test_list_sessions_restore.py @@ -13,10 +13,10 @@ import pytest -from agentpool.sessions.models import SessionData -from agentpool_server.opencode_server.models import Session -from agentpool_server.opencode_server.models.common import TimeCreatedUpdated -from agentpool_server.opencode_server.routes.session_routes import list_sessions +from wolfharness.sessions.models import SessionData +from wolfharness_server.opencode_server.models import Session +from wolfharness_server.opencode_server.models.common import TimeCreatedUpdated +from wolfharness_server.opencode_server.routes.session_routes import list_sessions pytestmark = pytest.mark.integration @@ -109,7 +109,7 @@ async def test_list_sessions_returns_persisted_sessions_after_restart(): state = _make_state(store=store, session_controller_sessions=[]) with patch( - "agentpool_server.opencode_server.routes.session_routes.session_data_to_opencode" + "wolfharness_server.opencode_server.routes.session_routes.session_data_to_opencode" ) as mock_convert: mock_convert.side_effect = lambda data: _make_session( data.session_id, directory=data.cwd or "/test", title=data.metadata.get("title", "") @@ -144,7 +144,7 @@ async def test_in_memory_session_overrides_store_version(): ) with patch( - "agentpool_server.opencode_server.routes.session_routes.session_data_to_opencode" + "wolfharness_server.opencode_server.routes.session_routes.session_data_to_opencode" ) as mock_convert: mock_convert.return_value = _make_session("ses_1", directory="/test", title="From Store") result = await list_sessions(state, directory="/test") @@ -195,7 +195,7 @@ async def test_python_cwd_filter_catches_other_directories(): state = _make_state(store=store, session_controller_sessions=[]) with patch( - "agentpool_server.opencode_server.routes.session_routes.session_data_to_opencode" + "wolfharness_server.opencode_server.routes.session_routes.session_data_to_opencode" ) as mock_convert: mock_convert.side_effect = lambda data: _make_session( data.session_id, directory=data.cwd or "", title=data.metadata.get("title", "") @@ -218,7 +218,7 @@ async def test_legacy_path_when_no_session_controller(): state.session_controller = None with patch( - "agentpool_server.opencode_server.routes.session_routes.session_data_to_opencode" + "wolfharness_server.opencode_server.routes.session_routes.session_data_to_opencode" ) as mock_convert: mock_convert.return_value = _make_session("ses_1", directory="/test") result = await list_sessions(state, directory="/test") @@ -239,7 +239,7 @@ async def test_cwd_filter_on_store_first_path(): state = _make_state(store=store, session_controller_sessions=[]) with patch( - "agentpool_server.opencode_server.routes.session_routes.session_data_to_opencode" + "wolfharness_server.opencode_server.routes.session_routes.session_data_to_opencode" ) as mock_convert: mock_convert.return_value = _make_session("ses_1", directory="/test") await list_sessions(state, directory="/test") @@ -316,7 +316,7 @@ async def test_merged_list_sorted_by_recency(): state = _make_state(store=store, session_controller_sessions=[]) with patch( - "agentpool_server.opencode_server.routes.session_routes.session_data_to_opencode" + "wolfharness_server.opencode_server.routes.session_routes.session_data_to_opencode" ) as mock_convert: mock_convert.side_effect = lambda data: _make_session( data.session_id, @@ -383,7 +383,7 @@ async def test_state_sessions_cache_populated(): state = _make_state(store=store, session_controller_sessions=[]) with patch( - "agentpool_server.opencode_server.routes.session_routes.session_data_to_opencode" + "wolfharness_server.opencode_server.routes.session_routes.session_data_to_opencode" ) as mock_convert: mock_convert.return_value = _make_session("ses_1", directory="/test") await list_sessions(state, directory="/test") diff --git a/tests/servers/opencode_server/test_mcp_routes.py b/tests/servers/opencode_server/test_mcp_routes.py index 8c4c5f515..28496832b 100644 --- a/tests/servers/opencode_server/test_mcp_routes.py +++ b/tests/servers/opencode_server/test_mcp_routes.py @@ -10,7 +10,7 @@ import pytest -from agentpool.common_types import MCPServerStatus +from wolfharness.common_types import MCPServerStatus if TYPE_CHECKING: @@ -18,7 +18,7 @@ from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState pytestmark = [pytest.mark.asyncio, pytest.mark.integration] diff --git a/tests/servers/opencode_server/test_mcp_status_behavior.py b/tests/servers/opencode_server/test_mcp_status_behavior.py index fd5d954ac..ede4325d5 100644 --- a/tests/servers/opencode_server/test_mcp_status_behavior.py +++ b/tests/servers/opencode_server/test_mcp_status_behavior.py @@ -24,15 +24,15 @@ import pytest import yamling -from agentpool import AgentPool, AgentsManifest -from agentpool.capabilities.mcp_server_cap import McpServerCap -from agentpool_server.opencode_server.dependencies import get_state -from agentpool_server.opencode_server.routes import agent_router -from agentpool_server.opencode_server.state import ServerState +from wolfharness import AgentPool, AgentsManifest +from wolfharness.capabilities.mcp_server_cap import McpServerCap +from wolfharness_server.opencode_server.dependencies import get_state +from wolfharness_server.opencode_server.routes import agent_router +from wolfharness_server.opencode_server.state import ServerState if TYPE_CHECKING: - from agentpool_config.mcp_server import MCPServerConfig + from wolfharness_config.mcp_server import MCPServerConfig pytestmark = [pytest.mark.asyncio, pytest.mark.integration] diff --git a/tests/servers/opencode_server/test_mcp_status_converter.py b/tests/servers/opencode_server/test_mcp_status_converter.py index 09bacc825..3df05ebac 100644 --- a/tests/servers/opencode_server/test_mcp_status_converter.py +++ b/tests/servers/opencode_server/test_mcp_status_converter.py @@ -9,8 +9,8 @@ import pytest -from agentpool.common_types import MCPServerStatus -from agentpool_server.opencode_server.converters import to_mcp_status +from wolfharness.common_types import MCPServerStatus +from wolfharness_server.opencode_server.converters import to_mcp_status pytestmark = pytest.mark.unit diff --git a/tests/servers/opencode_server/test_message_id_alignment.py b/tests/servers/opencode_server/test_message_id_alignment.py index 548d6da15..35903f3fa 100644 --- a/tests/servers/opencode_server/test_message_id_alignment.py +++ b/tests/servers/opencode_server/test_message_id_alignment.py @@ -15,10 +15,10 @@ import pytest -from agentpool.lifecycle.types import DeliveryMode -from agentpool_server.opencode_server.event_processor_context import EventProcessorContext -from agentpool_server.opencode_server.models import MessagePath, MessageTime, MessageWithParts -from agentpool_server.opencode_server.models.message import ( +from wolfharness.lifecycle.types import DeliveryMode +from wolfharness_server.opencode_server.event_processor_context import EventProcessorContext +from wolfharness_server.opencode_server.models import MessagePath, MessageTime, MessageWithParts +from wolfharness_server.opencode_server.models.message import ( CommandRequest, MessageRequest, TextPartInput, @@ -122,7 +122,7 @@ class TestRouteMessagePassesMessageId: @pytest.mark.asyncio async def test_route_message_stores_pending_message_id(self): """route_message should store message_id in _pending_message_ids.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -137,7 +137,7 @@ async def test_route_message_stores_pending_message_id(self): server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) server_state.broadcast_event = AsyncMock() integration = OpenCodeSessionPoolIntegration(session_pool, server_state) @@ -160,7 +160,7 @@ async def test_route_message_stores_pending_message_id(self): @pytest.mark.asyncio async def test_route_message_passes_message_id_to_receive_request(self): """route_message should pass message_id to receive_request.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -172,7 +172,7 @@ async def test_route_message_passes_message_id_to_receive_request(self): server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) integration = OpenCodeSessionPoolIntegration(session_pool, server_state) integration._start_event_consumer = AsyncMock() @@ -191,7 +191,7 @@ async def test_route_message_passes_message_id_to_receive_request(self): @pytest.mark.asyncio async def test_route_message_without_message_id_passes_none(self): """route_message should pass message_id=None when not provided.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -203,7 +203,7 @@ async def test_route_message_without_message_id_passes_none(self): server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) integration = OpenCodeSessionPoolIntegration(session_pool, server_state) integration._start_event_consumer = AsyncMock() @@ -229,7 +229,7 @@ class TestBeforeConsumerLoopPendingMessageId: @pytest.mark.asyncio async def test_before_consumer_loop_uses_pending_message_id(self): """_before_consumer_loop should use pending message_id when available.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -238,7 +238,7 @@ async def test_before_consumer_loop_uses_pending_message_id(self): session_pool.sessions.get_session = Mock(return_value=None) server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) integration = OpenCodeSessionPoolIntegration(session_pool, server_state) # Set a pending message_id @@ -256,7 +256,7 @@ async def test_before_consumer_loop_uses_pending_message_id(self): @pytest.mark.asyncio async def test_before_consumer_loop_generates_id_when_no_pending(self): """_before_consumer_loop should generate a new ID when no pending message_id.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -265,7 +265,7 @@ async def test_before_consumer_loop_generates_id_when_no_pending(self): session_pool.sessions.get_session = Mock(return_value=None) server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) integration = OpenCodeSessionPoolIntegration(session_pool, server_state) @@ -296,17 +296,17 @@ async def test_handle_event_preserves_ctx_message_id_from_event(self): """ from pydantic_ai.messages import TextPart as PydanticTextPart - from agentpool.agents.events import PartStartEvent - from agentpool.orchestrator.event_bus import EventEnvelope - from agentpool_server.opencode_server.models import MessageWithParts - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness.agents.events import PartStartEvent + from wolfharness.orchestrator.event_bus import EventEnvelope + from wolfharness_server.opencode_server.models import MessageWithParts + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) session_pool = Mock() server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) server_state.broadcast_event = AsyncMock() integration = OpenCodeSessionPoolIntegration(session_pool, server_state) @@ -319,7 +319,7 @@ async def test_handle_event_preserves_ctx_message_id_from_event(self): agent_name="agent", model_id="default", parent_id="", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -363,16 +363,16 @@ async def _empty_convert(event): @pytest.mark.asyncio async def test_handle_event_does_not_update_when_event_has_no_message_id(self): """_handle_event should not update ctx.assistant_msg_id when event has no message_id.""" - from agentpool.agents.events import RunStartedEvent - from agentpool.orchestrator.event_bus import EventEnvelope - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness.agents.events import RunStartedEvent + from wolfharness.orchestrator.event_bus import EventEnvelope + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) session_pool = Mock() server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) server_state.broadcast_event = AsyncMock() integration = OpenCodeSessionPoolIntegration(session_pool, server_state) @@ -384,7 +384,7 @@ async def test_handle_event_does_not_update_when_event_has_no_message_id(self): agent_name="agent", model_id="default", parent_id="", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -436,8 +436,8 @@ class TestMessageIdTimestampConsistency: @pytest.mark.unit def test_id_timestamp_matches_now_ms(self) -> None: """C1: Timestamp decoded from ascending ID should match now_ms() window.""" - from agentpool.utils import identifiers - from agentpool.utils.time_utils import now_ms + from wolfharness.utils import identifiers + from wolfharness.utils.time_utils import now_ms ts_before = now_ms() msg_id = identifiers.ascending("message") @@ -455,7 +455,7 @@ def test_id_timestamp_matches_now_ms(self) -> None: @pytest.mark.unit def test_same_ms_ids_have_consistent_timestamps(self) -> None: """C1: Two IDs generated in rapid succession should have close timestamps.""" - from agentpool.utils import identifiers + from wolfharness.utils import identifiers id1 = identifiers.ascending("message") id2 = identifiers.ascending("message") @@ -487,14 +487,14 @@ class TestCustomEventBypassesRegistration: @pytest.mark.asyncio async def test_custom_event_does_not_register_assistant(self): """CustomEvent should NOT trigger assistant message registration.""" - from agentpool.agents.events.events import CustomEvent - from agentpool.orchestrator.event_bus import EventEnvelope - from agentpool_server.opencode_server.models import ( + from wolfharness.agents.events.events import CustomEvent + from wolfharness.orchestrator.event_bus import EventEnvelope + from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, ) - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -503,7 +503,7 @@ async def test_custom_event_does_not_register_assistant(self): session_pool.sessions.get_session = Mock(return_value=None) server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) server_state.broadcast_event = AsyncMock() integration = OpenCodeSessionPoolIntegration(session_pool, server_state) @@ -515,7 +515,7 @@ async def test_custom_event_does_not_register_assistant(self): agent_name="agent", model_id="default", parent_id="", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -559,14 +559,14 @@ async def test_real_agent_event_does_register_assistant(self): the next real agent event (RunStartedEvent) must trigger assistant registration. """ - from agentpool.agents.events import RunStartedEvent - from agentpool.orchestrator.event_bus import EventEnvelope - from agentpool_server.opencode_server.models import ( + from wolfharness.agents.events import RunStartedEvent + from wolfharness.orchestrator.event_bus import EventEnvelope + from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, ) - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -575,7 +575,7 @@ async def test_real_agent_event_does_register_assistant(self): session_pool.sessions.get_session = Mock(return_value=None) server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) server_state.broadcast_event = AsyncMock() integration = OpenCodeSessionPoolIntegration(session_pool, server_state) @@ -587,7 +587,7 @@ async def test_real_agent_event_does_register_assistant(self): agent_name="agent", model_id="default", parent_id="", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -614,7 +614,7 @@ async def _empty_convert(event): import unittest.mock as _mock with _mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=_mock.AsyncMock, ) as mock_append: event = RunStartedEvent( @@ -656,15 +656,15 @@ async def test_custom_event_then_runstarted_registers_on_runstarted(self): 2. System notifications 3. RunStartedEvent → register assistant message """ - from agentpool.agents.events import RunStartedEvent - from agentpool.agents.events.events import CustomEvent - from agentpool.orchestrator.event_bus import EventEnvelope - from agentpool_server.opencode_server.models import ( + from wolfharness.agents.events import RunStartedEvent + from wolfharness.agents.events.events import CustomEvent + from wolfharness.orchestrator.event_bus import EventEnvelope + from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, ) - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -673,7 +673,7 @@ async def test_custom_event_then_runstarted_registers_on_runstarted(self): session_pool.sessions.get_session = Mock(return_value=None) server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) server_state.broadcast_event = AsyncMock() integration = OpenCodeSessionPoolIntegration(session_pool, server_state) @@ -685,7 +685,7 @@ async def test_custom_event_then_runstarted_registers_on_runstarted(self): agent_name="agent", model_id="default", parent_id="", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -738,7 +738,7 @@ async def _empty_convert(event): import unittest.mock as _mock with _mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=_mock.AsyncMock, ): await integration._handle_event("test-session", envelope2) @@ -767,16 +767,16 @@ class TestEventBridgeStepStartPart: @pytest.mark.asyncio async def test_step_start_part_broadcast_on_registration(self): """StepStartPart should be broadcast when assistant message is registered.""" - from agentpool.agents.events import RunStartedEvent - from agentpool.orchestrator.event_bus import EventEnvelope - from agentpool_server.opencode_server.models import ( + from wolfharness.agents.events import RunStartedEvent + from wolfharness.orchestrator.event_bus import EventEnvelope + from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, PartUpdatedEvent, StepStartPart, ) - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -785,7 +785,7 @@ async def test_step_start_part_broadcast_on_registration(self): session_pool.sessions.get_session = Mock(return_value=None) server_state = Mock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) server_state.broadcast_event = AsyncMock() integration = OpenCodeSessionPoolIntegration(session_pool, server_state) @@ -797,7 +797,7 @@ async def test_step_start_part_broadcast_on_registration(self): agent_name="agent", model_id="default", parent_id="", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -824,7 +824,7 @@ async def _empty_convert(event): import unittest.mock as _mock with _mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=_mock.AsyncMock, ): event = RunStartedEvent( diff --git a/tests/servers/opencode_server/test_message_models.py b/tests/servers/opencode_server/test_message_models.py index e67bf6343..3e52fdbdd 100644 --- a/tests/servers/opencode_server/test_message_models.py +++ b/tests/servers/opencode_server/test_message_models.py @@ -8,7 +8,7 @@ import pytest -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageRequest, MessageTime, @@ -17,7 +17,7 @@ TimeCreated, UserMessage, ) -from agentpool_server.opencode_server.models.message import ( +from wolfharness_server.opencode_server.models.message import ( AssistantMessage, TextPartInput, ) @@ -102,7 +102,7 @@ def test_user_factory_creates_user_message(self): def test_assistant_factory_creates_assistant_message(self): """MessageWithParts.assistant() should create an assistant message.""" - from agentpool_server.opencode_server.models import AssistantMessage + from wolfharness_server.opencode_server.models import AssistantMessage msg = MessageWithParts.assistant( message_id="msg-1", diff --git a/tests/servers/opencode_server/test_message_routes_dedup.py b/tests/servers/opencode_server/test_message_routes_dedup.py index f544a347d..b03c19df8 100644 --- a/tests/servers/opencode_server/test_message_routes_dedup.py +++ b/tests/servers/opencode_server/test_message_routes_dedup.py @@ -11,15 +11,15 @@ import pytest -from agentpool.agents.events import UserMessageInsertedEvent -from agentpool_server.opencode_server.event_processor import ( +from wolfharness.agents.events import UserMessageInsertedEvent +from wolfharness_server.opencode_server.event_processor import ( EventProcessor, OpenCodeUserMessageMeta, ) -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, @@ -29,7 +29,7 @@ pytestmark = pytest.mark.unit if TYPE_CHECKING: - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState def _make_ctx(server_state: ServerState) -> EventProcessorContext: @@ -41,7 +41,7 @@ def _make_ctx(server_state: ServerState) -> EventProcessorContext: agent_name="test-agent", model_id="test-model", parent_id="parent", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) return EventProcessorContext( diff --git a/tests/servers/opencode_server/test_message_routes_regression.py b/tests/servers/opencode_server/test_message_routes_regression.py index 43df99f63..71e397b7e 100644 --- a/tests/servers/opencode_server/test_message_routes_regression.py +++ b/tests/servers/opencode_server/test_message_routes_regression.py @@ -33,7 +33,7 @@ async def test_persist_message_to_storage_not_called_for_user_messages() -> None persist_message_to_storage function is not invoked. """ with patch( - "agentpool_server.opencode_server.routes.message_routes.persist_message_to_storage", + "wolfharness_server.opencode_server.routes.message_routes.persist_message_to_storage", new_callable=AsyncMock, ) as mock_persist: # Verify the mock was not called during import or setup @@ -43,7 +43,7 @@ async def test_persist_message_to_storage_not_called_for_user_messages() -> None assert mock_persist is not None # Verify the function exists in the module - from agentpool_server.opencode_server.routes import message_routes + from wolfharness_server.opencode_server.routes import message_routes assert hasattr(message_routes, "persist_message_to_storage"), ( "persist_message_to_storage should exist in message_routes module" diff --git a/tests/servers/opencode_server/test_mode_consistency.py b/tests/servers/opencode_server/test_mode_consistency.py index 584081fc2..e85ff3ccf 100644 --- a/tests/servers/opencode_server/test_mode_consistency.py +++ b/tests/servers/opencode_server/test_mode_consistency.py @@ -8,7 +8,7 @@ The TUI uses AssistantMessage.agent (name) to resolve the agent for display. These tests verify: -1. /agent endpoint returns mode="primary" for all agentpool agents (correct) +1. /agent endpoint returns mode="primary" for all wolfharness agents (correct) 2. Assistant messages created by _before_consumer_loop have mode=agent_name 3. chat_message_to_opencode preserves mode from ChatMessage.name 4. Subagent assistant messages have mode and agent matching the child agent @@ -20,8 +20,8 @@ import pytest -from agentpool.messaging import ChatMessage -from agentpool_server.opencode_server.converters import chat_message_to_opencode +from wolfharness.messaging import ChatMessage +from wolfharness_server.opencode_server.converters import chat_message_to_opencode pytestmark = pytest.mark.unit @@ -34,13 +34,13 @@ @pytest.mark.unit async def test_agent_endpoint_mode_is_primary_for_all_agents() -> None: - """GET /agent should return mode='primary' for all agentpool agents. + """GET /agent should return mode='primary' for all wolfharness agents. - AgentMode is Literal['subagent', 'primary', 'all']. All agentpool agents + AgentMode is Literal['subagent', 'primary', 'all']. All wolfharness agents are primary (visible in switcher). This is correct — mode is a category, not an agent identifier. """ - from agentpool_server.opencode_server.routes.agent_routes import list_agents + from wolfharness_server.opencode_server.routes.agent_routes import list_agents agent1 = MagicMock() agent1.description = "Agent 1" @@ -76,7 +76,7 @@ async def test_before_consumer_loop_sets_mode_to_agent_name() -> None: The TUI uses the message's mode and agent fields to identify which agent produced the message. Both should be the agent's name. """ - from agentpool_server.opencode_server.opencode_event_bridge import ( + from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) @@ -89,7 +89,7 @@ async def test_before_consumer_loop_sets_mode_to_agent_name() -> None: server_state = MagicMock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = MagicMock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = MagicMock(return_value=("default", "wolfharness")) bridge = OpenCodeEventBridgeMixin.__new__(OpenCodeEventBridgeMixin) bridge.session_pool = session_pool @@ -179,7 +179,7 @@ async def test_subagent_assistant_mode_matches_child_agent_name() -> None: When a subagent session is created, the child session's assistant message should have mode=child_agent_name so the TUI can display the correct agent. """ - from agentpool_server.opencode_server.opencode_event_bridge import ( + from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) @@ -192,7 +192,7 @@ async def test_subagent_assistant_mode_matches_child_agent_name() -> None: server_state = MagicMock() server_state.working_dir = "/tmp" - server_state.resolve_default_model_info = MagicMock(return_value=("default", "agentpool")) + server_state.resolve_default_model_info = MagicMock(return_value=("default", "wolfharness")) bridge = OpenCodeEventBridgeMixin.__new__(OpenCodeEventBridgeMixin) bridge.session_pool = session_pool diff --git a/tests/servers/opencode_server/test_model_default_resolution.py b/tests/servers/opencode_server/test_model_default_resolution.py index 7e1412213..5c32b3403 100644 --- a/tests/servers/opencode_server/test_model_default_resolution.py +++ b/tests/servers/opencode_server/test_model_default_resolution.py @@ -1,6 +1,6 @@ """Tests for ServerState.resolve_default_model_info() and dynamic model default propagation. -Replaces hardcoded "sonnet"/"claude-code"/"default"/"agentpool" fallbacks with +Replaces hardcoded "sonnet"/"claude-code"/"default"/"wolfharness" fallbacks with config-derived defaults resolved from the configured agent's model_name. """ @@ -10,7 +10,7 @@ import pytest -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.unit @@ -51,14 +51,14 @@ def test_resolves_model_with_colon_in_name(self) -> None: assert provider_id == "openai" def test_falls_back_when_model_name_is_none(self) -> None: - """When agent.model_name is None, returns ('default', 'agentpool').""" + """When agent.model_name is None, returns ('default', 'wolfharness').""" state = _make_server_state(None) model_id, provider_id = state.resolve_default_model_info() assert model_id == "default" - assert provider_id == "agentpool" + assert provider_id == "wolfharness" def test_falls_back_when_model_name_has_no_colon(self) -> None: - """When agent.model_name has no colon (e.g. 'gpt-4o'), returns ('default', 'agentpool'). + """When agent.model_name has no colon (e.g. 'gpt-4o'), returns ('default', 'wolfharness'). This is a graceful fallback — a well-formed model_name should always include a provider prefix, but we handle the edge case safely. @@ -66,4 +66,4 @@ def test_falls_back_when_model_name_has_no_colon(self) -> None: state = _make_server_state("gpt-4o") model_id, provider_id = state.resolve_default_model_info() assert model_id == "default" - assert provider_id == "agentpool" + assert provider_id == "wolfharness" diff --git a/tests/servers/opencode_server/test_model_variant_resolution.py b/tests/servers/opencode_server/test_model_variant_resolution.py index a338a467c..85b665ff4 100644 --- a/tests/servers/opencode_server/test_model_variant_resolution.py +++ b/tests/servers/opencode_server/test_model_variant_resolution.py @@ -13,13 +13,13 @@ import pytest -from agentpool.agents.events import StreamCompleteEvent -from agentpool.models.model_configs import AnyModelConfig, StringModelConfig -from agentpool_server.opencode_server.event_adapter import OpenCodeEventAdapter -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.models.model_configs import AnyModelConfig, StringModelConfig +from wolfharness_server.opencode_server.event_adapter import OpenCodeEventAdapter +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageUpdatedEvent, diff --git a/tests/servers/opencode_server/test_opencode_model_switching.py b/tests/servers/opencode_server/test_opencode_model_switching.py index d5476fc4b..5a72fa295 100644 --- a/tests/servers/opencode_server/test_opencode_model_switching.py +++ b/tests/servers/opencode_server/test_opencode_model_switching.py @@ -1,7 +1,7 @@ """Tests to verify OpenCode model switching issues. These tests verify the root causes of the issue where model changes -in OpenCode TUI are not reflected in agentpool runtime. +in OpenCode TUI are not reflected in wolfharness runtime. """ from __future__ import annotations @@ -11,8 +11,9 @@ import pytest -from agentpool import Agent, AgentPool, AgentsManifest -from agentpool_server.opencode_server.models import ( +from tests.servers.opencode_server.conftest import run_message_phases +from wolfharness import Agent, AgentPool, AgentsManifest +from wolfharness_server.opencode_server.models import ( MessageRequest, MessageWithParts, ModelRef, @@ -20,8 +21,7 @@ TimeCreated, UserMessage, ) -from agentpool_server.opencode_server.models.config import Config -from tests.servers.opencode_server.conftest import run_message_phases +from wolfharness_server.opencode_server.models.config import Config if TYPE_CHECKING: @@ -315,7 +315,7 @@ async def test_opencode_model_flow_simulation(): """Simulate the complete OpenCode model switching flow. This test simulates: - 1. OpenCode TUI connects to agentpool + 1. OpenCode TUI connects to wolfharness 2. TUI gets available models (including model_variants as synthetic provider) 3. User selects 'qwen35' in TUI 4. TUI sends message with model override @@ -432,9 +432,9 @@ def _make_mock_state_with_session_agent( """Create a ServerState wired so get_or_create_session_agent returns per-session mocks.""" from unittest.mock import AsyncMock, Mock - from agentpool.lifecycle import RunOutcome, RunState - from agentpool.utils.time_utils import now_ms - from agentpool_server.opencode_server.state import ServerState + from wolfharness.lifecycle import RunOutcome, RunState + from wolfharness.utils.time_utils import now_ms + from wolfharness_server.opencode_server.state import ServerState shared_agent = PerSessionAgentMock(name="shared-agent") shared_agent.env = Mock() @@ -508,8 +508,8 @@ async def _get_or_create_session_agent( # Pre-populate sessions in state for session_id in session_agents: - from agentpool_server.opencode_server.models import Session - from agentpool_server.opencode_server.models.common import TimeCreatedUpdated + from wolfharness_server.opencode_server.models import Session + from wolfharness_server.opencode_server.models.common import TimeCreatedUpdated now = now_ms() session = Session( @@ -535,7 +535,7 @@ async def test_model_switch_targets_per_session_agent(tmp_project_dir: Path) -> ``session_pool.sessions.get_or_create_session_agent()`` so each session gets its own isolated model configuration. """ - from agentpool.utils import identifiers as identifier + from wolfharness.utils import identifiers as identifier session_id = "test-session-a" session_agents: dict[str, PerSessionAgentMock] = { @@ -580,7 +580,7 @@ async def test_model_switch_targets_per_session_agent(tmp_project_dir: Path) -> @pytest.mark.unit async def test_model_switch_affects_only_target_session(tmp_project_dir: Path) -> None: """Switching model in session A must not affect session B's agent.""" - from agentpool.utils import identifiers as identifier + from wolfharness.utils import identifiers as identifier session_a = "session-a" session_b = "session-b" @@ -640,7 +640,7 @@ async def test_model_switch_affects_only_target_session(tmp_project_dir: Path) - @pytest.mark.unit async def test_other_sessions_retain_original_model(tmp_project_dir: Path) -> None: """After switching model in one session, other sessions keep their original model.""" - from agentpool.utils import identifiers as identifier + from wolfharness.utils import identifiers as identifier session_a = "session-a" session_b = "session-b" diff --git a/tests/servers/opencode_server/test_opencode_resume.py b/tests/servers/opencode_server/test_opencode_resume.py index c5db5e0d1..3bbf740d9 100644 --- a/tests/servers/opencode_server/test_opencode_resume.py +++ b/tests/servers/opencode_server/test_opencode_resume.py @@ -12,24 +12,24 @@ import pytest -from agentpool.orchestrator.core import SessionPool -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.orchestrator.core import SessionPool +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( TextPart, ToolPart, ToolStateRunning, ) -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -85,7 +85,7 @@ def server_state(tmp_path: Any) -> ServerState: def _make_assistant_msg(session_id: str, working_dir: str) -> MessageWithParts: """Create a fresh assistant MessageWithParts for testing.""" - from agentpool.utils.time_utils import now_ms + from wolfharness.utils.time_utils import now_ms return MessageWithParts.assistant( message_id="msg-test-001", @@ -94,7 +94,7 @@ def _make_assistant_msg(session_id: str, working_dir: str) -> MessageWithParts: agent_name="test-agent", model_id="test-model", parent_id=session_id, - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd=working_dir, root=working_dir), ) @@ -184,7 +184,7 @@ def test_serialize_deserialize_roundtrip_with_tool_parts( ) # Add a tool part - from agentpool_server.opencode_server.models.parts import ( + from wolfharness_server.opencode_server.models.parts import ( TimeStart, ) @@ -354,7 +354,7 @@ async def test_restored_context_has_correct_assistant_msg( ) # Add a tool part to the context and assistant message - from agentpool_server.opencode_server.models.parts import ( + from wolfharness_server.opencode_server.models.parts import ( TimeStart, ) @@ -455,7 +455,7 @@ async def test_restored_context_does_not_replay_completed_parts( working_dir=server_state.working_dir, ) # Simulate an already-completed part - from agentpool_server.opencode_server.models.parts import ( + from wolfharness_server.opencode_server.models.parts import ( TimeStart, ) @@ -650,7 +650,7 @@ async def test_deserialize_preserves_subagent_tool_parts( working_dir=server_state.working_dir, ) - from agentpool_server.opencode_server.models.parts import ( + from wolfharness_server.opencode_server.models.parts import ( TimeStart, ) diff --git a/tests/servers/opencode_server/test_otel_fastapi_patch.py b/tests/servers/opencode_server/test_otel_fastapi_patch.py new file mode 100644 index 000000000..019b0963c --- /dev/null +++ b/tests/servers/opencode_server/test_otel_fastapi_patch.py @@ -0,0 +1,143 @@ +"""Tests for the OpenTelemetry FastAPI route-details patch. + +FastAPI >= 0.136 wraps ``include_router`` sub-routers in ``_IncludedRouter`` +nodes that carry no ``path`` attribute. OTel's ``_get_route_details`` reads +``route.path`` in its ``Match.PARTIAL`` branch without guarding, crashing on +dynamic routes (e.g. ``/session/{id}/message``) and turning valid requests into +500s. ``_safe_get_route_details`` guards that branch. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +import pytest +from starlette.routing import Match, Route + +from wolfharness_server.opencode_server.otel_fastapi_patch import ( + _safe_get_route_details, + patch_otel_fastapi_route_details, +) + + +pytestmark = pytest.mark.unit + + +if TYPE_CHECKING: + from fastapi import FastAPI + + +def _app_with_included_router() -> FastAPI: + """Build a FastAPI app with a dynamic route inside an included router.""" + from fastapi import APIRouter, FastAPI + + sub = APIRouter() + + @sub.get("/session/{session_id}/message") + async def session_message(session_id: str) -> dict[str, str]: + return {"ok": session_id} + + app = FastAPI() + app.include_router(sub) + return app + + +def _scope_for(app: FastAPI, path: str) -> dict[str, Any]: + """Build a minimal ASGI scope for an HTTP request to ``path``.""" + return { + "type": "http", + "app": app, + "method": "POST", + "path": path, + "raw_path": path.encode(), + "root_path": "", + "headers": [], + "query_string": b"", + "client": ("127.0.0.1", 12345), + "server": ("test", 80), + "scheme": "http", + } + + +def test_included_router_entries_have_no_path() -> None: + """Sanity: FastAPI >= 0.136 wraps include_router routes in _IncludedRouter.""" + app = _app_with_included_router() + + pathless = [r for r in app.routes if not hasattr(r, "path")] + assert pathless, "expected at least one _IncludedRouter entry without .path" + assert all(type(r).__name__ == "_IncludedRouter" for r in pathless), ( + "pathless routes should be _IncludedRouter wrappers" + ) + + +def test_original_otel_route_details_crashes_on_partial_match() -> None: + """The unpatched OTel helper crashes on a partial-match pathless route. + + Guards the fix: this proves the bug exists and the patch is necessary. + + A partial match against an ``_IncludedRouter`` wrapper happens when the + request method differs from the route's (e.g. POST against a GET route): + the path-prefix matches (``Match.PARTIAL``) but the wrapper has no ``path`` + attribute, so OTel's unguarded ``route.path`` access raises. + """ + from fastapi import APIRouter, FastAPI + + verify_app = FastAPI() + sub = APIRouter() + + @sub.get("/session/{session_id}/message") + async def sm(session_id: str) -> dict[str, str]: + return {"ok": session_id} + + verify_app.include_router(sub) + + # POST against a GET-only route inside an included router → PARTIAL match. + partial_routes = [] + for route in verify_app.routes: + if isinstance(route, Route): + continue # skip explicit Route objects (they carry .path) + match, _ = route.matches({ + "path": "/session/ses_x/message", + "path_params": {}, + "root_path": "", + "method": "POST", + "type": "http", + }) + if match == Match.PARTIAL: + partial_routes.append(route) + + assert partial_routes, "expected a partial match against _IncludedRouter" + for route in partial_routes: + with pytest.raises(AttributeError): + object.__getattribute__(route, "path") + + # The guarded helper must resolve the same POST without crashing. + resolved_route = _safe_get_route_details(_scope_for(verify_app, "/session/ses_x/message")) + assert resolved_route is not None + + +def test_safe_route_details_handles_pathless_included_router() -> None: + """The patched helper falls back to scope path, never crashing.""" + from fastapi import APIRouter, FastAPI + + app = FastAPI() + sub = APIRouter() + + @sub.post("/session/{session_id}/message") + async def sm(session_id: str) -> dict[str, str]: + return {"ok": session_id} + + app.include_router(sub) + + resolved_route = _safe_get_route_details(_scope_for(app, "/session/ses_x/message")) + assert resolved_route is not None + + +def test_patch_is_idempotent_and_effective() -> None: + """patch_otel_fastapi_route_details rewires the OTel module global.""" + import opentelemetry.instrumentation.fastapi as otel_fastapi + + patch_otel_fastapi_route_details() + patch_otel_fastapi_route_details() + + assert otel_fastapi._get_route_details is _safe_get_route_details diff --git a/tests/servers/opencode_server/test_p1_part_updated_event.py b/tests/servers/opencode_server/test_p1_part_updated_event.py index 41571d119..9ce6f52fd 100644 --- a/tests/servers/opencode_server/test_p1_part_updated_event.py +++ b/tests/servers/opencode_server/test_p1_part_updated_event.py @@ -16,12 +16,12 @@ import pytest -from agentpool.agents.events import UserMessageInsertedEvent -from agentpool_server.opencode_server.event_processor import EventProcessor -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.agents.events import UserMessageInsertedEvent +from wolfharness_server.opencode_server.event_processor import EventProcessor +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageUpdatedEvent, @@ -35,7 +35,7 @@ if TYPE_CHECKING: - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState def _make_ctx(server_state: ServerState) -> EventProcessorContext: @@ -47,7 +47,7 @@ def _make_ctx(server_state: ServerState) -> EventProcessorContext: agent_name="test-agent", model_id="test-model", parent_id="parent-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) return EventProcessorContext( diff --git a/tests/servers/opencode_server/test_p2_protocol_channel_routing.py b/tests/servers/opencode_server/test_p2_protocol_channel_routing.py index 5954d7058..206330d86 100644 --- a/tests/servers/opencode_server/test_p2_protocol_channel_routing.py +++ b/tests/servers/opencode_server/test_p2_protocol_channel_routing.py @@ -19,11 +19,11 @@ import pytest -from agentpool.agents.events import UserMessageInsertedEvent -from agentpool.lifecycle.comm_channel import ProtocolChannel -from agentpool.lifecycle.journal import MemoryJournal -from agentpool.orchestrator.core import EventBus -from agentpool.orchestrator.session_controller_runs import ( +from wolfharness.agents.events import UserMessageInsertedEvent +from wolfharness.lifecycle.comm_channel import ProtocolChannel +from wolfharness.lifecycle.journal import MemoryJournal +from wolfharness.orchestrator.core import EventBus +from wolfharness.orchestrator.session_controller_runs import ( SessionControllerRunsMixin, ) @@ -32,7 +32,7 @@ if TYPE_CHECKING: - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.orchestrator.session_controller import SessionState class _FakeController(SessionControllerRunsMixin): @@ -301,7 +301,7 @@ async def test_replayed_non_user_message_still_published() -> None: Then: The event IS still published to the EventBus (only UserMessageInsertedEvent is skipped during replay). """ - from agentpool.agents.events.events import RunStartedEvent + from wolfharness.agents.events.events import RunStartedEvent event_bus = EventBus() protocol_channel = _make_protocol_channel(event_bus, "sess-p2") diff --git a/tests/servers/opencode_server/test_p3_context_serialization.py b/tests/servers/opencode_server/test_p3_context_serialization.py index 6c7cbe524..e79a97d3e 100644 --- a/tests/servers/opencode_server/test_p3_context_serialization.py +++ b/tests/servers/opencode_server/test_p3_context_serialization.py @@ -14,22 +14,22 @@ import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( RunFailedEvent, StreamCompleteEvent, ) -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventEnvelope -from agentpool_server.opencode_server.event_adapter import OpenCodeEventAdapter -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventEnvelope +from wolfharness_server.opencode_server.event_adapter import OpenCodeEventAdapter +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, ) -from agentpool_server.opencode_server.opencode_event_bridge import ( +from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) @@ -156,11 +156,11 @@ async def test_context_serialized_after_stream_complete() -> None: with ( __import__("unittest.mock").mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), __import__("unittest.mock").mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ), ): @@ -225,7 +225,7 @@ async def test_serialization_failure_falls_back_to_fresh_context() -> None: Then: An error is logged, the turn does NOT crash, and no resume data is stored. """ - import agentpool_server.opencode_server.opencode_event_bridge as bridge_module + import wolfharness_server.opencode_server.opencode_event_bridge as bridge_module session_id = "sess-p3-fail" bridge, ctx, _broadcast_calls = _setup_bridge_for_handle( @@ -244,11 +244,11 @@ async def test_serialization_failure_falls_back_to_fresh_context() -> None: with ( __import__("unittest.mock").mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), __import__("unittest.mock").mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ), __import__("unittest.mock").mock.patch.object( @@ -298,11 +298,11 @@ async def test_context_serialized_after_run_failed() -> None: with ( __import__("unittest.mock").mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), __import__("unittest.mock").mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ), ): diff --git a/tests/servers/opencode_server/test_p4_message_registered_reset.py b/tests/servers/opencode_server/test_p4_message_registered_reset.py index 91d6e254f..bff225ef2 100644 --- a/tests/servers/opencode_server/test_p4_message_registered_reset.py +++ b/tests/servers/opencode_server/test_p4_message_registered_reset.py @@ -19,22 +19,22 @@ import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( RunFailedEvent, RunStartedEvent, StreamCompleteEvent, ) -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventEnvelope -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventEnvelope +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, ) -from agentpool_server.opencode_server.opencode_event_bridge import ( +from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) @@ -138,11 +138,11 @@ def _patch_mocks(): def _ctx(): with ( __import__("unittest.mock").mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), __import__("unittest.mock").mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ) as mock_append, ): @@ -223,7 +223,7 @@ async def test_d1_fires_on_turn2_after_stream_complete() -> None: - Turn 2: RunStarted → D1 fires (True) → new msg → _message_registered=False - Turn 2: register → _message_registered=True """ - import agentpool_server.opencode_server.opencode_event_bridge as bridge_module + import wolfharness_server.opencode_server.opencode_event_bridge as bridge_module session_id = "sess-p4-d1" bridge, ctx, _broadcast = _setup_bridge( diff --git a/tests/servers/opencode_server/test_part_id_dedup.py b/tests/servers/opencode_server/test_part_id_dedup.py index c88f12981..d00c4fa59 100644 --- a/tests/servers/opencode_server/test_part_id_dedup.py +++ b/tests/servers/opencode_server/test_part_id_dedup.py @@ -22,11 +22,11 @@ import pytest -from agentpool_server.opencode_server.event_processor import ( +from wolfharness_server.opencode_server.event_processor import ( EventProcessor, OpenCodeUserMessageMeta, ) -from agentpool_server.opencode_server.models.message import ( +from wolfharness_server.opencode_server.models.message import ( MessagePath, MessageTime, MessageWithParts, @@ -35,7 +35,7 @@ def _make_ctx(session_id: str = "test-session") -> Any: """Create a minimal EventProcessorContext for testing.""" - from agentpool_server.opencode_server.event_processor_context import ( + from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) @@ -46,7 +46,7 @@ def _make_ctx(session_id: str = "test-session") -> Any: agent_name="test-agent", model_id="test-model", parent_id="parent-001", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) ctx = EventProcessorContext( @@ -74,7 +74,7 @@ async def test_accepted_source_does_not_yield_part_updated_events() -> None: # Mock append_message_to_session to avoid actual state mutation with patch( - "agentpool_server.opencode_server.opencode_message_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_message_bridge.append_message_to_session", new_callable=AsyncMock, ): meta = OpenCodeUserMessageMeta( @@ -118,7 +118,7 @@ async def test_accepted_source_yields_part_updated_events() -> None: ctx.state.messages = {} with patch( - "agentpool_server.opencode_server.opencode_message_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_message_bridge.append_message_to_session", new_callable=AsyncMock, ): meta = OpenCodeUserMessageMeta( @@ -157,8 +157,8 @@ async def test_accepted_source_part_ids_differ_from_db_reconstruction() -> None: sources causes duplication: ``chat_message_to_opencode`` generates new part IDs, different from the original parts in meta. """ - from agentpool.messaging.messages import ChatMessage - from agentpool_server.opencode_server.converters import chat_message_to_opencode + from wolfharness.messaging.messages import ChatMessage + from wolfharness_server.opencode_server.converters import chat_message_to_opencode # Create a ChatMessage as stored in DB chat_msg = ChatMessage[str]( @@ -197,7 +197,7 @@ async def test_accepted_source_no_part_updated_with_text_content() -> None: ctx.state.messages = {} with patch( - "agentpool_server.opencode_server.opencode_message_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_message_bridge.append_message_to_session", new_callable=AsyncMock, ): events = [] @@ -226,7 +226,7 @@ async def test_accepted_source_text_content_yields_part_updated() -> None: ctx.state.messages = {} with patch( - "agentpool_server.opencode_server.opencode_message_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_message_bridge.append_message_to_session", new_callable=AsyncMock, ): events = [] diff --git a/tests/servers/opencode_server/test_permission_session_state.py b/tests/servers/opencode_server/test_permission_session_state.py index 6f66ae96a..382f72429 100644 --- a/tests/servers/opencode_server/test_permission_session_state.py +++ b/tests/servers/opencode_server/test_permission_session_state.py @@ -11,17 +11,20 @@ import pytest -from agentpool.orchestrator.core import SessionState -from agentpool_server.opencode_server.input_provider import OpenCodeInputProvider, PendingPermission -from agentpool_server.opencode_server.models import ( +from wolfharness.orchestrator.core import SessionState +from wolfharness_server.opencode_server.input_provider import ( + OpenCodeInputProvider, + PendingPermission, +) +from wolfharness_server.opencode_server.models import ( PermissionReplyRequest, PermissionResolvedEvent, ) -from agentpool_server.opencode_server.routes.permission_routes import ( +from wolfharness_server.opencode_server.routes.permission_routes import ( list_permissions, reply_to_permission, ) -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration diff --git a/tests/servers/opencode_server/test_project_id_mismatch.py b/tests/servers/opencode_server/test_project_id_mismatch.py index 3603cbb3b..d726866e9 100644 --- a/tests/servers/opencode_server/test_project_id_mismatch.py +++ b/tests/servers/opencode_server/test_project_id_mismatch.py @@ -22,18 +22,18 @@ from httpx import ASGITransport, AsyncClient import pytest -from agentpool_server.opencode_server.dependencies import get_state -from agentpool_server.opencode_server.models import SessionStatusEvent -from agentpool_server.opencode_server.routes import app_router, global_router -from agentpool_server.opencode_server.routes.global_routes import GlobalEventFactory -from agentpool_storage.opencode_provider.helpers import compute_project_id +from wolfharness_server.opencode_server.dependencies import get_state +from wolfharness_server.opencode_server.models import SessionStatusEvent +from wolfharness_server.opencode_server.routes import app_router, global_router +from wolfharness_server.opencode_server.routes.global_routes import GlobalEventFactory +from wolfharness_storage.opencode_provider.helpers import compute_project_id if TYPE_CHECKING: from collections.abc import AsyncIterator from pathlib import Path - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState @pytest.fixture diff --git a/tests/servers/opencode_server/test_prompt_async.py b/tests/servers/opencode_server/test_prompt_async.py index 98bc8a6b0..d14e0e303 100644 --- a/tests/servers/opencode_server/test_prompt_async.py +++ b/tests/servers/opencode_server/test_prompt_async.py @@ -6,7 +6,7 @@ import pytest -from agentpool_server.opencode_server.models import MessageRequest, TextPartInput +from wolfharness_server.opencode_server.models import MessageRequest, TextPartInput pytestmark = pytest.mark.integration @@ -121,7 +121,7 @@ async def test_prompt_async_creates_user_message( response = await async_client.post("/session", json={"title": "Async Message"}) session_id = response.json()["id"] - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( get_messages_for_session, ) diff --git a/tests/servers/opencode_server/test_question_handling.py b/tests/servers/opencode_server/test_question_handling.py index 5f1ca86d1..821195729 100644 --- a/tests/servers/opencode_server/test_question_handling.py +++ b/tests/servers/opencode_server/test_question_handling.py @@ -15,12 +15,16 @@ from mcp import types import pytest -from agentpool.orchestrator.core import SessionController, SessionState -from agentpool.tasks.exceptions import RunAbortedError -from agentpool.utils import identifiers as identifier -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.input_provider import OpenCodeInputProvider, PendingPermission -from agentpool_server.opencode_server.models import ( +from tests.servers.opencode_server.conftest import run_message_phases +from wolfharness.orchestrator.core import SessionController, SessionState +from wolfharness.tasks.exceptions import RunAbortedError +from wolfharness.utils import identifiers as identifier +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.input_provider import ( + OpenCodeInputProvider, + PendingPermission, +) +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessageRequest, PermissionRequestEvent, @@ -30,22 +34,21 @@ TimeCreated, UserMessage, ) -from agentpool_server.opencode_server.models.message import ( +from wolfharness_server.opencode_server.models.message import ( MessageAbortedError, MessageWithParts, ) -from agentpool_server.opencode_server.routes.question_routes import ( +from wolfharness_server.opencode_server.routes.question_routes import ( list_questions, reject_question, reply_to_question, ) -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( append_message_to_session, get_messages_for_session, get_session_status, ) -from agentpool_server.opencode_server.state import PendingQuestion, ServerState -from tests.servers.opencode_server.conftest import run_message_phases +from wolfharness_server.opencode_server.state import PendingQuestion, ServerState pytestmark = pytest.mark.integration @@ -78,7 +81,7 @@ def __init__(self) -> None: self._input_provider = None self.model_name = "test-model" self.session_id: str | None = None - from agentpool.messaging.message_history import MessageHistory + from wolfharness.messaging.message_history import MessageHistory self.conversation = MessageHistory() @@ -125,7 +128,7 @@ def __init__(self) -> None: self.model_name = "test-model" self.session_id: str | None = None self.block_forever_event: asyncio.Event = asyncio.Event() - from agentpool.messaging.message_history import MessageHistory + from wolfharness.messaging.message_history import MessageHistory self.conversation = MessageHistory() @@ -176,7 +179,7 @@ def __init__(self, state: ServerState) -> None: self.model_name = "test-model" self.session_id: str | None = None self._state = state - from agentpool.messaging.message_history import MessageHistory + from wolfharness.messaging.message_history import MessageHistory self.conversation = MessageHistory() @@ -299,7 +302,7 @@ async def _mock_receive_request( message_id: str | None = None, **kwargs: Any, ) -> str | None: - from agentpool.lifecycle import RunOutcome, RunState + from wolfharness.lifecycle import RunOutcome, RunState complete_event = asyncio.Event() _completion_events[session_id] = complete_event @@ -318,7 +321,7 @@ async def _background_run(): run_handle._run_state = RunState.DONE run_handle.outcome = RunOutcome.FAILED # Publish RunFailedEvent so the message_routes error path fires - from agentpool.agents.events import RunFailedEvent + from wolfharness.agents.events import RunFailedEvent await session_pool.event_bus.publish( session_id, @@ -411,7 +414,7 @@ def blocking_real_question_state(tmp_project_dir): placeholder_agent.storage = placeholder_agent.agent_pool.storage state = ServerState(working_dir=str(tmp_project_dir), agent=placeholder_agent) # Set up a mock session_controller for the BlockingOnRealQuestionAgentMock - from agentpool.orchestrator.core import SessionState as SPSessionState + from wolfharness.orchestrator.core import SessionState as SPSessionState sp_session = SPSessionState(session_id="test-session", agent_name="test-agent") controller = Mock() @@ -457,8 +460,8 @@ def sample_message_request(): def _setup_session(state: ServerState, session_id: str) -> None: """Set up session state manually.""" - from agentpool_server.opencode_server.models import Session - from agentpool_server.opencode_server.models.common import TimeCreatedUpdated + from wolfharness_server.opencode_server.models import Session + from wolfharness_server.opencode_server.models.common import TimeCreatedUpdated now = now_ms() session = Session( @@ -665,7 +668,7 @@ async def _mock_get_status(sid: str) -> Any: _original_broadcast = state.broadcast_event async def _capturing_broadcast(event: Any) -> None: - from agentpool_server.opencode_server.models import SessionStatusEvent + from wolfharness_server.opencode_server.models import SessionStatusEvent if isinstance(event, SessionStatusEvent): _session_statuses[event.properties.session_id] = event.properties.status @@ -691,7 +694,7 @@ async def _mock_create_session(sid: str, *args: Any, **kw: Any) -> Any: session_id, sample_message_request, state, user_msg_id, user_msg_with_parts ) # Phase 3: mark session idle (not included in run_message_phases) - from agentpool_server.opencode_server.routes.message_routes import ( + from wolfharness_server.opencode_server.routes.message_routes import ( _mark_session_idle_safe, ) @@ -852,7 +855,7 @@ async def test_no_deadlock_different_session_after_blocking_question( # This MUST NOT deadlock — per-session agents resolve the issue try: - from agentpool_server.opencode_server.routes.session_routes import get_or_load_session + from wolfharness_server.opencode_server.routes.session_routes import get_or_load_session await asyncio.wait_for(get_or_load_session(state, new_session_id), timeout=1.0) # Either gets the session or None — both are fine, no deadlock @@ -1044,7 +1047,7 @@ async def test_cancel_all_pending_questions_allows_new_session_access_after_sse_ _setup_session(state, new_session_id) # This MUST NOT deadlock — per-session agents resolve the issue - from agentpool_server.opencode_server.routes.session_routes import get_or_load_session + from wolfharness_server.opencode_server.routes.session_routes import get_or_load_session try: await asyncio.wait_for(get_or_load_session(state, new_session_id), timeout=2.0) @@ -1084,7 +1087,7 @@ def __init__(self) -> None: self._input_provider = None self.model_name = "test-model" self.session_id: str | None = None - from agentpool.messaging.message_history import MessageHistory + from wolfharness.messaging.message_history import MessageHistory self.conversation = MessageHistory() @@ -1201,7 +1204,7 @@ async def acquire_raising_cancel() -> bool: def _make_mock_session_controller(session_id: str) -> Mock: """Create a mock SessionController with a SessionState for the given session.""" - from agentpool.orchestrator.core import SessionState + from wolfharness.orchestrator.core import SessionState session = SessionState(session_id=session_id, agent_name="test-agent") controller = Mock() @@ -1699,8 +1702,8 @@ async def test_multi_question_rfc0010_backward_compat(): async def test_multi_question_event_structure(): """Test that SSE QuestionAskedEvent has correct structure for multi-questions.""" - from agentpool_server.opencode_server.models.events import QuestionAskedEvent - from agentpool_server.opencode_server.models.question import QuestionInfo, QuestionOption + from wolfharness_server.opencode_server.models.events import QuestionAskedEvent + from wolfharness_server.opencode_server.models.question import QuestionInfo, QuestionOption # Create a QuestionsAskedEvent with multiple questions questions = [ @@ -1834,7 +1837,7 @@ def _make_pending_question( future: asyncio.Future[list[list[str]]] | None = None, ) -> PendingQuestion: """Create a PendingQuestion for testing.""" - from agentpool_server.opencode_server.models.question import QuestionInfo, QuestionOption + from wolfharness_server.opencode_server.models.question import QuestionInfo, QuestionOption if future is None: future = asyncio.get_event_loop().create_future() diff --git a/tests/servers/opencode_server/test_reasoning.py b/tests/servers/opencode_server/test_reasoning.py index 63a314971..3d6c61e2b 100644 --- a/tests/servers/opencode_server/test_reasoning.py +++ b/tests/servers/opencode_server/test_reasoning.py @@ -12,15 +12,15 @@ ) import pytest -from agentpool_server.opencode_server.event_processor import EventProcessor -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness_server.opencode_server.event_processor import EventProcessor +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import PartUpdatedEvent -from agentpool_server.opencode_server.models.events import ( +from wolfharness_server.opencode_server.models import PartUpdatedEvent +from wolfharness_server.opencode_server.models.events import ( PartUpdatedEventProperties, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( ReasoningPart, TextPart as OpenCodeTextPart, ) @@ -333,7 +333,7 @@ async def test_reasoning_part_gets_end_time_on_stream_complete(): ) # Stream completes without any text starting - from agentpool.messaging import ChatMessage + from wolfharness.messaging import ChatMessage chat_msg = ChatMessage(content="", role="assistant") events.extend(list(processor._process_stream_complete(ctx, chat_msg))) diff --git a/tests/servers/opencode_server/test_replay_buffer_sync.py b/tests/servers/opencode_server/test_replay_buffer_sync.py index c44dc418b..1e3221d48 100644 --- a/tests/servers/opencode_server/test_replay_buffer_sync.py +++ b/tests/servers/opencode_server/test_replay_buffer_sync.py @@ -24,19 +24,19 @@ import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( UserMessageInsertedEvent, ) -from agentpool.orchestrator.core import EventBus -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.orchestrator.core import EventBus +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, ) -from agentpool_server.opencode_server.opencode_event_bridge import ( +from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) diff --git a/tests/servers/opencode_server/test_resource_resolution.py b/tests/servers/opencode_server/test_resource_resolution.py index 2065491d8..9af226251 100644 --- a/tests/servers/opencode_server/test_resource_resolution.py +++ b/tests/servers/opencode_server/test_resource_resolution.py @@ -5,7 +5,7 @@ ``ResourceSource`` (L2 integration tests). The tests are written against the target API where: -- ``resolve_resource_content()`` lives in ``agentpool.capabilities.resource_resolver`` +- ``resolve_resource_content()`` lives in ``wolfharness.capabilities.resource_resolver`` - ``_resolve_resource()`` in the converter delegates to ``resolve_resource_content()`` by filtering ``agent._all_capabilities`` via ``isinstance`` checks. """ @@ -19,13 +19,13 @@ from pydantic_ai import BinaryContent import pytest -from agentpool.capabilities.resource_protocols import ( +from wolfharness.capabilities.resource_protocols import ( BlobResourceContent, ResourceEntry, SkillEntry, TextResourceContent, ) -from agentpool.capabilities.resource_resolver import resolve_resource_content +from wolfharness.capabilities.resource_resolver import resolve_resource_content if TYPE_CHECKING: @@ -104,7 +104,7 @@ class FakeAgent: """ def __init__(self, capabilities: list[Any], name: str = "fake-agent") -> None: - from agentpool.capabilities.extension_registry import ExtensionRegistry, Scope, ScopeLevel + from wolfharness.capabilities.extension_registry import ExtensionRegistry, Scope, ScopeLevel registry = ExtensionRegistry() pool_scope = Scope(level=ScopeLevel.POOL) @@ -332,7 +332,7 @@ async def test_resolve_resource_skill_reference_traversal_blocked(tmp_path: Any) """Path traversal in reference path is blocked by ResolvedSkillURI.parse().""" from upathtools import UPath - from agentpool.skills.exceptions import SecurityError + from wolfharness.skills.exceptions import SecurityError skill_dir = tmp_path / "my-skill" skill_dir.mkdir() @@ -443,10 +443,10 @@ async def test_resolve_resource_text_truncation() -> None: async def test_extract_user_prompt_with_binary_resource() -> None: """Resource returns BlobResourceContent → result contains BinaryContent in XML sandwich.""" - from agentpool_server.opencode_server.converters import extract_user_prompt_from_parts - from agentpool_server.opencode_server.models import FilePartInput - from agentpool_server.opencode_server.models.common import TextSpan - from agentpool_server.opencode_server.models.parts import ResourceSource + from wolfharness_server.opencode_server.converters import extract_user_prompt_from_parts + from wolfharness_server.opencode_server.models import FilePartInput + from wolfharness_server.opencode_server.models.common import TextSpan + from wolfharness_server.opencode_server.models.parts import ResourceSource blob_data = base64.b64encode(b"img").decode() cap = FakeResourceAccess( @@ -475,10 +475,10 @@ async def test_extract_user_prompt_with_binary_resource() -> None: async def test_extract_user_prompt_resource_no_agent() -> None: """agent=None → FilePartInput falls through to generic file handler.""" - from agentpool_server.opencode_server.converters import extract_user_prompt_from_parts - from agentpool_server.opencode_server.models import FilePartInput - from agentpool_server.opencode_server.models.common import TextSpan - from agentpool_server.opencode_server.models.parts import ResourceSource + from wolfharness_server.opencode_server.converters import extract_user_prompt_from_parts + from wolfharness_server.opencode_server.models import FilePartInput + from wolfharness_server.opencode_server.models.common import TextSpan + from wolfharness_server.opencode_server.models.parts import ResourceSource source = ResourceSource( text=TextSpan(value="@viking:doc.md", start=0, end=14), @@ -500,14 +500,14 @@ async def test_extract_user_prompt_resource_no_agent() -> None: async def test_extract_user_prompt_mixed_parts() -> None: """Text + resource + agent parts all processed.""" - from agentpool_server.opencode_server.converters import extract_user_prompt_from_parts - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.converters import extract_user_prompt_from_parts + from wolfharness_server.opencode_server.models import ( AgentPartInput, FilePartInput, TextPartInput, ) - from agentpool_server.opencode_server.models.common import TextSpan - from agentpool_server.opencode_server.models.parts import ResourceSource + from wolfharness_server.opencode_server.models.common import TextSpan + from wolfharness_server.opencode_server.models.parts import ResourceSource cap = FakeResourceAccess( read_result=[TextResourceContent(text="resource content", uri="viking://doc")] @@ -556,12 +556,12 @@ async def test_resolve_resource_timing_bug() -> None: Expected behavior after fix: ``_resolve_resource()`` should find the cap even when the registry hasn't registered it yet. """ - from agentpool import AgentPool, AgentsManifest, NativeAgentConfig - from agentpool_config.capabilities import GenericCapabilityConfig - from agentpool_server.opencode_server.converters import extract_user_prompt_from_parts - from agentpool_server.opencode_server.models import FilePartInput - from agentpool_server.opencode_server.models.common import TextSpan - from agentpool_server.opencode_server.models.parts import ResourceSource + from wolfharness import AgentPool, AgentsManifest, NativeAgentConfig + from wolfharness_config.capabilities import GenericCapabilityConfig + from wolfharness_server.opencode_server.converters import extract_user_prompt_from_parts + from wolfharness_server.opencode_server.models import FilePartInput + from wolfharness_server.opencode_server.models.common import TextSpan + from wolfharness_server.opencode_server.models.parts import ResourceSource # Build a real agent config with a GenericCapabilityConfig pointing to # our test ResourceAccess capability. @@ -581,7 +581,7 @@ async def test_resolve_resource_timing_bug() -> None: # This populates _config_capabilities_built (eager build in __init__) # but does NOT register them in the ExtensionRegistry — that only # happens in get_agentlet(), which we deliberately do NOT call. - from agentpool.agents.native_agent import Agent + from wolfharness.agents.native_agent import Agent agent = Agent.from_config( agent_config, @@ -591,8 +591,8 @@ async def test_resolve_resource_timing_bug() -> None: assert agent._config_capabilities_built, "No config capabilities built" # Verify the cap is in _all_capabilities but NOT in the registry - from agentpool.capabilities.extension_registry import Scope, ScopeLevel - from agentpool.capabilities.resource_protocols import ResourceAccess + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.resource_protocols import ResourceAccess ra_caps = [c for c in agent._all_capabilities if isinstance(c, ResourceAccess)] assert len(ra_caps) >= 1, "No ResourceAccess cap in _all_capabilities" @@ -616,7 +616,7 @@ async def test_resolve_resource_timing_bug() -> None: # Verify ResourceCapability is NOT in the registry (it's a tool wrapper, # not a ResourceAccess provider). - from agentpool.capabilities.resource_capability import ResourceCapability + from wolfharness.capabilities.resource_capability import ResourceCapability assert not any(isinstance(c, ResourceCapability) for c in registry_caps), ( "ResourceCapability should not be in get_resource_access() results" @@ -666,9 +666,9 @@ def _make_pool_config( def _make_resource_part(uri: str, client_name: str = "test") -> Any: """Build a FilePartInput with a ResourceSource for @-mention testing.""" - from agentpool_server.opencode_server.models import FilePartInput - from agentpool_server.opencode_server.models.common import TextSpan - from agentpool_server.opencode_server.models.parts import ResourceSource + from wolfharness_server.opencode_server.models import FilePartInput + from wolfharness_server.opencode_server.models.common import TextSpan + from wolfharness_server.opencode_server.models.parts import ResourceSource return FilePartInput( mime="text/plain", @@ -693,8 +693,8 @@ async def test_e2e_at_mention_resolves_resource() -> None: """ import yamling - from agentpool import AgentPool, AgentsManifest - from agentpool_server.opencode_server.converters import extract_user_prompt_from_parts + from wolfharness import AgentPool, AgentsManifest + from wolfharness_server.opencode_server.converters import extract_user_prompt_from_parts config = _make_pool_config( cap_args={"read_text": "hello world", "read_uri": "test://doc.md"}, @@ -702,7 +702,7 @@ async def test_e2e_at_mention_resolves_resource() -> None: manifest = AgentsManifest.model_validate(yamling.load_yaml(config, verify_type=dict)) async with AgentPool(manifest) as pool: - from agentpool.agents.native_agent import Agent + from wolfharness.agents.native_agent import Agent agent = Agent.from_config( pool.agent_configs["test_agent"], @@ -721,8 +721,8 @@ async def test_e2e_at_mention_wrong_uri_returns_empty() -> None: """L2: @-mention with a URI that no cap can resolve → content dropped.""" import yamling - from agentpool import AgentPool, AgentsManifest - from agentpool_server.opencode_server.converters import extract_user_prompt_from_parts + from wolfharness import AgentPool, AgentsManifest + from wolfharness_server.opencode_server.converters import extract_user_prompt_from_parts config = _make_pool_config( cap_args={"read_text": "hello world", "read_uri": "test://doc.md"}, @@ -730,7 +730,7 @@ async def test_e2e_at_mention_wrong_uri_returns_empty() -> None: manifest = AgentsManifest.model_validate(yamling.load_yaml(config, verify_type=dict)) async with AgentPool(manifest) as pool: - from agentpool.agents.native_agent import Agent + from wolfharness.agents.native_agent import Agent agent = Agent.from_config( pool.agent_configs["test_agent"], @@ -756,9 +756,9 @@ async def test_e2e_resource_capability_excluded_from_registry() -> None: """ import yamling - from agentpool import AgentPool, AgentsManifest - from agentpool.capabilities.extension_registry import Scope, ScopeLevel - from agentpool.capabilities.resource_capability import ResourceCapability + from wolfharness import AgentPool, AgentsManifest + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.resource_capability import ResourceCapability config = _make_pool_config() manifest = AgentsManifest.model_validate(yamling.load_yaml(config, verify_type=dict)) @@ -786,9 +786,9 @@ async def test_e2e_multiple_agents_resource_isolation() -> None: """ import yamling - from agentpool import AgentPool, AgentsManifest - from agentpool.capabilities.extension_registry import Scope, ScopeLevel - from agentpool.capabilities.resource_protocols import ResourceAccess + from wolfharness import AgentPool, AgentsManifest + from wolfharness.capabilities.extension_registry import Scope, ScopeLevel + from wolfharness.capabilities.resource_protocols import ResourceAccess config = """\ agents: @@ -830,8 +830,8 @@ async def test_e2e_skill_resource_resolution() -> None: """L2: SkillResource cap → skill:// URI resolved via _resolve_resource.""" import yamling - from agentpool import AgentPool, AgentsManifest - from agentpool_server.opencode_server.converters import extract_user_prompt_from_parts + from wolfharness import AgentPool, AgentsManifest + from wolfharness_server.opencode_server.converters import extract_user_prompt_from_parts config = _make_pool_config( cap_type="tests.fixtures.test_resource_cap.TestSkillResourceCap", @@ -840,7 +840,7 @@ async def test_e2e_skill_resource_resolution() -> None: manifest = AgentsManifest.model_validate(yamling.load_yaml(config, verify_type=dict)) async with AgentPool(manifest) as pool: - from agentpool.agents.native_agent import Agent + from wolfharness.agents.native_agent import Agent agent = Agent.from_config( pool.agent_configs["test_agent"], @@ -891,7 +891,7 @@ async def test_scope_visibility_matrix( Scope hierarchy: POOL > AGENT > SESSION > TURN Query at a scope sees everything at that scope level and above (outer). """ - from agentpool.capabilities.extension_registry import ( + from wolfharness.capabilities.extension_registry import ( ExtensionRegistry, Scope, ScopeLevel, @@ -933,7 +933,7 @@ async def test_agent_isolation_matrix( expected_found: bool, ) -> None: """Matrix: cap at AGENT scope for agent A → query for agent B → not found.""" - from agentpool.capabilities.extension_registry import ( + from wolfharness.capabilities.extension_registry import ( ExtensionRegistry, Scope, ScopeLevel, @@ -972,8 +972,8 @@ async def test_config_cap_no_duplicate_tools_after_get_agentlet() -> None: The fix: register config-defined caps directly at AGENT scope inside _compile_agent_capabilities() but do NOT include them in the returned list. """ - from agentpool import AgentPool, AgentsManifest, NativeAgentConfig - from agentpool_config.capabilities import GenericCapabilityConfig + from wolfharness import AgentPool, AgentsManifest, NativeAgentConfig + from wolfharness_config.capabilities import GenericCapabilityConfig cap_config = GenericCapabilityConfig( type="tests.fixtures.test_resource_cap.TestToolAndResourceCap", @@ -1002,7 +1002,7 @@ async def test_config_cap_no_duplicate_tools_after_get_agentlet() -> None: # (built in __init__). If both lists have the same cap type, # get_agentlet() will assemble duplicate tools → pydantic-ai # raises "tool name conflicts" error. - from agentpool.capabilities.resource_protocols import ResourceAccess + from wolfharness.capabilities.resource_protocols import ResourceAccess extra_ra = [c for c in agent._extra_capabilities if isinstance(c, ResourceAccess)] assert len(extra_ra) == 0, ( diff --git a/tests/servers/opencode_server/test_restart_recovery.py b/tests/servers/opencode_server/test_restart_recovery.py index f16991e00..fb73398c8 100644 --- a/tests/servers/opencode_server/test_restart_recovery.py +++ b/tests/servers/opencode_server/test_restart_recovery.py @@ -8,11 +8,11 @@ import pytest -from agentpool.sessions.models import SessionData -from agentpool_server.opencode_server.models import SessionIdleEvent -from agentpool_server.opencode_server.routes.session_routes import get_or_load_session -from agentpool_server.opencode_server.state import ServerState -from agentpool_storage.opencode_provider import helpers +from wolfharness.sessions.models import SessionData +from wolfharness_server.opencode_server.models import SessionIdleEvent +from wolfharness_server.opencode_server.routes.session_routes import get_or_load_session +from wolfharness_server.opencode_server.state import ServerState +from wolfharness_storage.opencode_provider import helpers pytestmark = pytest.mark.integration diff --git a/tests/servers/opencode_server/test_revert_cycle.py b/tests/servers/opencode_server/test_revert_cycle.py index 7c459703c..0562dc026 100644 --- a/tests/servers/opencode_server/test_revert_cycle.py +++ b/tests/servers/opencode_server/test_revert_cycle.py @@ -18,7 +18,7 @@ import pytest -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessagePath, MessageRequest, @@ -29,7 +29,7 @@ TimeCreated, UserMessage, ) -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( append_message_to_session, ) @@ -37,7 +37,7 @@ if TYPE_CHECKING: from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -735,7 +735,7 @@ async def test_stage_proceeds_after_cancel_timeout( await _add_messages_to_state(server_state, session_id, count=4) # Simulate a busy session: set current_run_id on the session state - from agentpool.orchestrator.session_pool import SessionState as PoolSessionState + from wolfharness.orchestrator.session_pool import SessionState as PoolSessionState busy_session = PoolSessionState( session_id=session_id, @@ -810,7 +810,7 @@ async def test_stale_run_handle_force_clears( await _add_messages_to_state(server_state, session_id, count=4) # Simulate stale run handle - from agentpool.orchestrator.session_pool import SessionState as PoolSessionState + from wolfharness.orchestrator.session_pool import SessionState as PoolSessionState stale_session = PoolSessionState( session_id=session_id, diff --git a/tests/servers/opencode_server/test_revert_stage_clear.py b/tests/servers/opencode_server/test_revert_stage_clear.py index 4b0f2eb28..2c934d8bc 100644 --- a/tests/servers/opencode_server/test_revert_stage_clear.py +++ b/tests/servers/opencode_server/test_revert_stage_clear.py @@ -16,9 +16,9 @@ import pytest -from agentpool.utils.streams import FileOpsTracker -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.models import ( +from wolfharness.utils.streams import FileOpsTracker +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessagePath, MessageTime, @@ -27,7 +27,7 @@ TimeCreated, UserMessage, ) -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( append_message_to_session, ) @@ -38,7 +38,7 @@ if TYPE_CHECKING: from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState # ============================================================================= @@ -213,12 +213,12 @@ async def test_stage_clears_queues( await _add_messages_to_state(server_state, session_id, count=3) # Set up a mock session state with populated queues - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.orchestrator.session_controller import SessionState mock_session_state = SessionState(session_id=session_id, agent_name="test-agent") mock_session_state.prompt_queue.put_nowait("queued prompt 1") mock_session_state.prompt_queue.put_nowait("queued prompt 2") - from agentpool.lifecycle.types import Feedback + from wolfharness.lifecycle.types import Feedback mock_session_state.feedback_queue.put_nowait(Feedback(content="feedback 1", is_steer=False)) @@ -415,7 +415,7 @@ async def test_clear_while_busy_auto_cancels( assert stage_response.status_code == 200 # Simulate a busy session - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.orchestrator.session_controller import SessionState mock_session_state = SessionState(session_id=session_id, agent_name="test-agent") mock_session_state.current_run_id = "run-busy-123" @@ -455,8 +455,8 @@ async def test_clear_does_not_restore_cleared_queues( revert_message_id = messages[0].info.id # Set up a mock session state with populated queues - from agentpool.lifecycle.types import Feedback - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.lifecycle.types import Feedback + from wolfharness.orchestrator.session_controller import SessionState mock_session_state = SessionState(session_id=session_id, agent_name="test-agent") mock_session_state.prompt_queue.put_nowait("queued prompt") diff --git a/tests/servers/opencode_server/test_route_discovery.py b/tests/servers/opencode_server/test_route_discovery.py index f3a3a7af2..04c673750 100644 --- a/tests/servers/opencode_server/test_route_discovery.py +++ b/tests/servers/opencode_server/test_route_discovery.py @@ -15,15 +15,15 @@ from fastapi.testclient import TestClient import pytest -from agentpool.models.manifest import AgentsManifest -from agentpool.storage import StorageManager -from agentpool.utils.streams import FileOpsTracker -from agentpool.utils.todos import TodoTracker -from agentpool_server.opencode_server.dependencies import get_state -from agentpool_server.opencode_server.routes.agent_routes import router as agent_router -from agentpool_server.opencode_server.routes.config_routes import router as config_router -from agentpool_server.opencode_server.routes.global_routes import router as global_router -from agentpool_server.opencode_server.state import ServerState +from wolfharness.models.manifest import AgentsManifest +from wolfharness.storage import StorageManager +from wolfharness.utils.streams import FileOpsTracker +from wolfharness.utils.todos import TodoTracker +from wolfharness_server.opencode_server.dependencies import get_state +from wolfharness_server.opencode_server.routes.agent_routes import router as agent_router +from wolfharness_server.opencode_server.routes.config_routes import router as config_router +from wolfharness_server.opencode_server.routes.global_routes import router as global_router +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -41,7 +41,7 @@ @pytest.fixture def _server_state(tmp_path: Path) -> ServerState: """Build a ServerState with a mock agent for discovery route tests.""" - from agentpool_config.storage import MemoryStorageConfig, StorageConfig + from wolfharness_config.storage import MemoryStorageConfig, StorageConfig storage_manager = StorageManager(config=StorageConfig(providers=[MemoryStorageConfig()])) file_ops = FileOpsTracker() @@ -154,10 +154,10 @@ class TestRouteModuleImports: @pytest.mark.parametrize( "module_name", [ - "agentpool_server.opencode_server.routes.config_routes", - "agentpool_server.opencode_server.routes.agent_routes", - "agentpool_server.opencode_server.routes.global_routes", - "agentpool_server.opencode_server.routes.pty_routes", + "wolfharness_server.opencode_server.routes.config_routes", + "wolfharness_server.opencode_server.routes.agent_routes", + "wolfharness_server.opencode_server.routes.global_routes", + "wolfharness_server.opencode_server.routes.pty_routes", ], ) def test_module_imports_cleanly(self, module_name: str) -> None: @@ -168,10 +168,10 @@ def test_module_imports_cleanly(self, module_name: str) -> None: @pytest.mark.parametrize( "module_name", [ - "agentpool_server.opencode_server.routes.config_routes", - "agentpool_server.opencode_server.routes.agent_routes", - "agentpool_server.opencode_server.routes.global_routes", - "agentpool_server.opencode_server.routes.pty_routes", + "wolfharness_server.opencode_server.routes.config_routes", + "wolfharness_server.opencode_server.routes.agent_routes", + "wolfharness_server.opencode_server.routes.global_routes", + "wolfharness_server.opencode_server.routes.pty_routes", ], ) def test_no_merge_conflict_markers(self, module_name: str) -> None: diff --git a/tests/servers/opencode_server/test_run_error_session_status.py b/tests/servers/opencode_server/test_run_error_session_status.py index c74123d89..3017f5e3f 100644 --- a/tests/servers/opencode_server/test_run_error_session_status.py +++ b/tests/servers/opencode_server/test_run_error_session_status.py @@ -21,19 +21,19 @@ import pytest -from agentpool.agents.events.events import RunErrorEvent -from agentpool.orchestrator.core import EventEnvelope -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.agents.events.events import RunErrorEvent +from wolfharness.orchestrator.core import EventEnvelope +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessageAbortedError, MessagePath, MessageTime, MessageWithParts, ) -from agentpool_server.opencode_server.opencode_event_bridge import ( +from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) @@ -138,7 +138,7 @@ def _patch_set_session_status() -> AsyncMock: from unittest.mock import patch return patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ) @@ -148,7 +148,7 @@ def _patch_append_message() -> AsyncMock: from unittest.mock import patch return patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ) diff --git a/tests/servers/opencode_server/test_server_lifecycle.py b/tests/servers/opencode_server/test_server_lifecycle.py index 359f681a3..d04d914fa 100644 --- a/tests/servers/opencode_server/test_server_lifecycle.py +++ b/tests/servers/opencode_server/test_server_lifecycle.py @@ -14,7 +14,7 @@ import pytest -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -131,8 +131,8 @@ async def test_bootstrap_preserves_pool_access(shared_agent: Mock, mock_pool: Mo After __post_init__, state.pool and state.storage must return the cached references without going through the shared agent. """ - from agentpool.storage import StorageManager - from agentpool_config.storage import MemoryStorageConfig, StorageConfig + from wolfharness.storage import StorageManager + from wolfharness_config.storage import MemoryStorageConfig, StorageConfig storage_manager = StorageManager(config=StorageConfig(providers=[MemoryStorageConfig()])) shared_agent.storage = storage_manager diff --git a/tests/servers/opencode_server/test_session_cache_404.py b/tests/servers/opencode_server/test_session_cache_404.py index fbfdb684b..11e662c2f 100644 --- a/tests/servers/opencode_server/test_session_cache_404.py +++ b/tests/servers/opencode_server/test_session_cache_404.py @@ -23,18 +23,18 @@ import pytest -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessageWithParts, Session, TextPart, TimeCreatedUpdated, UserMessage, ) -from agentpool_server.opencode_server.routes.session_routes import get_or_load_session +from wolfharness_server.opencode_server.routes.session_routes import get_or_load_session if TYPE_CHECKING: - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState def _make_session(session_id: str, parent_id: str | None = None) -> Session: @@ -52,7 +52,7 @@ def _make_session(session_id: str, parent_id: str | None = None) -> Session: def _make_dummy_message(session_id: str) -> MessageWithParts: """Create a minimal message for populating session history.""" - from agentpool_server.opencode_server.models import TimeCreated + from wolfharness_server.opencode_server.models import TimeCreated return MessageWithParts( info=UserMessage( diff --git a/tests/servers/opencode_server/test_session_cwd_consistency.py b/tests/servers/opencode_server/test_session_cwd_consistency.py index 9b300947f..8494ff8ac 100644 --- a/tests/servers/opencode_server/test_session_cwd_consistency.py +++ b/tests/servers/opencode_server/test_session_cwd_consistency.py @@ -18,7 +18,7 @@ import pytest -from agentpool.sessions.models import SessionData +from wolfharness.sessions.models import SessionData pytestmark = pytest.mark.integration @@ -27,7 +27,7 @@ if TYPE_CHECKING: from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState class TestSessionCwdConsistency: diff --git a/tests/servers/opencode_server/test_session_history_loading.py b/tests/servers/opencode_server/test_session_history_loading.py index 673a53564..b2767ff3f 100644 --- a/tests/servers/opencode_server/test_session_history_loading.py +++ b/tests/servers/opencode_server/test_session_history_loading.py @@ -12,8 +12,8 @@ import pytest -from agentpool.sessions.models import SessionData -from agentpool_server.opencode_server.routes.session_routes import get_or_load_session +from wolfharness.sessions.models import SessionData +from wolfharness_server.opencode_server.routes.session_routes import get_or_load_session pytestmark = pytest.mark.integration @@ -24,7 +24,7 @@ from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState class TestSessionHistoryLoading: @@ -133,11 +133,11 @@ async def test_cached_session_with_wrong_agent_session_gets_reloaded( response_b.json()["id"] # Add session A to cache - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( Session, TimeCreatedUpdated, ) - from agentpool_storage.opencode_provider import helpers + from wolfharness_storage.opencode_provider import helpers now = int(datetime.now(UTC).timestamp() * 1000) session_a = Session( diff --git a/tests/servers/opencode_server/test_session_integration.py b/tests/servers/opencode_server/test_session_integration.py index 5c458852f..242030a9e 100644 --- a/tests/servers/opencode_server/test_session_integration.py +++ b/tests/servers/opencode_server/test_session_integration.py @@ -26,11 +26,11 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator -from agentpool.lifecycle.types import DeliveryMode -from agentpool.orchestrator.core import SessionPool -from agentpool.sessions.models import SessionData -from agentpool_server.opencode_server.input_provider import OpenCodeInputProvider -from agentpool_server.opencode_server.state import ServerState +from wolfharness.lifecycle.types import DeliveryMode +from wolfharness.orchestrator.core import SessionPool +from wolfharness.sessions.models import SessionData +from wolfharness_server.opencode_server.input_provider import OpenCodeInputProvider +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -49,8 +49,8 @@ def _stream_empty(queue: asyncio.Queue[Any]) -> bool: @pytest.fixture def mock_agent_pool() -> Mock: """Create a mock AgentPool for SessionPool construction.""" - from agentpool.agents.events import RunStartedEvent, StreamCompleteEvent - from agentpool.messaging.messages import ChatMessage + from wolfharness.agents.events import RunStartedEvent, StreamCompleteEvent + from wolfharness.messaging.messages import ChatMessage pool = Mock() pool.main_agent = Mock() @@ -170,7 +170,7 @@ class TestOpenCodeSessionPoolIntegrationExists: @pytest.mark.asyncio async def test_integration_class_importable(self) -> None: """The OpenCodeSessionPoolIntegration class should be importable.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -183,7 +183,7 @@ async def test_integration_initialization( server_state: ServerState, ) -> None: """Integration should accept SessionPool and ServerState.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -205,7 +205,7 @@ async def test_create_session_delegates_to_session_pool( server_state: ServerState, ) -> None: """Creating a session should delegate to SessionPool.create_session().""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -234,7 +234,7 @@ async def test_create_session_persists_to_store( mock_session_store: Mock, ) -> None: """Session creation should persist to the session store.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -261,7 +261,7 @@ async def test_create_session_broadcasts_created_event( server_state: ServerState, ) -> None: """Session creation should broadcast a session.created SSE event.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -300,7 +300,7 @@ async def test_route_message_creates_run_handle( server_state: ServerState, ) -> None: """Routing a message should create a RunHandle via receive_request().""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -330,7 +330,7 @@ async def test_route_message_with_when_idle_priority_queues( server_state: ServerState, ) -> None: """Routing with 'when_idle' priority should queue when busy.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -370,7 +370,7 @@ async def test_route_message_with_asap_priority_injects( server_state: ServerState, ) -> None: """Routing with 'asap' priority should inject into active turn.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -400,7 +400,7 @@ async def test_route_message_publishes_run_started_event( server_state: ServerState, ) -> None: """Routing a message should publish RunStartedEvent to EventBus.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -448,7 +448,7 @@ async def test_create_session_starts_event_consumer( server_state: ServerState, ) -> None: """Creating a session should start the event consumer.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -472,7 +472,7 @@ async def test_status_broadcasts_busy_on_run_start( server_state: ServerState, ) -> None: """Run start should broadcast session.status with type 'busy'.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -520,7 +520,7 @@ async def test_status_broadcasts_idle_on_run_complete( server_state: ServerState, ) -> None: """Run completion should broadcast session.status with type 'idle'.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -574,7 +574,7 @@ async def test_abort_session_cancels_active_run( server_state: ServerState, ) -> None: """Aborting a session should cancel the active run.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -647,7 +647,7 @@ async def test_abort_session_broadcasts_error_event( server_state: ServerState, ) -> None: """Abort should broadcast a session.error SSE event.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -687,7 +687,7 @@ async def test_abort_idle_session_is_noop( server_state: ServerState, ) -> None: """Aborting an idle session should be a no-op.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -715,7 +715,7 @@ async def test_fork_session_creates_child_with_parent( server_state: ServerState, ) -> None: """Forking a session should create a child with parent_session_id.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -749,7 +749,7 @@ async def test_fork_session_inherits_metadata( mock_session_store: Mock, ) -> None: """Forked session should inherit parent's metadata.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -794,7 +794,7 @@ async def test_fork_session_tracked_as_child( server_state: ServerState, ) -> None: """Forked session should be tracked as a child of parent.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -832,7 +832,7 @@ async def test_attach_input_provider_to_session( mock_input_provider: OpenCodeInputProvider, ) -> None: """Input provider should be attachable to a session.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -863,7 +863,7 @@ async def test_route_message_with_input_provider( mock_input_provider: OpenCodeInputProvider, ) -> None: """Routing a message should pass the input provider to the turn runner.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -904,7 +904,7 @@ async def test_concurrent_sessions_have_isolated_input_providers( providers on ``SessionState`` only and lets SessionController pass the correct one at run time. """ - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -924,7 +924,7 @@ async def test_concurrent_sessions_have_isolated_input_providers( ) # Create distinct input providers for each session - from agentpool_server.opencode_server.input_provider import OpenCodeInputProvider + from wolfharness_server.opencode_server.input_provider import OpenCodeInputProvider provider_a = OpenCodeInputProvider( state=server_state, session_id="test-session-concurrent-a" @@ -968,7 +968,7 @@ async def test_subscribe_to_session_events( """Should be able to subscribe to session events and receive OpenCode events.""" import asyncio - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -1002,7 +1002,7 @@ async def test_event_conversion_in_subscription( server_state: ServerState, ) -> None: """Subscribed events should be converted to OpenCode SSE events.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -1017,7 +1017,7 @@ async def test_event_conversion_in_subscription( ) # Publish a RunErrorEvent which is converted to SessionErrorEvent by the adapter - from agentpool.agents.events import RunErrorEvent + from wolfharness.agents.events import RunErrorEvent await session_pool.event_bus.publish( "test-session-017", @@ -1052,7 +1052,7 @@ async def test_shutdown_closes_all_sessions( server_state: ServerState, ) -> None: """Shutting down integration should close all tracked sessions.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) @@ -1082,7 +1082,7 @@ async def test_get_session_status_returns_current_status( server_state: ServerState, ) -> None: """Should return the current status of a session.""" - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) diff --git a/tests/servers/opencode_server/test_session_lifecycle.py b/tests/servers/opencode_server/test_session_lifecycle.py index fa97a3aad..4422d4642 100644 --- a/tests/servers/opencode_server/test_session_lifecycle.py +++ b/tests/servers/opencode_server/test_session_lifecycle.py @@ -19,9 +19,9 @@ import pytest -from agentpool.sessions.models import SessionData -from agentpool_server.opencode_server.models import Session -from agentpool_server.opencode_server.models.events import ( +from wolfharness.sessions.models import SessionData +from wolfharness_server.opencode_server.models import Session +from wolfharness_server.opencode_server.models.events import ( SessionCreatedEvent, SessionIdleEvent, SessionStatusEvent, @@ -31,8 +31,8 @@ if TYPE_CHECKING: from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState from tests.servers.opencode_server.conftest import EventCapture + from wolfharness_server.opencode_server.state import ServerState class TestSessionCreatedEvent: @@ -304,8 +304,8 @@ async def test_list_sessions_uses_session_controller_when_available( """list_sessions delegates to SessionController when session_controller is set.""" from unittest.mock import Mock - from agentpool_server.opencode_server.models.common import TimeCreatedUpdated - from agentpool_server.opencode_server.models.session_info import SessionInfo + from wolfharness_server.opencode_server.models.common import TimeCreatedUpdated + from wolfharness_server.opencode_server.models.session_info import SessionInfo # Pre-populate the session cache so the route does not need storage server_state.sessions["ses_ctrl_001"] = Session( @@ -424,7 +424,7 @@ async def test_abort_native_agent_calls_interrupt_not_cancel_run( abort handler must NOT call session_pool.cancel_run() again. A double cancel() kills the start() generator (issue #182). """ - from agentpool.orchestrator.core import SessionState + from wolfharness.orchestrator.core import SessionState response = await async_client.post("/session", json={"title": "Native Agent Session"}) session_id = response.json()["id"] @@ -466,7 +466,7 @@ async def test_abort_non_native_shared_agent_skips_interrupt( server_state: ServerState, ): """Aborting a non-native shared agent should cancel run but NOT interrupt shared agent.""" - from agentpool.orchestrator.core import SessionState + from wolfharness.orchestrator.core import SessionState response = await async_client.post("/session", json={"title": "Shared Agent Session"}) session_id = response.json()["id"] diff --git a/tests/servers/opencode_server/test_session_pool_integration.py b/tests/servers/opencode_server/test_session_pool_integration.py index 44feac661..645cfa4f5 100644 --- a/tests/servers/opencode_server/test_session_pool_integration.py +++ b/tests/servers/opencode_server/test_session_pool_integration.py @@ -11,14 +11,14 @@ import pytest -from agentpool.agents.events import SpawnSessionStart, StreamCompleteEvent -from agentpool.messaging import ChatMessage -from agentpool_server.opencode_server.models import ( +from wolfharness.agents.events import SpawnSessionStart, StreamCompleteEvent +from wolfharness.messaging import ChatMessage +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( TimeStart, ToolPart, ToolStateCompleted, @@ -37,7 +37,7 @@ def _make_assistant_msg(session_id: str = "parent-test") -> MessageWithParts: agent_name="lead-agent", model_id="test-model", parent_id="parent-user-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) @@ -52,7 +52,7 @@ async def test_update_parent_toolpart_via_session_pool_integration( This test verifies the fix for the bug where _update_parent_toolpart checked part.metadata instead of part.state.metadata. """ - from agentpool_server.opencode_server.session_pool_integration import ( + from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ) diff --git a/tests/servers/opencode_server/test_session_provisioning.py b/tests/servers/opencode_server/test_session_provisioning.py index debb412e5..9f63b9b9e 100644 --- a/tests/servers/opencode_server/test_session_provisioning.py +++ b/tests/servers/opencode_server/test_session_provisioning.py @@ -14,12 +14,12 @@ import pytest -from agentpool.agents.base_agent import BaseAgent -from agentpool.agents.native_agent.checkpoint import CheckpointData -from agentpool.lifecycle.types import DeliveryMode -from agentpool.sessions.models import PendingDeferredCall, SessionData -from agentpool_server.opencode_server.converters import session_data_to_opencode -from agentpool_server.opencode_server.models import ( +from wolfharness.agents.base_agent import BaseAgent +from wolfharness.agents.native_agent.checkpoint import CheckpointData +from wolfharness.lifecycle.types import DeliveryMode +from wolfharness.sessions.models import PendingDeferredCall, SessionData +from wolfharness_server.opencode_server.converters import session_data_to_opencode +from wolfharness_server.opencode_server.models import ( MessageWithParts, Session, SessionCreatedEvent, @@ -28,15 +28,15 @@ SessionUpdatedEvent, TimeCreatedUpdated, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( ToolPart, ToolStateRunning, ) -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, ensure_session, ) -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -464,7 +464,7 @@ async def test_ensure_session_checkpointed_restores_input_provider( with ( patch.object(mock_state, "broadcast_event", new=AsyncMock()), patch( - "agentpool_server.opencode_server.input_provider.OpenCodeInputProvider" + "wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider" ) as mock_prov_cls, ): mock_prov = MagicMock() @@ -497,7 +497,7 @@ async def test_ensure_session_checkpointed_without_store( with ( patch.object(mock_state, "broadcast_event", new=AsyncMock()), patch( - "agentpool_server.opencode_server.input_provider.OpenCodeInputProvider" + "wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider" ) as mock_prov_cls, ): mock_prov_cls.return_value = MagicMock() @@ -687,8 +687,8 @@ async def test_concurrent_calls_produce_one_session( mock_state_store_first.pool.storage.load_session = AsyncMock(return_value=None) with ( - patch("agentpool_server.opencode_server.converters.opencode_to_session_data"), - patch("agentpool_server.opencode_server.input_provider.OpenCodeInputProvider"), + patch("wolfharness_server.opencode_server.converters.opencode_to_session_data"), + patch("wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider"), patch.object(mock_state_store_first, "broadcast_event", new=AsyncMock()), ): results = await asyncio.gather( @@ -845,9 +845,11 @@ async def test_store_miss_fallback_creates_and_persists( mock_state_store_first.pool.session_pool.sessions.store = mock_store with ( - patch("agentpool_server.opencode_server.converters.opencode_to_session_data") as mock_conv, patch( - "agentpool_server.opencode_server.input_provider.OpenCodeInputProvider" + "wolfharness_server.opencode_server.converters.opencode_to_session_data" + ) as mock_conv, + patch( + "wolfharness_server.opencode_server.input_provider.OpenCodeInputProvider" ) as mock_prov_cls, patch.object(mock_state_store_first, "broadcast_event", new=AsyncMock()), ): diff --git a/tests/servers/opencode_server/test_session_scoped_consumer.py b/tests/servers/opencode_server/test_session_scoped_consumer.py index add3f2331..856a73d69 100644 --- a/tests/servers/opencode_server/test_session_scoped_consumer.py +++ b/tests/servers/opencode_server/test_session_scoped_consumer.py @@ -8,20 +8,20 @@ import pytest -from agentpool.agents.events import RunStartedEvent, StreamCompleteEvent -from agentpool.agents.events.events import UserMessageInsertedEvent -from agentpool.messaging.messages import ChatMessage -from agentpool.orchestrator.core import SessionPool -from agentpool_server.opencode_server.models import ( +from wolfharness.agents.events import RunStartedEvent, StreamCompleteEvent +from wolfharness.agents.events.events import UserMessageInsertedEvent +from wolfharness.messaging.messages import ChatMessage +from wolfharness.orchestrator.core import SessionPool +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, ) -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( OpenCodeSessionPoolIntegration, get_messages_for_session, ) -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -30,7 +30,7 @@ @pytest.fixture def mock_agent_pool() -> Mock: """Create a mock AgentPool for SessionPool construction.""" - from agentpool.messaging.messages import ChatMessage + from wolfharness.messaging.messages import ChatMessage pool = Mock() pool.main_agent = Mock() @@ -353,7 +353,7 @@ async def test_consumer_handles_spawn_session_start( server_state: ServerState, ) -> None: """Consumer should handle SpawnSessionStart by creating child consumers.""" - from agentpool.agents.events import SpawnSessionStart + from wolfharness.agents.events import SpawnSessionStart integration = OpenCodeSessionPoolIntegration( session_pool=session_pool, diff --git a/tests/servers/opencode_server/test_session_storage_load.py b/tests/servers/opencode_server/test_session_storage_load.py index 8b68d0402..bb997cadb 100644 --- a/tests/servers/opencode_server/test_session_storage_load.py +++ b/tests/servers/opencode_server/test_session_storage_load.py @@ -13,9 +13,9 @@ import pytest -from agentpool.sessions.models import SessionData -from agentpool_server.opencode_server.models import Session, SessionUpdatedEvent -from agentpool_server.opencode_server.routes.session_routes import get_or_load_session +from wolfharness.sessions.models import SessionData +from wolfharness_server.opencode_server.models import Session, SessionUpdatedEvent +from wolfharness_server.opencode_server.routes.session_routes import get_or_load_session pytestmark = pytest.mark.integration @@ -24,7 +24,7 @@ if TYPE_CHECKING: from pathlib import Path - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState @pytest.fixture @@ -50,7 +50,7 @@ def mock_state_and_broadcast( Returns a tuple of (state, broadcast_mock) so the test can inspect broadcast calls without fighting pyright's type narrowing on overridden methods. """ - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState agent = Mock() diff --git a/tests/servers/opencode_server/test_session_switch_input_provider.py b/tests/servers/opencode_server/test_session_switch_input_provider.py index 2680f338f..0530cd504 100644 --- a/tests/servers/opencode_server/test_session_switch_input_provider.py +++ b/tests/servers/opencode_server/test_session_switch_input_provider.py @@ -14,9 +14,9 @@ import pytest -from agentpool.sessions.models import SessionData -from agentpool_server.opencode_server.input_provider import OpenCodeInputProvider -from agentpool_server.opencode_server.routes.session_routes import get_or_load_session +from wolfharness.sessions.models import SessionData +from wolfharness_server.opencode_server.input_provider import OpenCodeInputProvider +from wolfharness_server.opencode_server.routes.session_routes import get_or_load_session pytestmark = pytest.mark.integration @@ -27,7 +27,7 @@ from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState class TestSessionSwitchInputProvider: diff --git a/tests/servers/opencode_server/test_session_title_fixes.py b/tests/servers/opencode_server/test_session_title_fixes.py index 38c54046e..15f947154 100644 --- a/tests/servers/opencode_server/test_session_title_fixes.py +++ b/tests/servers/opencode_server/test_session_title_fixes.py @@ -16,17 +16,21 @@ import anyio import pytest -from agentpool.sessions.models import SessionData -from agentpool.storage.manager import SessionMetadata, SessionMetadataGeneratedEvent, StorageManager -from agentpool_config.storage import MemoryStorageConfig, SQLStorageConfig, StorageConfig -from agentpool_server.opencode_server.converters import ( +from wolfharness.sessions.models import SessionData +from wolfharness.storage.manager import ( + SessionMetadata, + SessionMetadataGeneratedEvent, + StorageManager, +) +from wolfharness_config.storage import MemoryStorageConfig, SQLStorageConfig, StorageConfig +from wolfharness_server.opencode_server.converters import ( opencode_to_session_data, session_data_to_opencode, ) -from agentpool_server.opencode_server.models import Session -from agentpool_server.opencode_server.models.common import TimeCreatedUpdated -from agentpool_storage.memory_provider.provider import MemoryStorageProvider -from agentpool_storage.sql_provider.sql_provider import SQLModelProvider +from wolfharness_server.opencode_server.models import Session +from wolfharness_server.opencode_server.models.common import TimeCreatedUpdated +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider +from wolfharness_storage.sql_provider.sql_provider import SQLModelProvider pytestmark = pytest.mark.integration @@ -414,8 +418,8 @@ class TestOpenCodeProviderTitleFix: async def test_save_session_creates_new_session_file(self, tmp_path: Path) -> None: """Verify save_session creates new session file when it doesn't exist.""" - from agentpool_config.storage import OpenCodeStorageConfig - from agentpool_storage.opencode_provider.provider import OpenCodeStorageProvider + from wolfharness_config.storage import OpenCodeStorageConfig + from wolfharness_storage.opencode_provider.provider import OpenCodeStorageProvider config = OpenCodeStorageConfig(path=str(tmp_path / "opencode_storage")) provider = OpenCodeStorageProvider(config) @@ -437,7 +441,7 @@ async def test_save_session_creates_new_session_file(self, tmp_path: Path) -> No assert session_file.exists(), f"Session file should be created at {session_file}" # Verify title was saved - from agentpool_storage.opencode_provider import helpers + from wolfharness_storage.opencode_provider import helpers oc_session = helpers.read_session(session_file) assert oc_session is not None @@ -448,8 +452,8 @@ async def test_save_session_creates_new_session_file(self, tmp_path: Path) -> No async def test_save_session_updates_existing_session(self, tmp_path: Path) -> None: """Verify save_session updates existing session file.""" - from agentpool_config.storage import OpenCodeStorageConfig - from agentpool_storage.opencode_provider.provider import OpenCodeStorageProvider + from wolfharness_config.storage import OpenCodeStorageConfig + from wolfharness_storage.opencode_provider.provider import OpenCodeStorageProvider config = OpenCodeStorageConfig(path=str(tmp_path / "opencode_storage")) provider = OpenCodeStorageProvider(config) @@ -474,7 +478,7 @@ async def test_save_session_updates_existing_session(self, tmp_path: Path) -> No # Verify title was updated session_file = provider.sessions_path / "test_project" / "update_session_001.json" - from agentpool_storage.opencode_provider import helpers + from wolfharness_storage.opencode_provider import helpers oc_session = helpers.read_session(session_file) assert oc_session is not None @@ -483,8 +487,8 @@ async def test_save_session_updates_existing_session(self, tmp_path: Path) -> No async def test_load_session_reads_title(self, tmp_path: Path) -> None: """Verify load_session reads title from session file.""" - from agentpool_config.storage import OpenCodeStorageConfig - from agentpool_storage.opencode_provider.provider import OpenCodeStorageProvider + from wolfharness_config.storage import OpenCodeStorageConfig + from wolfharness_storage.opencode_provider.provider import OpenCodeStorageProvider config = OpenCodeStorageConfig(path=str(tmp_path / "opencode_storage")) provider = OpenCodeStorageProvider(config) @@ -554,7 +558,7 @@ async def test_generate_title_core_resolves_variant_name(self) -> None: manager._model_variants = {"my-variant": mock_variant} # Patch the Agent import inside the method body - with patch("agentpool.Agent") as mock_agent_cls: + with patch("wolfharness.Agent") as mock_agent_cls: mock_agent = MagicMock() mock_result = MagicMock() mock_result.data = SessionMetadata( diff --git a/tests/servers/opencode_server/test_session_title_integration.py b/tests/servers/opencode_server/test_session_title_integration.py index 650e819d5..311fa6b86 100644 --- a/tests/servers/opencode_server/test_session_title_integration.py +++ b/tests/servers/opencode_server/test_session_title_integration.py @@ -16,13 +16,13 @@ import anyio import pytest -from agentpool.sessions.models import SessionData -from agentpool_server.opencode_server.converters import ( +from wolfharness.sessions.models import SessionData +from wolfharness_server.opencode_server.converters import ( opencode_to_session_data, session_data_to_opencode, ) -from agentpool_server.opencode_server.models import Session -from agentpool_server.opencode_server.models.common import TimeCreatedUpdated +from wolfharness_server.opencode_server.models import Session +from wolfharness_server.opencode_server.models.common import TimeCreatedUpdated pytestmark = pytest.mark.integration @@ -31,7 +31,7 @@ if TYPE_CHECKING: from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState class TestSessionTitlePersistence: @@ -226,7 +226,7 @@ async def test_log_session_triggers_title_generation( Note: This test mocks the LLM call to avoid external dependencies. """ - from agentpool.storage.manager import SessionMetadata, StorageManager + from wolfharness.storage.manager import SessionMetadata, StorageManager session_id = "test_title_gen_123" diff --git a/tests/servers/opencode_server/test_share_revert.py b/tests/servers/opencode_server/test_share_revert.py index 2b13a16d0..6b60ac001 100644 --- a/tests/servers/opencode_server/test_share_revert.py +++ b/tests/servers/opencode_server/test_share_revert.py @@ -11,8 +11,8 @@ import pytest -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.models import ( +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessagePath, MessageTime, @@ -21,7 +21,7 @@ TimeCreated, UserMessage, ) -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.session_pool_integration import ( append_message_to_session, ) @@ -32,7 +32,7 @@ if TYPE_CHECKING: from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState # ============================================================================= @@ -138,7 +138,7 @@ async def test_share_session_copies_all_messages( mock_sharer.share_conversation = AsyncMock(return_value=mock_result) with patch( - "agentpool_server.opencode_server.routes.session_routes.OpenCodeSharer", + "wolfharness_server.opencode_server.routes.session_routes.OpenCodeSharer", return_value=mock_sharer, ): share_response = await async_client.post(f"/session/{session_id}/share") @@ -172,7 +172,7 @@ async def test_share_session_with_message_limit( mock_sharer.share_conversation = AsyncMock(return_value=mock_result) with patch( - "agentpool_server.opencode_server.routes.session_routes.OpenCodeSharer", + "wolfharness_server.opencode_server.routes.session_routes.OpenCodeSharer", return_value=mock_sharer, ): share_response = await async_client.post(f"/session/{session_id}/share?num_messages=3") @@ -226,7 +226,7 @@ async def test_share_session_uses_message_history_api( mock_sharer.share_conversation = AsyncMock(return_value=mock_result) with patch( - "agentpool_server.opencode_server.routes.session_routes.OpenCodeSharer", + "wolfharness_server.opencode_server.routes.session_routes.OpenCodeSharer", return_value=mock_sharer, ): share_response = await async_client.post(f"/session/{session_id}/share") @@ -516,7 +516,7 @@ async def test_share_then_revert_in_same_session( # Debug: check what get_messages_for_session returns with patch( - "agentpool_server.opencode_server.routes.session_routes.OpenCodeSharer", + "wolfharness_server.opencode_server.routes.session_routes.OpenCodeSharer", return_value=mock_sharer, ): share_response = await async_client.post(f"/session/{session_id}/share") diff --git a/tests/servers/opencode_server/test_shell.py b/tests/servers/opencode_server/test_shell.py index 5e60f9c5a..378a9e2d5 100644 --- a/tests/servers/opencode_server/test_shell.py +++ b/tests/servers/opencode_server/test_shell.py @@ -13,8 +13,8 @@ import pytest -from agentpool_server.opencode_server.models import ShellRequest -from agentpool_server.opencode_server.routes.session_routes import run_shell_command +from wolfharness_server.opencode_server.models import ShellRequest +from wolfharness_server.opencode_server.routes.session_routes import run_shell_command pytestmark = pytest.mark.integration diff --git a/tests/servers/opencode_server/test_skill_autocomplete.py b/tests/servers/opencode_server/test_skill_autocomplete.py index e3ab55915..dbdf80a6a 100644 --- a/tests/servers/opencode_server/test_skill_autocomplete.py +++ b/tests/servers/opencode_server/test_skill_autocomplete.py @@ -14,14 +14,14 @@ import pytest from upathtools import UPath -from agentpool.skills.command import SkillCommand -from agentpool.skills.skill import Skill +from wolfharness.skills.command import SkillCommand +from wolfharness.skills.skill import Skill if TYPE_CHECKING: from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.asyncio @@ -109,7 +109,7 @@ async def test_command_endpoint_skill_provider_fallback( server_state.skill_bridge = None # Create skill_resolver mock - from agentpool.capabilities.resource_protocols import SkillEntry + from wolfharness.capabilities.resource_protocols import SkillEntry mock_entry = SkillEntry( name="provider-skill", diff --git a/tests/servers/opencode_server/test_skill_command_execution.py b/tests/servers/opencode_server/test_skill_command_execution.py index eefe9da02..639284de6 100644 --- a/tests/servers/opencode_server/test_skill_command_execution.py +++ b/tests/servers/opencode_server/test_skill_command_execution.py @@ -7,7 +7,7 @@ import pytest -from agentpool_server.opencode_server.routes.session_routes import _process_skill_template +from wolfharness_server.opencode_server.routes.session_routes import _process_skill_template pytestmark = pytest.mark.integration diff --git a/tests/servers/opencode_server/test_skill_command_path.py b/tests/servers/opencode_server/test_skill_command_path.py index 66350b03a..d1071beed 100644 --- a/tests/servers/opencode_server/test_skill_command_path.py +++ b/tests/servers/opencode_server/test_skill_command_path.py @@ -25,14 +25,14 @@ import pytest from slashed import Command as SlashedCommand, CommandContext -from agentpool_server.opencode_server.event_processor import ( +from wolfharness_server.opencode_server.event_processor import ( OpenCodeUserMessageMeta, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( TextPart, UserMessage, ) -from agentpool_server.opencode_server.routes.session_routes import ( +from wolfharness_server.opencode_server.routes.session_routes import ( _CommandOutputCapture, _DiscardOutputWriter, ) @@ -41,7 +41,7 @@ if TYPE_CHECKING: from httpx import AsyncClient as HttpxAsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState pytestmark = [pytest.mark.asyncio, pytest.mark.integration] diff --git a/tests/servers/opencode_server/test_soft_hide_revert.py b/tests/servers/opencode_server/test_soft_hide_revert.py index df6019827..27a230efa 100644 --- a/tests/servers/opencode_server/test_soft_hide_revert.py +++ b/tests/servers/opencode_server/test_soft_hide_revert.py @@ -14,9 +14,9 @@ import pytest -from agentpool.messaging.messages import ChatMessage -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.models import ( +from wolfharness.messaging.messages import ChatMessage +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessagePath, MessageTime, @@ -25,13 +25,13 @@ TimeCreated, UserMessage, ) -from agentpool_server.opencode_server.models.common import TimeCreatedUpdated -from agentpool_server.opencode_server.models.session import Session, SessionRevert -from agentpool_server.opencode_server.opencode_message_bridge import ( +from wolfharness_server.opencode_server.models.common import TimeCreatedUpdated +from wolfharness_server.opencode_server.models.session import Session, SessionRevert +from wolfharness_server.opencode_server.opencode_message_bridge import ( _apply_revert_filter, get_messages_for_session, ) -from agentpool_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.unit @@ -380,7 +380,7 @@ async def test_revert_filter_with_non_empty_session_pool( state.agent = Mock() state.agent.name = "test-agent" state.agent.model_name = None - state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) state.working_dir = "/tmp" pool_mock = Mock() @@ -432,7 +432,7 @@ async def test_session_pool_with_no_revert_returns_all( state.agent = Mock() state.agent.name = "test-agent" state.agent.model_name = None - state.resolve_default_model_info = Mock(return_value=("default", "agentpool")) + state.resolve_default_model_info = Mock(return_value=("default", "wolfharness")) state.working_dir = "/tmp" pool_mock = Mock() diff --git a/tests/servers/opencode_server/test_sse_compliance.py b/tests/servers/opencode_server/test_sse_compliance.py index 2201b0c73..dab209e0c 100644 --- a/tests/servers/opencode_server/test_sse_compliance.py +++ b/tests/servers/opencode_server/test_sse_compliance.py @@ -20,13 +20,13 @@ import pytest -from agentpool_server.opencode_server.models import GlobalEvent -from agentpool_server.opencode_server.models.common import ( +from wolfharness_server.opencode_server.models import GlobalEvent +from wolfharness_server.opencode_server.models.common import ( FileDiff, ModelRef, TimeCreated, ) -from agentpool_server.opencode_server.models.events import ( +from wolfharness_server.opencode_server.models.events import ( CommandExecutedEvent, MessageUpdatedEvent, PartDeltaEvent, @@ -42,24 +42,24 @@ TodoUpdatedEvent, TuiSessionSelectEvent, ) -from agentpool_server.opencode_server.models.message import UserMessage -from agentpool_server.opencode_server.models.parts import TextPart -from agentpool_server.opencode_server.models.session import ( +from wolfharness_server.opencode_server.models.message import UserMessage +from wolfharness_server.opencode_server.models.parts import TextPart +from wolfharness_server.opencode_server.models.session import ( Session, TimeCreatedUpdated as SessionTimeCreatedUpdated, ) -from agentpool_server.opencode_server.routes.global_routes import ( +from wolfharness_server.opencode_server.routes.global_routes import ( GlobalEventFactory, _event_generator, _extract_session_id, _serialize_event, ) -from agentpool_server.opencode_server.routes.routing import tui_event_filter +from wolfharness_server.opencode_server.routes.routing import tui_event_filter if TYPE_CHECKING: - from agentpool_server.opencode_server.models.events import Event - from agentpool_server.opencode_server.models.parts import Part + from wolfharness_server.opencode_server.models.events import Event + from wolfharness_server.opencode_server.models.parts import Part # ============================================================================= @@ -111,7 +111,7 @@ async def unsubscribe(self, session_id: str, queue: asyncio.Queue[Any]) -> None: queue.shutdown() async def publish(self, session_id: str, event: Any) -> None: - from agentpool.orchestrator.core import EventEnvelope + from wolfharness.orchestrator.core import EventEnvelope envelope = EventEnvelope(source_session_id=session_id, event=event) for subscriber_sid, subscribers in self._subscribers.items(): @@ -159,7 +159,7 @@ def __init__(self, working_dir: str = "/tmp/test_wd") -> None: def get_event_factory(self) -> GlobalEventFactory: if self._event_factory is None: - from agentpool_storage.opencode_provider import helpers + from wolfharness_storage.opencode_provider import helpers directory = self.working_dir self._event_factory = GlobalEventFactory( diff --git a/tests/servers/opencode_server/test_sse_headers.py b/tests/servers/opencode_server/test_sse_headers.py index 4e42b5e14..36794b1d7 100644 --- a/tests/servers/opencode_server/test_sse_headers.py +++ b/tests/servers/opencode_server/test_sse_headers.py @@ -11,7 +11,7 @@ import pytest -from agentpool_server.opencode_server.routes.global_routes import get_events, get_global_events +from wolfharness_server.opencode_server.routes.global_routes import get_events, get_global_events pytestmark = pytest.mark.integration diff --git a/tests/servers/opencode_server/test_step_usage.py b/tests/servers/opencode_server/test_step_usage.py index 4f5e38733..1b159b2fd 100644 --- a/tests/servers/opencode_server/test_step_usage.py +++ b/tests/servers/opencode_server/test_step_usage.py @@ -14,28 +14,28 @@ from pydantic_ai.usage import RunUsage import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( PartDeltaEvent as AgentPoolPartDeltaEvent, PartStartEvent, StepUsageEvent, StreamCompleteEvent, ) -from agentpool_server.opencode_server.event_adapter import OpenCodeEventAdapter -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness_server.opencode_server.event_adapter import OpenCodeEventAdapter +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, PartDeltaEvent, PartUpdatedEvent, ) -from agentpool_server.opencode_server.models.parts import ( +from wolfharness_server.opencode_server.models.parts import ( StepFinishPart, TextPart, ) -from agentpool_server.opencode_server.stream_adapter import OpenCodeStreamAdapter +from wolfharness_server.opencode_server.stream_adapter import OpenCodeStreamAdapter pytestmark = pytest.mark.integration @@ -57,7 +57,7 @@ def adapter_context() -> EventProcessorContext: time=MessageTime(created=0), agent_name="test-agent", model_id="test-model", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), parent_id="msg-000", ) @@ -216,7 +216,7 @@ async def test_final_step_finish_still_emitted( time=MessageTime(created=0), agent_name="test-agent", model_id="test-model", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), parent_id="msg-000", ), @@ -400,7 +400,7 @@ async def test_step_finish_emitted_flag_edge_cases( time=MessageTime(created=0), agent_name="test-agent", model_id="test-model", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), parent_id="msg-000", ), @@ -428,7 +428,7 @@ async def test_step_finish_emitted_flag_edge_cases( time=MessageTime(created=0), agent_name="test-agent", model_id="test-model", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), parent_id="msg-000", ), @@ -471,7 +471,7 @@ async def test_step_finish_emitted_flag_edge_cases( time=MessageTime(created=0), agent_name="test-agent", model_id="test-model", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), parent_id="msg-000", ), @@ -532,7 +532,7 @@ async def test_subagent_session_id_does_not_suppress_parent_finalize( a *child* context (different session_id), then verifying the parent adapter's ``finalize()`` still emits its own ``StepFinishPart``. """ - from agentpool_server.opencode_server.event_processor import EventProcessor + from wolfharness_server.opencode_server.event_processor import EventProcessor # --- Create parent adapter --- adapter = _make_stream_adapter(adapter_context) @@ -547,7 +547,7 @@ async def test_subagent_session_id_does_not_suppress_parent_finalize( time=MessageTime(created=0), agent_name="test-agent", model_id="test-model", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), parent_id="msg-000", ) diff --git a/tests/servers/opencode_server/test_stream_adapter_event_feed.py b/tests/servers/opencode_server/test_stream_adapter_event_feed.py index 01b0efb39..0e7ba2880 100644 --- a/tests/servers/opencode_server/test_stream_adapter_event_feed.py +++ b/tests/servers/opencode_server/test_stream_adapter_event_feed.py @@ -14,13 +14,14 @@ from pydantic_ai import RequestUsage import pytest -from agentpool.agents.events import StreamCompleteEvent -from agentpool.lifecycle import RunOutcome, RunState -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventBus -from agentpool.utils import identifiers as identifier -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.models import ( +from tests.servers.opencode_server.conftest import run_message_phases +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.lifecycle import RunOutcome, RunState +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventBus +from wolfharness.utils import identifiers as identifier +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessagePath, MessageRequest, @@ -31,12 +32,11 @@ TimeCreatedUpdated, UserMessage, ) -from agentpool_server.opencode_server.models.message import MessageWithParts -from agentpool_server.opencode_server.models.parts import StepFinishPart -from agentpool_server.opencode_server.session_pool_integration import get_messages_for_session -from agentpool_server.opencode_server.state import ServerState -from agentpool_server.opencode_server.stream_adapter import OpenCodeStreamAdapter -from tests.servers.opencode_server.conftest import run_message_phases +from wolfharness_server.opencode_server.models.message import MessageWithParts +from wolfharness_server.opencode_server.models.parts import StepFinishPart +from wolfharness_server.opencode_server.session_pool_integration import get_messages_for_session +from wolfharness_server.opencode_server.state import ServerState +from wolfharness_server.opencode_server.stream_adapter import OpenCodeStreamAdapter pytestmark = pytest.mark.integration @@ -45,7 +45,7 @@ def _setup_session(state: ServerState, session_id: str) -> None: """Set up session state manually.""" now = now_ms() - from agentpool_server.opencode_server.models import Session + from wolfharness_server.opencode_server.models import Session session = Session( id=session_id, diff --git a/tests/servers/opencode_server/test_subagent_integration.py b/tests/servers/opencode_server/test_subagent_integration.py index 28749261c..feb1ab7ca 100644 --- a/tests/servers/opencode_server/test_subagent_integration.py +++ b/tests/servers/opencode_server/test_subagent_integration.py @@ -16,32 +16,32 @@ from fastapi import FastAPI import pytest -from agentpool.agents.events import StreamCompleteEvent, SubAgentEvent -from agentpool.messaging import ChatMessage -from agentpool_server.opencode_server.dependencies import get_state -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.agents.events import StreamCompleteEvent, SubAgentEvent +from wolfharness.messaging import ChatMessage +from wolfharness_server.opencode_server.dependencies import get_state +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, ) -from agentpool_server.opencode_server.routes import file_router, message_router, session_router -from agentpool_server.opencode_server.session_pool_integration import ( +from wolfharness_server.opencode_server.routes import file_router, message_router, session_router +from wolfharness_server.opencode_server.session_pool_integration import ( ensure_session, get_messages_for_session, ) -from agentpool_server.opencode_server.stream_adapter import OpenCodeStreamAdapter -from agentpool_toolsets.builtin.subagent_tools import SubagentTools +from wolfharness_server.opencode_server.stream_adapter import OpenCodeStreamAdapter +from wolfharness_toolsets.builtin.subagent_tools import SubagentTools pytestmark = pytest.mark.integration if TYPE_CHECKING: - from agentpool_server.opencode_server.event_processor import EventProcessor - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.event_processor import EventProcessor + from wolfharness_server.opencode_server.state import ServerState # ============================================================================= @@ -62,7 +62,7 @@ def _make_parent_ctx( agent_name="lead-agent", model_id="test-model", parent_id="parent-user-1", - provider_id="agentpool", + provider_id="wolfharness", path=MessagePath(cwd="/tmp", root="/tmp"), ) return EventProcessorContext( @@ -111,7 +111,7 @@ async def test_background_task_inject_prompt_wakes_lead_agent( """ import inspect - from agentpool.agents.base_agent import BaseAgent + from wolfharness.agents.base_agent import BaseAgent source = inspect.getsource(BaseAgent.inject_prompt) @@ -292,7 +292,7 @@ async def test_subagent_event_without_child_session_id(server_state: ServerState # Setup session_id = "parent-session" - from agentpool_server.opencode_server.models import MessagePath, MessageTime + from wolfharness_server.opencode_server.models import MessagePath, MessageTime assistant_msg = MessageWithParts.assistant( message_id="msg-1", @@ -326,7 +326,7 @@ async def event_stream(): # Run process_stream with ensure_session patched with patch( - "agentpool_server.opencode_server.session_pool_integration.ensure_session" + "wolfharness_server.opencode_server.session_pool_integration.ensure_session" ) as mock_ensure: async for _ in adapter.process_stream(event_stream()): pass @@ -404,7 +404,7 @@ async def test_backward_compatibility_non_subagent( # Mock normal stream without subagent events async def stream_generator(*args, **kwargs): - from agentpool.agents.events import PartDeltaEvent + from wolfharness.agents.events import PartDeltaEvent yield PartDeltaEvent.text(index=0, content="Normal response") yield StreamCompleteEvent( diff --git a/tests/servers/opencode_server/test_summarize_session.py b/tests/servers/opencode_server/test_summarize_session.py index c2bed4ece..24e75a6da 100644 --- a/tests/servers/opencode_server/test_summarize_session.py +++ b/tests/servers/opencode_server/test_summarize_session.py @@ -11,7 +11,7 @@ if TYPE_CHECKING: from httpx import AsyncClient - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState pytestmark = [pytest.mark.asyncio, pytest.mark.integration] @@ -26,9 +26,9 @@ async def test_summarize_uses_session_pool( """Summarize always uses SessionPool.run_stream (no feature flag branching).""" from pydantic_ai import RequestUsage, TextPart, TextPartDelta - from agentpool.agents.events import PartDeltaEvent, PartStartEvent, StreamCompleteEvent - from agentpool.messaging.messages import ChatMessage - from agentpool_server.opencode_server.models import ( + from wolfharness.agents.events import PartDeltaEvent, PartStartEvent, StreamCompleteEvent + from wolfharness.messaging.messages import ChatMessage + from wolfharness_server.opencode_server.models import ( AssistantMessage, MessagePath, MessageTime, @@ -47,7 +47,7 @@ async def test_summarize_uses_session_pool( session_id=session_id, parent_id="", model_id="default", - provider_id="agentpool", + provider_id="wolfharness", mode="ask", agent="test-agent", path=MessagePath(cwd=server_state.working_dir, root=server_state.working_dir), @@ -81,11 +81,11 @@ async def mock_run_stream(*args: object, **kwargs: object): # Mock compact_conversation and get_messages_for_session with ( patch( - "agentpool.messaging.compaction.compact_conversation", + "wolfharness.messaging.compaction.compact_conversation", new=AsyncMock(), ), patch( - "agentpool_server.opencode_server.routes.session_routes.get_messages_for_session", + "wolfharness_server.opencode_server.routes.session_routes.get_messages_for_session", return_value=existing_messages, ), ): @@ -107,9 +107,9 @@ async def test_summarize_routes_through_session_pool( """SessionPool is the default execution path for summarization.""" from pydantic_ai import RequestUsage, TextPart, TextPartDelta - from agentpool.agents.events import PartDeltaEvent, PartStartEvent, StreamCompleteEvent - from agentpool.messaging.messages import ChatMessage - from agentpool_server.opencode_server.models import ( + from wolfharness.agents.events import PartDeltaEvent, PartStartEvent, StreamCompleteEvent + from wolfharness.messaging.messages import ChatMessage + from wolfharness_server.opencode_server.models import ( AssistantMessage, MessagePath, MessageTime, @@ -128,7 +128,7 @@ async def test_summarize_routes_through_session_pool( session_id=session_id, parent_id="", model_id="default", - provider_id="agentpool", + provider_id="wolfharness", mode="ask", agent="test-agent", path=MessagePath(cwd=server_state.working_dir, root=server_state.working_dir), @@ -159,11 +159,11 @@ async def test_summarize_routes_through_session_pool( # Mock compact_conversation and get_messages_for_session with ( patch( - "agentpool.messaging.compaction.compact_conversation", + "wolfharness.messaging.compaction.compact_conversation", new=AsyncMock(), ), patch( - "agentpool_server.opencode_server.routes.session_routes.get_messages_for_session", + "wolfharness_server.opencode_server.routes.session_routes.get_messages_for_session", return_value=existing_messages, ), ): diff --git a/tests/servers/opencode_server/test_title_management.py b/tests/servers/opencode_server/test_title_management.py index 04d850c13..200707221 100644 --- a/tests/servers/opencode_server/test_title_management.py +++ b/tests/servers/opencode_server/test_title_management.py @@ -23,22 +23,26 @@ import pytest -from agentpool.storage.manager import SessionMetadata, SessionMetadataGeneratedEvent, StorageManager -from agentpool.utils.time_utils import now_ms -from agentpool_server.opencode_server.models import ( +from tests.servers.opencode_server.conftest import run_message_phases +from wolfharness.storage.manager import ( + SessionMetadata, + SessionMetadataGeneratedEvent, + StorageManager, +) +from wolfharness.utils.time_utils import now_ms +from wolfharness_server.opencode_server.models import ( MessageWithParts, Session, TextPartInput, TimeCreatedUpdated, UserMessage, ) -from agentpool_server.opencode_server.models.message import MessageRequest, TimeCreated -from agentpool_server.opencode_server.routes.message_routes import ( +from wolfharness_server.opencode_server.models.message import MessageRequest, TimeCreated +from wolfharness_server.opencode_server.routes.message_routes import ( _maybe_generate_title, ) -from agentpool_server.opencode_server.session_pool_integration import get_messages_for_session -from agentpool_server.opencode_server.state import ServerState -from tests.servers.opencode_server.conftest import run_message_phases +from wolfharness_server.opencode_server.session_pool_integration import get_messages_for_session +from wolfharness_server.opencode_server.state import ServerState pytestmark = pytest.mark.integration @@ -51,7 +55,7 @@ def _make_state(tmp_path: Any) -> ServerState: """Build a minimal ServerState with mocked heavy components.""" - from agentpool_config.storage import MemoryStorageConfig, StorageConfig + from wolfharness_config.storage import MemoryStorageConfig, StorageConfig agent = Mock() agent.name = "test-agent" @@ -192,15 +196,15 @@ async def slow_maybe_generate_title( with ( patch( - "agentpool_server.opencode_server.routes.message_routes._maybe_generate_title", + "wolfharness_server.opencode_server.routes.message_routes._maybe_generate_title", slow_maybe_generate_title, ), patch( - "agentpool_server.opencode_server.routes.message_routes.extract_user_prompt_from_parts", + "wolfharness_server.opencode_server.routes.message_routes.extract_user_prompt_from_parts", new=AsyncMock(return_value=["hello"]), ), patch( - "agentpool_server.opencode_server.routes.message_routes.OpenCodeStreamAdapter" + "wolfharness_server.opencode_server.routes.message_routes.OpenCodeStreamAdapter" ) as mock_adapter_class, ): mock_adapter_instance = mock_adapter_class.return_value @@ -257,11 +261,11 @@ async def slow_core( with ( patch.dict(os.environ, {}, clear=False), patch( - "agentpool_server.opencode_server.routes.message_routes.extract_user_prompt_from_parts", + "wolfharness_server.opencode_server.routes.message_routes.extract_user_prompt_from_parts", new=AsyncMock(return_value=["hello"]), ), patch( - "agentpool_server.opencode_server.routes.message_routes.OpenCodeStreamAdapter" + "wolfharness_server.opencode_server.routes.message_routes.OpenCodeStreamAdapter" ) as mock_adapter_class, ): os.environ.pop("PYTEST_CURRENT_TEST", None) diff --git a/tests/servers/opencode_server/test_todo_utils.py b/tests/servers/opencode_server/test_todo_utils.py index 2b5ea140e..a8c968c0c 100644 --- a/tests/servers/opencode_server/test_todo_utils.py +++ b/tests/servers/opencode_server/test_todo_utils.py @@ -4,9 +4,9 @@ import pytest -from agentpool.utils.todos import TodoTracker -from agentpool_server.opencode_server.models.session import Todo -from agentpool_server.opencode_server.todo_utils import build_opencode_todos +from wolfharness.utils.todos import TodoTracker +from wolfharness_server.opencode_server.models.session import Todo +from wolfharness_server.opencode_server.todo_utils import build_opencode_todos pytestmark = pytest.mark.integration diff --git a/tests/servers/opencode_server/test_tui_routing.py b/tests/servers/opencode_server/test_tui_routing.py index 794173729..5d02acf85 100644 --- a/tests/servers/opencode_server/test_tui_routing.py +++ b/tests/servers/opencode_server/test_tui_routing.py @@ -14,8 +14,8 @@ import pytest -from agentpool_server.opencode_server.models import GlobalEvent -from agentpool_server.opencode_server.routes.routing import ( +from wolfharness_server.opencode_server.models import GlobalEvent +from wolfharness_server.opencode_server.routes.routing import ( RoutingCheckResponse, tui_event_filter, ) diff --git a/tests/servers/opencode_server/test_turn_lifecycle_state_machine.py b/tests/servers/opencode_server/test_turn_lifecycle_state_machine.py index a717bca81..b83c53e7c 100644 --- a/tests/servers/opencode_server/test_turn_lifecycle_state_machine.py +++ b/tests/servers/opencode_server/test_turn_lifecycle_state_machine.py @@ -120,22 +120,22 @@ import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( RunFailedEvent, RunStartedEvent, StreamCompleteEvent, ) -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.core import EventEnvelope -from agentpool_server.opencode_server.event_processor_context import ( +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.core import EventEnvelope +from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) -from agentpool_server.opencode_server.models import ( +from wolfharness_server.opencode_server.models import ( MessagePath, MessageTime, MessageWithParts, ) -from agentpool_server.opencode_server.opencode_event_bridge import ( +from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) @@ -258,11 +258,11 @@ def _patch_mocks(): def _ctx(): with ( __import__("unittest.mock").mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.set_session_status", + "wolfharness_server.opencode_server.opencode_event_bridge.set_session_status", new_callable=AsyncMock, ), __import__("unittest.mock").mock.patch( - "agentpool_server.opencode_server.opencode_event_bridge.append_message_to_session", + "wolfharness_server.opencode_server.opencode_event_bridge.append_message_to_session", new_callable=AsyncMock, ) as mock_append, ): @@ -520,7 +520,7 @@ async def test_d1_warns_on_incomplete_turn() -> None: Then: D1 fires, _finalize_assistant_time logs warning because time.completed is None. """ - import agentpool_server.opencode_server.opencode_event_bridge as bridge_module + import wolfharness_server.opencode_server.opencode_event_bridge as bridge_module session_id = "sess-d1-warn" bridge, _ctx, _broadcast = _setup_bridge( diff --git a/tests/servers/opencode_server/test_turn_split_integration.py b/tests/servers/opencode_server/test_turn_split_integration.py index b8ff2109c..7c56babea 100644 --- a/tests/servers/opencode_server/test_turn_split_integration.py +++ b/tests/servers/opencode_server/test_turn_split_integration.py @@ -20,7 +20,7 @@ from pydantic_ai import TextPart, TextPartDelta import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( PartDeltaEvent, PartStartEvent, RunStartedEvent, @@ -30,26 +30,26 @@ ToolCallStartEvent, UserMessageInsertedEvent, ) -from agentpool.messaging import ChatMessage -from agentpool.orchestrator.event_bus import EventEnvelope -from agentpool.utils import identifiers as identifier -from agentpool_server.opencode_server.models import ( +from wolfharness.messaging import ChatMessage +from wolfharness.orchestrator.event_bus import EventEnvelope +from wolfharness.utils import identifiers as identifier +from wolfharness_server.opencode_server.models import ( AssistantMessage, MessageWithParts, TimeCreated, UserMessage, ) -from agentpool_server.opencode_server.opencode_event_bridge import ( +from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) if TYPE_CHECKING: - from agentpool_server.opencode_server.event_adapter import OpenCodeEventAdapter - from agentpool_server.opencode_server.event_processor_context import ( + from wolfharness_server.opencode_server.event_adapter import OpenCodeEventAdapter + from wolfharness_server.opencode_server.event_processor_context import ( EventProcessorContext, ) - from agentpool_server.opencode_server.state import ServerState + from wolfharness_server.opencode_server.state import ServerState def _part_start(index: int, session_id: str, content: str = "") -> PartStartEvent: @@ -462,7 +462,7 @@ async def test_split_preserves_tool_parts_in_a1( # The EventProcessor creates ToolPart entries in ctx.tool_parts and # appends them to assistant_msg.parts. After split, ctx.tool_parts is # cleared, but A1's parts list already has them. - from agentpool_server.opencode_server.models import ToolPart + from wolfharness_server.opencode_server.models import ToolPart a1_tool_parts = [p for p in a1.parts if isinstance(p, ToolPart)] assert len(a1_tool_parts) >= 1, "A1 should contain tool parts from the tool call before split" diff --git a/tests/servers/opencode_server/test_workspace_compat_routes.py b/tests/servers/opencode_server/test_workspace_compat_routes.py index 8cb7fbae5..62e108383 100644 --- a/tests/servers/opencode_server/test_workspace_compat_routes.py +++ b/tests/servers/opencode_server/test_workspace_compat_routes.py @@ -20,3 +20,31 @@ def test_list_workspaces_returns_local_response(client: TestClient) -> None: assert response.status_code == 200 assert response.json() == [] + + +def test_get_experimental_capabilities(client: TestClient) -> None: + """GET /experimental/capabilities reports no background-subagent support. + + OpenCode requires the response body to include the ``backgroundSubagents`` + field with a boolean value. + """ + response = client.get("/experimental/capabilities") + + assert response.status_code == 200 + assert response.json() == {"backgroundSubagents": False} + + +def test_get_workspace_status_returns_empty_array(client: TestClient) -> None: + """GET /experimental/workspace/status returns an empty status array. + + We do not maintain per-workspace event-stream connections, so the result + is always an empty list matching OpenCode SDK's + ``Array`` contract. + """ + response = client.get( + "/experimental/workspace/status", + params={"directory": "src", "workspace": "worktree-foo"}, + ) + + assert response.status_code == 200 + assert response.json() == [] diff --git a/tests/servers/test_a2a_server.py b/tests/servers/test_a2a_server.py index 5bf700c7f..bde416016 100644 --- a/tests/servers/test_a2a_server.py +++ b/tests/servers/test_a2a_server.py @@ -6,10 +6,10 @@ import pytest -from agentpool import AgentPool -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest -from agentpool_server.a2a_server import A2AServer +from wolfharness import AgentPool +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest +from wolfharness_server.a2a_server import A2AServer pytestmark = pytest.mark.integration @@ -119,7 +119,7 @@ async def test_a2a_server_from_config(tmp_path): environments: test: type: inline - module_path: agentpool + module_path: wolfharness class_name: Agent agents: diff --git a/tests/servers/test_aggregating_server.py b/tests/servers/test_aggregating_server.py index 57d19237c..3c3a804c5 100644 --- a/tests/servers/test_aggregating_server.py +++ b/tests/servers/test_aggregating_server.py @@ -4,10 +4,10 @@ import pytest -from agentpool import AgentPool -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest -from agentpool_server import A2AServer, AggregatingServer, AGUIServer +from wolfharness import AgentPool +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest +from wolfharness_server import A2AServer, AggregatingServer, AGUIServer pytestmark = pytest.mark.integration diff --git a/tests/servers/test_agui_server.py b/tests/servers/test_agui_server.py index cb95128ce..b6709adf3 100644 --- a/tests/servers/test_agui_server.py +++ b/tests/servers/test_agui_server.py @@ -4,10 +4,10 @@ import pytest -from agentpool import AgentPool -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest -from agentpool_server.agui_server import AGUIServer +from wolfharness import AgentPool +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest +from wolfharness_server.agui_server import AGUIServer pytestmark = pytest.mark.integration @@ -102,7 +102,7 @@ async def test_agui_server_from_config(tmp_path): environments: test: type: inline - module_path: agentpool + module_path: wolfharness class_name: Agent agents: diff --git a/tests/servers/test_openai_api_server.py b/tests/servers/test_openai_api_server.py index def7e09b5..0cf7b01f2 100644 --- a/tests/servers/test_openai_api_server.py +++ b/tests/servers/test_openai_api_server.py @@ -8,10 +8,10 @@ from pydantic_ai.usage import RunUsage import pytest -from agentpool import AgentPool -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest -from agentpool_server.openai_api_server.server import ( +from wolfharness import AgentPool +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest +from wolfharness_server.openai_api_server.server import ( OpenAIAPIServer, _serialize_completion_usage, ) diff --git a/tests/servers/test_openai_api_thinking.py b/tests/servers/test_openai_api_thinking.py index e75873240..e9c08615f 100644 --- a/tests/servers/test_openai_api_thinking.py +++ b/tests/servers/test_openai_api_thinking.py @@ -19,11 +19,11 @@ ) import pytest -from agentpool.messaging.messages import ChatMessage -from agentpool_server.openai_api_server.completions.helpers import stream_response -from agentpool_server.openai_api_server.completions.models import ChatCompletionRequest -from agentpool_server.openai_api_server.responses.helpers import handle_request -from agentpool_server.openai_api_server.responses.models import ( +from wolfharness.messaging.messages import ChatMessage +from wolfharness_server.openai_api_server.completions.helpers import stream_response +from wolfharness_server.openai_api_server.completions.models import ChatCompletionRequest +from wolfharness_server.openai_api_server.responses.helpers import handle_request +from wolfharness_server.openai_api_server.responses.models import ( ResponseMessage, ResponseOutputReasoning, ResponseRequest, @@ -72,7 +72,7 @@ def _make_assistant_with_thinking( def test_non_streaming_completion_includes_reasoning_content(): """Test that reasoning_content is populated from ThinkingPart.""" - from agentpool_server.openai_api_server.completions.models import OpenAIMessage + from wolfharness_server.openai_api_server.completions.models import OpenAIMessage msg = _make_assistant_with_thinking( thinking_content="Deep reasoning here.", @@ -104,7 +104,7 @@ def test_non_streaming_completion_includes_reasoning_content(): def test_non_streaming_completion_no_thinking_no_reasoning_content(): """Test that reasoning_content is None without ThinkingPart.""" - from agentpool_server.openai_api_server.completions.models import OpenAIMessage + from wolfharness_server.openai_api_server.completions.models import OpenAIMessage timestamp = datetime(2025, 1, 1, 12, 0, 0, tzinfo=UTC) model_response = ModelResponse( diff --git a/tests/servers/test_step_usage_agui_openai.py b/tests/servers/test_step_usage_agui_openai.py index fd3dcd59b..7464d2508 100644 --- a/tests/servers/test_step_usage_agui_openai.py +++ b/tests/servers/test_step_usage_agui_openai.py @@ -12,13 +12,13 @@ from pydantic_ai import RequestUsage, RunUsage import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( PartDeltaEvent, PartStartEvent, StepUsageEvent, StreamCompleteEvent, ) -from agentpool.messaging import ChatMessage +from wolfharness.messaging import ChatMessage if TYPE_CHECKING: @@ -59,7 +59,7 @@ async def test_agui_handles_step_usage_event() -> None: """Feed StepUsageEvent to AG-UI adapter, assert no exception and CustomEvent emitted.""" from ag_ui.core import CustomEvent, RunAgentInput - from agentpool_server.agui_server.base_agent_adapter import BaseAgentAGUIAdapter + from wolfharness_server.agui_server.base_agent_adapter import BaseAgentAGUIAdapter step_usage = RunUsage(input_tokens=100, output_tokens=50) cumulative = RunUsage(input_tokens=200, output_tokens=100) @@ -120,7 +120,7 @@ async def _collect_stream_chunks( """Collect all SSE chunks from stream_response as parsed dicts.""" import anyenv - from agentpool_server.openai_api_server.completions.helpers import stream_response + from wolfharness_server.openai_api_server.completions.helpers import stream_response chunks: list[dict[str, Any]] = [] async for sse_data in stream_response(events, request): @@ -137,7 +137,7 @@ async def _collect_stream_chunks( @pytest.mark.asyncio async def test_openai_api_handles_step_usage_event() -> None: """Feed StepUsageEvent to OpenAI API helper, assert usage in output.""" - from agentpool_server.openai_api_server.completions.models import ChatCompletionRequest + from wolfharness_server.openai_api_server.completions.models import ChatCompletionRequest step_usage = RunUsage(input_tokens=120, output_tokens=80) cumulative = RunUsage(input_tokens=240, output_tokens=160) @@ -182,7 +182,7 @@ async def test_openai_api_mixed_content_and_usage_chunks() -> None: - The usage chunk has ``choices: []`` (usage-only, no content). - The usage chunk appears before`` sentinel. """ - from agentpool_server.openai_api_server.completions.models import ChatCompletionRequest + from wolfharness_server.openai_api_server.completions.models import ChatCompletionRequest step_usage = RunUsage(input_tokens=10, output_tokens=5) cumulative = RunUsage(input_tokens=10, output_tokens=5) diff --git a/tests/servers/test_subagent_event_mixin.py b/tests/servers/test_subagent_event_mixin.py index f9ca93b88..f62c5fa3c 100644 --- a/tests/servers/test_subagent_event_mixin.py +++ b/tests/servers/test_subagent_event_mixin.py @@ -13,13 +13,13 @@ from pydantic_ai import TextPartDelta import pytest -from agentpool.agents.events.events import ( +from wolfharness.agents.events.events import ( PartDeltaEvent, RunErrorEvent, SpawnSessionStart, ) -from agentpool.orchestrator.core import EventBus, EventEnvelope -from agentpool_server.mixins import ( +from wolfharness.orchestrator.core import EventBus, EventEnvelope +from wolfharness_server.mixins import ( ConsumerShutdown, ProtocolEventConsumerMixin, ) diff --git a/tests/sessions/conftest.py b/tests/sessions/conftest.py index 261b6257f..bd76fea86 100644 --- a/tests/sessions/conftest.py +++ b/tests/sessions/conftest.py @@ -6,9 +6,9 @@ import pytest -from agentpool.sessions.models import SessionData -from agentpool_config.storage import SQLStorageConfig -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness.sessions.models import SessionData +from wolfharness_config.storage import SQLStorageConfig +from wolfharness_storage.sql_provider import SQLModelProvider if TYPE_CHECKING: @@ -18,7 +18,7 @@ @pytest.fixture def _clear_engine_cache(): """Clear engine cache to avoid cross-test contamination.""" - from agentpool_config.storage import _engine_cache + from wolfharness_config.storage import _engine_cache _engine_cache.clear() yield diff --git a/tests/sessions/test_checkpoint_round_trip.py b/tests/sessions/test_checkpoint_round_trip.py index c99df0b9c..013abd204 100644 --- a/tests/sessions/test_checkpoint_round_trip.py +++ b/tests/sessions/test_checkpoint_round_trip.py @@ -12,11 +12,11 @@ import pytest -from agentpool.sessions.models import SessionData +from wolfharness.sessions.models import SessionData if TYPE_CHECKING: - from agentpool_storage.sql_provider import SQLModelProvider + from wolfharness_storage.sql_provider import SQLModelProvider pytestmark = pytest.mark.unit diff --git a/tests/sessions/test_creation_unification.py b/tests/sessions/test_creation_unification.py index 473214838..a17f28afb 100644 --- a/tests/sessions/test_creation_unification.py +++ b/tests/sessions/test_creation_unification.py @@ -15,13 +15,13 @@ import pytest -from agentpool.utils.identifiers import generate_session_id -from agentpool_storage.memory_provider.provider import MemoryStorageProvider +from wolfharness.utils.identifiers import generate_session_id +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool.sessions.models import SessionData + from wolfharness import AgentPool + from wolfharness.sessions.models import SessionData pytestmark = pytest.mark.unit @@ -46,7 +46,7 @@ async def test_session_pool_create_session_registers_in_pool(minimal_pool: Agent """SessionPool.create_session() registers the session in the controller.""" store = MemoryStorageProvider() async with store: - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController controller = SessionController(minimal_pool, store=store) state, _was_created = await controller.get_or_create_session( @@ -65,7 +65,7 @@ async def test_acp_creation_path_registers_in_pool(minimal_pool: AgentPool) -> N """ACP creation path delegates to SessionPool.create_session().""" store = MemoryStorageProvider() async with store: - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController controller = SessionController(minimal_pool, store=store) # Simulate what ACPSessionManager.create_session() does for top-level @@ -90,7 +90,7 @@ async def test_a2a_creation_path_registers_in_pool(minimal_pool: AgentPool) -> N """A2A creation path uses SessionPool.create_session() + get_or_create_session_agent.""" store = MemoryStorageProvider() async with store: - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController controller = SessionController(minimal_pool, store=store) # Simulate what A2AServer agent_handler does @@ -105,7 +105,7 @@ async def test_agui_creation_path_registers_in_pool(minimal_pool: AgentPool) -> """AG-UI creation path uses two-step pattern: create_session + get_or_create_session_agent.""" store = MemoryStorageProvider() async with store: - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController controller = SessionController(minimal_pool, store=store) # Simulate what AGUIServer agent_handler does @@ -120,7 +120,7 @@ async def test_openai_api_creation_path_registers_in_pool(minimal_pool: AgentPoo """OpenAI API creation path uses generate_session_id().""" store = MemoryStorageProvider() async with store: - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController controller = SessionController(minimal_pool, store=store) session_id = generate_session_id() @@ -139,7 +139,7 @@ async def test_child_session_inherits_parent_project_id_and_cwd(minimal_pool: Ag """Child session created via SessionPool inherits parent's project_id and cwd.""" store = MemoryStorageProvider() async with store: - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController controller = SessionController(minimal_pool, store=store) @@ -176,7 +176,7 @@ async def test_create_child_session_api_inherits_parent(minimal_pool: AgentPool) """SessionPool.create_child_session() inherits parent's project_id and cwd.""" store = MemoryStorageProvider() async with store: - from agentpool.orchestrator.session_pool import SessionPool + from wolfharness.orchestrator.session_pool import SessionPool sp = SessionPool(minimal_pool, store=store, enable_event_bus=False) @@ -265,7 +265,7 @@ async def test_acp_create_delegates_to_session_pool(minimal_pool: AgentPool) -> """ACP create delegates to SessionPool (no direct store.save_session).""" store = MemoryStorageProvider() async with store: - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController controller = SessionController(minimal_pool, store=store) @@ -302,7 +302,7 @@ async def test_acp_close_delegates_through_chain(minimal_pool: AgentPool) -> Non """ACP close delegates through SessionController → RunHandle cleanup.""" store = MemoryStorageProvider() async with store: - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController controller = SessionController(minimal_pool, store=store) session_id = generate_session_id() @@ -326,7 +326,7 @@ async def test_agui_child_consumer_lifecycle(minimal_pool: AgentPool) -> None: """AG-UI child consumer lifecycle works after create_child_session extraction.""" store = MemoryStorageProvider() async with store: - from agentpool.orchestrator.session_pool import SessionPool + from wolfharness.orchestrator.session_pool import SessionPool sp = SessionPool(minimal_pool, store=store, enable_event_bus=True) @@ -352,7 +352,7 @@ async def test_openai_api_child_consumer_lifecycle(minimal_pool: AgentPool) -> N """OpenAI API session lifecycle works with generate_session_id().""" store = MemoryStorageProvider() async with store: - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController controller = SessionController(minimal_pool, store=store) @@ -381,7 +381,7 @@ async def test_concurrent_session_creation_multiple_protocols(minimal_pool: Agen """Concurrent session creation from ACP + OpenCode + AG-UI clients simultaneously.""" store = MemoryStorageProvider() async with store: - from agentpool.orchestrator.session_controller import SessionController + from wolfharness.orchestrator.session_controller import SessionController controller = SessionController(minimal_pool, store=store) diff --git a/tests/sessions/test_e2e_lifecycle.py b/tests/sessions/test_e2e_lifecycle.py index 323b7ec03..cda3e556a 100644 --- a/tests/sessions/test_e2e_lifecycle.py +++ b/tests/sessions/test_e2e_lifecycle.py @@ -16,17 +16,17 @@ import pytest -from agentpool.orchestrator.core import SessionController -from agentpool.sessions.models import PendingDeferredCall, SessionData -from agentpool.storage.manager import StorageManager -from agentpool_config.storage import SQLStorageConfig, StorageConfig -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness.orchestrator.core import SessionController +from wolfharness.sessions.models import PendingDeferredCall, SessionData +from wolfharness.storage.manager import StorageManager +from wolfharness_config.storage import SQLStorageConfig, StorageConfig +from wolfharness_storage.sql_provider import SQLModelProvider if TYPE_CHECKING: from pathlib import Path - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.integration, pytest.mark.asyncio] @@ -92,7 +92,7 @@ async def test_e2e_session_lifecycle_with_sql_model_provider( assert loaded.pending_deferred_calls[0].tool_call_id == "tc-e2e-001" # --- Step 2: Save checkpoint via StorageManager --- - from agentpool.agents.native_agent.checkpoint import CheckpointManager + from wolfharness.agents.native_agent.checkpoint import CheckpointManager checkpoint_mgr = CheckpointManager(storage_manager) await checkpoint_mgr.checkpoint( diff --git a/tests/sessions/test_elicitation_cancel.py b/tests/sessions/test_elicitation_cancel.py index b895e949c..0ed8794fd 100644 --- a/tests/sessions/test_elicitation_cancel.py +++ b/tests/sessions/test_elicitation_cancel.py @@ -16,8 +16,8 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.agents.events import StreamCompleteEvent +from wolfharness import Agent +from wolfharness.agents.events import StreamCompleteEvent pytestmark = pytest.mark.unit diff --git a/tests/sessions/test_history.py b/tests/sessions/test_history.py index eee4510c6..4aaa4b26f 100644 --- a/tests/sessions/test_history.py +++ b/tests/sessions/test_history.py @@ -6,12 +6,12 @@ from pydantic_ai.usage import RunUsage import pytest -from agentpool.messaging import ChatMessage, TokenCost -from agentpool.utils.parse_time import parse_time_period -from agentpool.utils.time_utils import get_now -from agentpool_config.storage import SQLStorageConfig -from agentpool_storage.models import QueryFilters, StatsFilters -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness.messaging import ChatMessage, TokenCost +from wolfharness.utils.parse_time import parse_time_period +from wolfharness.utils.time_utils import get_now +from wolfharness_config.storage import SQLStorageConfig +from wolfharness_storage.models import QueryFilters, StatsFilters +from wolfharness_storage.sql_provider import SQLModelProvider pytestmark = pytest.mark.unit diff --git a/tests/sessions/test_history_processors.py b/tests/sessions/test_history_processors.py index 38dd6a843..3b44fa56d 100644 --- a/tests/sessions/test_history_processors.py +++ b/tests/sessions/test_history_processors.py @@ -5,10 +5,10 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent -from agentpool.models.agents import NativeAgentConfig -from agentpool.utils.inspection import get_fn_name -from agentpool_config.session import MemoryConfig +from wolfharness import Agent +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.utils.inspection import get_fn_name +from wolfharness_config.session import MemoryConfig pytestmark = pytest.mark.unit @@ -18,7 +18,7 @@ def _validate_processor_signature(processor): """Validate processor signature using Agent's validation method.""" # Create a minimal agent instance to access the method - from agentpool.agents.native_agent.agent import Agent as NativeAgent + from wolfharness.agents.native_agent.agent import Agent as NativeAgent # Access as unbound method and call with self=None (internal use only) return NativeAgent._validate_processor_signature(None, processor) @@ -236,7 +236,7 @@ async def test_compaction_and_processors_interaction(mock_model): """ from pydantic_ai import ModelResponse, TextPart - from agentpool.messaging import ChatMessage + from wolfharness.messaging import ChatMessage history = [ ChatMessage.user_prompt("M1"), diff --git a/tests/sessions/test_list_sessions_batch.py b/tests/sessions/test_list_sessions_batch.py index 26fa1d7df..f3eb9c8f3 100644 --- a/tests/sessions/test_list_sessions_batch.py +++ b/tests/sessions/test_list_sessions_batch.py @@ -11,10 +11,10 @@ import pytest -from agentpool.sessions.models import SessionData -from agentpool_config.storage import MemoryStorageConfig, SQLStorageConfig -from agentpool_storage.memory_provider import MemoryStorageProvider -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness.sessions.models import SessionData +from wolfharness_config.storage import MemoryStorageConfig, SQLStorageConfig +from wolfharness_storage.memory_provider import MemoryStorageProvider +from wolfharness_storage.sql_provider import SQLModelProvider pytestmark = pytest.mark.unit diff --git a/tests/sessions/test_list_sessions_cross_agent.py b/tests/sessions/test_list_sessions_cross_agent.py index fe866f197..1d3e41a3b 100644 --- a/tests/sessions/test_list_sessions_cross_agent.py +++ b/tests/sessions/test_list_sessions_cross_agent.py @@ -14,9 +14,9 @@ import pytest -from agentpool.sessions.models import SessionData -from agentpool_config.storage import SQLStorageConfig -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness.sessions.models import SessionData +from wolfharness_config.storage import SQLStorageConfig +from wolfharness_storage.sql_provider import SQLModelProvider pytestmark = pytest.mark.unit diff --git a/tests/sessions/test_message_ordering.py b/tests/sessions/test_message_ordering.py index cc5b7e760..60e786ced 100644 --- a/tests/sessions/test_message_ordering.py +++ b/tests/sessions/test_message_ordering.py @@ -13,12 +13,12 @@ import pytest -from agentpool.messaging import ChatMessage -from agentpool_storage.memory_provider import MemoryStorageProvider +from wolfharness.messaging import ChatMessage +from wolfharness_storage.memory_provider import MemoryStorageProvider if TYPE_CHECKING: - from agentpool_storage.sql_provider import SQLModelProvider + from wolfharness_storage.sql_provider import SQLModelProvider # --------------------------------------------------------------------------- @@ -291,7 +291,7 @@ def test_parse_iso_timestamp_naive_string_returns_aware() -> None: When: parsed via parse_iso_timestamp Then: the result has tzinfo=UTC (not None) """ - from agentpool.utils.time_utils import parse_iso_timestamp + from wolfharness.utils.time_utils import parse_iso_timestamp result = parse_iso_timestamp("2025-01-01T12:00:00") assert result.tzinfo is not None @@ -308,7 +308,7 @@ def test_parse_iso_timestamp_aware_string_preserves_timezone() -> None: """ from datetime import timedelta - from agentpool.utils.time_utils import parse_iso_timestamp + from wolfharness.utils.time_utils import parse_iso_timestamp result = parse_iso_timestamp("2025-01-01T12:00:00+05:00") assert result.tzinfo is not None @@ -323,7 +323,7 @@ def test_parse_iso_timestamp_z_suffix_returns_utc() -> None: When: parsed via parse_iso_timestamp Then: the result has tzinfo=UTC """ - from agentpool.utils.time_utils import parse_iso_timestamp + from wolfharness.utils.time_utils import parse_iso_timestamp result = parse_iso_timestamp("2025-01-01T12:00:00Z") assert result.tzinfo is not None diff --git a/tests/sessions/test_opencode_helpers.py b/tests/sessions/test_opencode_helpers.py index 2d68d313d..cb9915e92 100644 --- a/tests/sessions/test_opencode_helpers.py +++ b/tests/sessions/test_opencode_helpers.py @@ -9,7 +9,7 @@ from pydantic_ai import BinaryContent, ImageUrl, TextContent import pytest -from agentpool_storage.opencode_provider.helpers import convert_user_content_to_parts +from wolfharness_storage.opencode_provider.helpers import convert_user_content_to_parts pytestmark = pytest.mark.unit diff --git a/tests/sessions/test_opencode_integration.py b/tests/sessions/test_opencode_integration.py index 55a336074..20dc646ab 100644 --- a/tests/sessions/test_opencode_integration.py +++ b/tests/sessions/test_opencode_integration.py @@ -13,12 +13,12 @@ import pytest -from agentpool.sessions.models import ProjectData, SessionData -from agentpool.utils.identifiers import ascending -from agentpool_config.storage import OpenCodeStorageConfig -from agentpool_storage.opencode_provider import OpenCodeStorageProvider -from agentpool_storage.opencode_provider.helpers import compute_project_id -from agentpool_storage.project_store import generate_project_id +from wolfharness.sessions.models import ProjectData, SessionData +from wolfharness.utils.identifiers import ascending +from wolfharness_config.storage import OpenCodeStorageConfig +from wolfharness_storage.opencode_provider import OpenCodeStorageProvider +from wolfharness_storage.opencode_provider.helpers import compute_project_id +from wolfharness_storage.project_store import generate_project_id pytestmark = pytest.mark.integration @@ -141,18 +141,18 @@ async def test_both_project_ids_accessible() -> None: _init_git_repo(str(project_dir)) opencode_id = compute_project_id(str(project_dir)) - agentpool_id = generate_project_id(str(project_dir)) + wolfharness_id = generate_project_id(str(project_dir)) # Both should return valid hex strings (or "global" for compute_project_id) assert len(opencode_id) >= 1 - assert len(agentpool_id) == 40 # SHA1 hex digest + assert len(wolfharness_id) == 40 # SHA1 hex digest # With a git repo, compute_project_id returns the root commit SHA assert opencode_id != "global" assert len(opencode_id) == 40 # commit SHA1 hex digest # They are different algorithms — expect different values - assert opencode_id != agentpool_id, ( + assert opencode_id != wolfharness_id, ( "compute_project_id (git root SHA) and generate_project_id (path SHA) " "use different algorithms and should produce different values" ) diff --git a/tests/sessions/test_opencode_project_methods.py b/tests/sessions/test_opencode_project_methods.py index 6243f01eb..b62bee867 100644 --- a/tests/sessions/test_opencode_project_methods.py +++ b/tests/sessions/test_opencode_project_methods.py @@ -13,9 +13,9 @@ import pytest -from agentpool.sessions.models import ProjectData -from agentpool_config.storage import OpenCodeStorageConfig -from agentpool_storage.opencode_provider import OpenCodeStorageProvider +from wolfharness.sessions.models import ProjectData +from wolfharness_config.storage import OpenCodeStorageConfig +from wolfharness_storage.opencode_provider import OpenCodeStorageProvider pytestmark = pytest.mark.unit @@ -60,7 +60,7 @@ async def test_save_and_get_project(provider: OpenCodeStorageProvider) -> None: worktree="/home/user/project-a", name="project-a", vcs="git", - config_path="/home/user/project-a/.agentpool.yml", + config_path="/home/user/project-a/.wolfharness.yml", settings={"model": "openai:gpt-4o"}, ) @@ -73,7 +73,7 @@ async def test_save_and_get_project(provider: OpenCodeStorageProvider) -> None: assert result.worktree == "/home/user/project-a" assert result.name == "project-a" assert result.vcs == "git" - assert result.config_path == "/home/user/project-a/.agentpool.yml" + assert result.config_path == "/home/user/project-a/.wolfharness.yml" assert result.settings == {"model": "openai:gpt-4o"} diff --git a/tests/sessions/test_opencode_session_methods.py b/tests/sessions/test_opencode_session_methods.py index 306302c30..a5e59bfd2 100644 --- a/tests/sessions/test_opencode_session_methods.py +++ b/tests/sessions/test_opencode_session_methods.py @@ -18,10 +18,10 @@ import anyenv import pytest -from agentpool_config.storage import OpenCodeStorageConfig -from agentpool_server.opencode_server.models import Session, TimeCreatedUpdated -from agentpool_storage.opencode_provider import OpenCodeStorageProvider -from agentpool_storage.opencode_provider.helpers import compute_project_id +from wolfharness_config.storage import OpenCodeStorageConfig +from wolfharness_server.opencode_server.models import Session, TimeCreatedUpdated +from wolfharness_storage.opencode_provider import OpenCodeStorageProvider +from wolfharness_storage.opencode_provider.helpers import compute_project_id pytestmark = pytest.mark.integration diff --git a/tests/sessions/test_opencode_thinking_roundtrip.py b/tests/sessions/test_opencode_thinking_roundtrip.py index 4b5dcecf2..b14b8d425 100644 --- a/tests/sessions/test_opencode_thinking_roundtrip.py +++ b/tests/sessions/test_opencode_thinking_roundtrip.py @@ -12,13 +12,13 @@ from pydantic_ai.messages import ModelResponse, ThinkingPart import pytest -from agentpool_server.opencode_server.models.message import ( +from wolfharness_server.opencode_server.models.message import ( AssistantMessage, MessagePath, MessageTime, ) -from agentpool_server.opencode_server.models.parts import ReasoningPart -from agentpool_storage.opencode_provider.helpers import ( +from wolfharness_server.opencode_server.models.parts import ReasoningPart +from wolfharness_storage.opencode_provider.helpers import ( _build_assistant_pydantic_messages, ) @@ -149,7 +149,7 @@ def test_thinking_and_text_parts_coexist( self, assistant_msg: AssistantMessage, timestamp: datetime ) -> None: """ThinkingPart and TextPart in the same message are both preserved.""" - from agentpool_server.opencode_server.models.parts import TextPart + from wolfharness_server.opencode_server.models.parts import TextPart reasoning = ReasoningPart( id="prt_005", diff --git a/tests/sessions/test_pending_deferred_call.py b/tests/sessions/test_pending_deferred_call.py index fee4d9fac..f36ed3362 100644 --- a/tests/sessions/test_pending_deferred_call.py +++ b/tests/sessions/test_pending_deferred_call.py @@ -7,7 +7,7 @@ from pydantic import TypeAdapter import pytest -from agentpool.sessions.models import PendingDeferredCall, SessionData +from wolfharness.sessions.models import PendingDeferredCall, SessionData pytestmark = pytest.mark.unit diff --git a/tests/sessions/test_project_provider_selection.py b/tests/sessions/test_project_provider_selection.py index 5f6c374a9..1199b3979 100644 --- a/tests/sessions/test_project_provider_selection.py +++ b/tests/sessions/test_project_provider_selection.py @@ -4,10 +4,10 @@ import pytest -from agentpool.storage.manager import StorageManager -from agentpool_config.storage import MemoryStorageConfig, StorageConfig -from agentpool_storage.memory_provider import MemoryStorageProvider -from agentpool_storage.opencode_provider import OpenCodeStorageProvider +from wolfharness.storage.manager import StorageManager +from wolfharness_config.storage import MemoryStorageConfig, StorageConfig +from wolfharness_storage.memory_provider import MemoryStorageProvider +from wolfharness_storage.opencode_provider import OpenCodeStorageProvider pytestmark = pytest.mark.unit diff --git a/tests/sessions/test_round_trip_migration.py b/tests/sessions/test_round_trip_migration.py index 60780e549..1293d334d 100644 --- a/tests/sessions/test_round_trip_migration.py +++ b/tests/sessions/test_round_trip_migration.py @@ -13,12 +13,12 @@ import pytest -from agentpool.sessions.models import PendingDeferredCall, SessionData -from agentpool_storage.protocols import CheckpointStore, SessionPersistence +from wolfharness.sessions.models import PendingDeferredCall, SessionData +from wolfharness_storage.protocols import CheckpointStore, SessionPersistence if TYPE_CHECKING: - from agentpool_storage.sql_provider import SQLModelProvider + from wolfharness_storage.sql_provider import SQLModelProvider pytestmark = pytest.mark.unit diff --git a/tests/sessions/test_session_controller.py b/tests/sessions/test_session_controller.py index 3d617f93a..8142553d2 100644 --- a/tests/sessions/test_session_controller.py +++ b/tests/sessions/test_session_controller.py @@ -6,11 +6,11 @@ import pytest -from agentpool.orchestrator import SessionController -from agentpool.sessions import SessionData -from agentpool_config.storage import MemoryStorageConfig, SQLStorageConfig -from agentpool_storage.memory_provider.provider import MemoryStorageProvider -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness.orchestrator import SessionController +from wolfharness.sessions import SessionData +from wolfharness_config.storage import MemoryStorageConfig, SQLStorageConfig +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider +from wolfharness_storage.sql_provider import SQLModelProvider pytestmark = pytest.mark.integration @@ -19,7 +19,7 @@ if TYPE_CHECKING: from pathlib import Path - from agentpool import AgentPool + from wolfharness import AgentPool class TestSessionData: @@ -419,7 +419,7 @@ async def test_child_inherits_project_id_via_metadata( # previously used datetime.fromtimestamp(time.monotonic()), # producing a 1970 datetime. Verify the full pipeline produces # a sane time.created in the OpenCode session model. - from agentpool_server.opencode_server.converters import session_data_to_opencode + from wolfharness_server.opencode_server.converters import session_data_to_opencode opencode_session = session_data_to_opencode(child) assert opencode_session.time.created > 1_000_000_000_000 diff --git a/tests/sessions/test_session_from_db_edge_cases.py b/tests/sessions/test_session_from_db_edge_cases.py index cb625384e..71dbfb448 100644 --- a/tests/sessions/test_session_from_db_edge_cases.py +++ b/tests/sessions/test_session_from_db_edge_cases.py @@ -13,12 +13,12 @@ import pytest -from agentpool.sessions.models import SessionData -from agentpool_storage.sql_provider.models import Conversation +from wolfharness.sessions.models import SessionData +from wolfharness_storage.sql_provider.models import Conversation if TYPE_CHECKING: - from agentpool_storage.sql_provider import SQLModelProvider + from wolfharness_storage.sql_provider import SQLModelProvider pytestmark = pytest.mark.unit diff --git a/tests/sessions/test_session_hierarchy.py b/tests/sessions/test_session_hierarchy.py index d712e148d..8578522d6 100644 --- a/tests/sessions/test_session_hierarchy.py +++ b/tests/sessions/test_session_hierarchy.py @@ -6,12 +6,12 @@ import pytest -from agentpool.orchestrator import SessionPool -from agentpool.sessions import SessionData -from agentpool.utils.identifiers import generate_session_id -from agentpool_config.storage import SQLStorageConfig -from agentpool_storage.memory_provider.provider import MemoryStorageProvider -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness.orchestrator import SessionPool +from wolfharness.sessions import SessionData +from wolfharness.utils.identifiers import generate_session_id +from wolfharness_config.storage import SQLStorageConfig +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider +from wolfharness_storage.sql_provider import SQLModelProvider pytestmark = pytest.mark.integration @@ -20,7 +20,7 @@ if TYPE_CHECKING: from pathlib import Path - from agentpool import AgentPool + from wolfharness import AgentPool @pytest.fixture diff --git a/tests/sessions/test_session_id_opaque.py b/tests/sessions/test_session_id_opaque.py index de5636c46..4df665848 100644 --- a/tests/sessions/test_session_id_opaque.py +++ b/tests/sessions/test_session_id_opaque.py @@ -19,12 +19,12 @@ import pytest -from agentpool.sessions import SessionData -from agentpool_storage.memory_provider.provider import MemoryStorageProvider +from wolfharness.sessions import SessionData +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit @@ -128,8 +128,8 @@ def mock_pool(self, minimal_pool: AgentPool) -> AgentPool: async def test_child_session_id_is_opaque_string(self, minimal_pool: AgentPool) -> None: """Child session IDs must be non-empty opaque strings.""" - from agentpool.orchestrator import SessionPool - from agentpool.utils.identifiers import generate_session_id + from wolfharness.orchestrator import SessionPool + from wolfharness.utils.identifiers import generate_session_id session_pool = SessionPool(pool=minimal_pool, store=None) state = await session_pool.create_session( @@ -156,8 +156,8 @@ async def test_create_child_with_opaque_parent_id( self, minimal_pool: AgentPool, parent_id: str ) -> None: """create_session must accept any string as parent_session_id.""" - from agentpool.orchestrator import SessionPool - from agentpool.utils.identifiers import generate_session_id + from wolfharness.orchestrator import SessionPool + from wolfharness.utils.identifiers import generate_session_id store = MemoryStorageProvider() parent = SessionData(session_id=parent_id, agent_name="parent_agent") @@ -187,8 +187,8 @@ async def test_get_child_sessions_with_opaque_parent_id( self, minimal_pool: AgentPool, parent_id: str ) -> None: """get_children must find children by opaque parent ID.""" - from agentpool.orchestrator import SessionPool - from agentpool.utils.identifiers import generate_session_id + from wolfharness.orchestrator import SessionPool + from wolfharness.utils.identifiers import generate_session_id store = MemoryStorageProvider() parent = SessionData(session_id=parent_id, agent_name="parent_agent") @@ -225,7 +225,7 @@ def test_no_sequential_session_id_regex(self) -> None: This test documents that the identifiers module doesn't encourage counter-based parsing. """ - from agentpool.utils.identifiers import generate_session_id + from wolfharness.utils.identifiers import generate_session_id id1 = generate_session_id() id2 = generate_session_id() @@ -237,7 +237,7 @@ def test_no_sequential_session_id_regex(self) -> None: def test_ascending_format_produces_sortable_ids(self) -> None: """ascending() IDs are lexicographically sortable — a property, not a format dependency.""" - from agentpool.utils.identifiers import ascending + from wolfharness.utils.identifiers import ascending ids = [ascending("session") for _ in range(10)] # Later IDs must sort after earlier ones @@ -246,7 +246,7 @@ def test_ascending_format_produces_sortable_ids(self) -> None: def test_ascending_with_given_accepts_any_valid_prefix(self) -> None: """ascending(prefix, given=...) validates prefix only — no format parsing.""" - from agentpool.utils.identifiers import ascending + from wolfharness.utils.identifiers import ascending # Providing an ID that starts with "ses" must be accepted result = ascending("session", given="ses_custom_suffix") @@ -254,7 +254,7 @@ def test_ascending_with_given_accepts_any_valid_prefix(self) -> None: def test_ascending_with_wrong_prefix_raises(self) -> None: """ascending(prefix, given=...) raises if prefix doesn't match.""" - from agentpool.utils.identifiers import ascending + from wolfharness.utils.identifiers import ascending with pytest.raises(ValueError, match="does not start with"): ascending("session", given="msg_something") @@ -270,10 +270,10 @@ class TestServerSessionLookupOpaque: def test_opencode_state_sessions_dict_opaque(self) -> None: """ServerState.sessions dict accepts any string key.""" - from agentpool.utils.time_utils import now_ms - from agentpool_server.opencode_server.models import Session - from agentpool_server.opencode_server.models.common import TimeCreatedUpdated - from agentpool_server.opencode_server.state import ServerState + from wolfharness.utils.time_utils import now_ms + from wolfharness_server.opencode_server.models import Session + from wolfharness_server.opencode_server.models.common import TimeCreatedUpdated + from wolfharness_server.opencode_server.state import ServerState agent = MagicMock() state = ServerState(working_dir="/tmp", agent=agent) @@ -302,7 +302,7 @@ def test_acp_session_manager_acp_sessions_dict_opaque(self) -> None: # We test the dict-based lookup pattern (get_session) conceptually. # The _acp_sessions dict maps session_id -> ACPSession using plain dict.get(). # This test documents that the lookup is opaque. - from agentpool_server.acp_server.session_manager import ACPSessionManager + from wolfharness_server.acp_server.session_manager import ACPSessionManager # ACPSessionManager._acp_sessions is a plain dict[str, ACPSession] # get_session does: return self._acp_sessions.get(session_id) diff --git a/tests/sessions/test_session_persistence.py b/tests/sessions/test_session_persistence.py index 3838e0f89..84766c448 100644 --- a/tests/sessions/test_session_persistence.py +++ b/tests/sessions/test_session_persistence.py @@ -15,14 +15,14 @@ import pytest -from agentpool.orchestrator.core import SessionController -from agentpool.sessions.models import SessionData -from agentpool_config.storage import SQLStorageConfig -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness.orchestrator.core import SessionController +from wolfharness.sessions.models import SessionData +from wolfharness_config.storage import SQLStorageConfig +from wolfharness_storage.sql_provider import SQLModelProvider if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit @@ -44,7 +44,7 @@ def make_session_data( @pytest.fixture def _clear_engine_cache(): """Clear engine cache to avoid cross-test contamination.""" - from agentpool_config.storage import _engine_cache + from wolfharness_config.storage import _engine_cache _engine_cache.clear() yield diff --git a/tests/sessions/test_sql_provider_no_dispose.py b/tests/sessions/test_sql_provider_no_dispose.py index 6d0578cf1..a54ed1962 100644 --- a/tests/sessions/test_sql_provider_no_dispose.py +++ b/tests/sessions/test_sql_provider_no_dispose.py @@ -11,9 +11,9 @@ import pytest -from agentpool.sessions import SessionData -from agentpool_config.storage import SQLStorageConfig -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness.sessions import SessionData +from wolfharness_config.storage import SQLStorageConfig +from wolfharness_storage.sql_provider import SQLModelProvider pytestmark = pytest.mark.unit diff --git a/tests/sessions/test_state_mapper.py b/tests/sessions/test_state_mapper.py index 01a5203d5..0d2497ae8 100644 --- a/tests/sessions/test_state_mapper.py +++ b/tests/sessions/test_state_mapper.py @@ -13,8 +13,8 @@ import pytest -from agentpool.lifecycle.types import RunState -from agentpool.sessions.state_mapper import ( +from wolfharness.lifecycle.types import RunState +from wolfharness.sessions.state_mapper import ( SESSION_STATUS_ACTIVE, SESSION_STATUS_CHECKPOINTED, SESSION_STATUS_CLOSED, diff --git a/tests/sessions/test_state_mapper_integration.py b/tests/sessions/test_state_mapper_integration.py index abf8aaed4..868e47e48 100644 --- a/tests/sessions/test_state_mapper_integration.py +++ b/tests/sessions/test_state_mapper_integration.py @@ -18,9 +18,9 @@ import pytest -from agentpool.lifecycle.journal import DurableJournal -from agentpool.lifecycle.snapshot_store import DurableSnapshotStore -from agentpool.sessions.state_mapper import ( +from wolfharness.lifecycle.journal import DurableJournal +from wolfharness.lifecycle.snapshot_store import DurableSnapshotStore +from wolfharness.sessions.state_mapper import ( SESSION_STATUS_ACTIVE, SESSION_STATUS_CHECKPOINTED, SESSION_STATUS_RESUMING, @@ -29,7 +29,7 @@ if TYPE_CHECKING: - from agentpool.lifecycle.types import RunState + from wolfharness.lifecycle.types import RunState pytestmark = pytest.mark.integration diff --git a/tests/sessions/test_storage_provider_fixes.py b/tests/sessions/test_storage_provider_fixes.py index d880edb92..8066f9fa3 100644 --- a/tests/sessions/test_storage_provider_fixes.py +++ b/tests/sessions/test_storage_provider_fixes.py @@ -14,12 +14,12 @@ import pytest -from agentpool.messaging import ChatMessage -from agentpool.sessions import SessionData -from agentpool.utils.identifiers import ascending -from agentpool_config.storage import OpenCodeStorageConfig, SQLStorageConfig -from agentpool_storage.opencode_provider import OpenCodeStorageProvider -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness.messaging import ChatMessage +from wolfharness.sessions import SessionData +from wolfharness.utils.identifiers import ascending +from wolfharness_config.storage import OpenCodeStorageConfig, SQLStorageConfig +from wolfharness_storage.opencode_provider import OpenCodeStorageProvider +from wolfharness_storage.sql_provider import SQLModelProvider pytestmark = pytest.mark.integration @@ -166,7 +166,7 @@ async def test_load_session_returns_session_data( ) -> None: """Test that load_session returns SessionData for existing session.""" # Use ascending() to generate unique IDs - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( Session, SessionSummary, TimeCreatedUpdated, @@ -212,7 +212,7 @@ async def test_load_session_returns_session_data( async def test_delete_session(self, provider: OpenCodeStorageProvider) -> None: """Test that delete_session removes session and all data.""" # Use ascending() to generate unique IDs - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( Session, SessionSummary, TimeCreatedUpdated, @@ -259,7 +259,7 @@ async def test_list_session_ids(self, provider: OpenCodeStorageProvider) -> None # Use ascending() to generate unique IDs import anyenv - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( Session, SessionSummary, TimeCreatedUpdated, @@ -372,11 +372,11 @@ async def test_list_session_ids_cwd_filters_by_directory( """ import anyenv - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( Session, TimeCreatedUpdated, ) - from agentpool_storage.opencode_provider.helpers import compute_project_id + from wolfharness_storage.opencode_provider.helpers import compute_project_id # Create two separate git repos (simulating two different projects) alpha_dir = provider.base_path / "alpha_project" @@ -439,7 +439,7 @@ async def test_list_session_ids_cwd_none_returns_all( """list_session_ids(cwd=None) should return all sessions (no filtering).""" import anyenv - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( Session, TimeCreatedUpdated, ) @@ -476,7 +476,7 @@ async def test_list_session_ids_cwd_excludes_corrupted_session( Regression test: previously, if read_session returned None (corrupted JSON / I/O error), the cwd filter was bypassed and the session was incorrectly included in results. """ - from agentpool_storage.opencode_provider.helpers import compute_project_id + from wolfharness_storage.opencode_provider.helpers import compute_project_id # Create a real git repo so compute_project_id returns a valid project_id workdir = provider.base_path / "corrupt_project" @@ -491,7 +491,7 @@ async def test_list_session_ids_cwd_excludes_corrupted_session( valid_id = ascending("session") import anyenv - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( Session, TimeCreatedUpdated, ) @@ -529,7 +529,7 @@ async def test_list_session_ids_signature_matches_base_class( """ import inspect - from agentpool_storage.base import StorageProvider + from wolfharness_storage.base import StorageProvider base_params = inspect.signature(StorageProvider.list_session_ids).parameters override_params = inspect.signature(OpenCodeStorageProvider.list_session_ids).parameters @@ -558,7 +558,7 @@ def test_deserialize_messages_returns_model_message_objects(self) -> None: """ from pydantic_ai import ModelRequest, ModelResponse, TextPart, UserPromptPart - from agentpool.storage.serialization import ( + from wolfharness.storage.serialization import ( deserialize_messages, serialize_messages, ) @@ -594,13 +594,13 @@ def test_deserialize_messages_returns_model_message_objects(self) -> None: def test_deserialize_messages_empty_json(self) -> None: """Test that deserialize_messages handles empty/None input.""" - from agentpool.storage.serialization import deserialize_messages + from wolfharness.storage.serialization import deserialize_messages assert deserialize_messages(None) == [] assert deserialize_messages("") == [] def test_serialize_messages_empty_list(self) -> None: """Test that serialize_messages returns None for empty list.""" - from agentpool.storage.serialization import serialize_messages + from wolfharness.storage.serialization import serialize_messages assert serialize_messages([]) is None diff --git a/tests/sessions/test_title_generation.py b/tests/sessions/test_title_generation.py index 8948bd415..9bf89e556 100644 --- a/tests/sessions/test_title_generation.py +++ b/tests/sessions/test_title_generation.py @@ -9,27 +9,27 @@ import anyio import pytest -from agentpool import AgentPool -from agentpool.messaging import ChatMessage -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest -from agentpool.storage.manager import StorageManager -from agentpool_config.storage import ( +from wolfharness import AgentPool +from wolfharness.messaging import ChatMessage +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest +from wolfharness.storage.manager import StorageManager +from wolfharness_config.storage import ( FileStorageConfig, MemoryStorageConfig, SQLStorageConfig, StorageConfig, ) -from agentpool_storage.file_provider import FileProvider -from agentpool_storage.memory_provider import MemoryStorageProvider -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness_storage.file_provider import FileProvider +from wolfharness_storage.memory_provider import MemoryStorageProvider +from wolfharness_storage.sql_provider import SQLModelProvider pytestmark = pytest.mark.integration if TYPE_CHECKING: - from agentpool_storage.models import ConversationData + from wolfharness_storage.models import ConversationData GENERATED_TITLE = "Test Conversation Title" diff --git a/tests/skills/test_command.py b/tests/skills/test_command.py index 927d7e5fc..fd2ea5b24 100644 --- a/tests/skills/test_command.py +++ b/tests/skills/test_command.py @@ -5,8 +5,8 @@ import pytest from upathtools import UPath -from agentpool.skills.command import SkillCommand -from agentpool.skills.skill import Skill +from wolfharness.skills.command import SkillCommand +from wolfharness.skills.skill import Skill pytestmark = pytest.mark.unit diff --git a/tests/skills/test_exceptions.py b/tests/skills/test_exceptions.py index 7ee9391a2..a673e01fc 100644 --- a/tests/skills/test_exceptions.py +++ b/tests/skills/test_exceptions.py @@ -12,14 +12,14 @@ import pytest -from agentpool.skills.exceptions import ( +from wolfharness.skills.exceptions import ( ProviderError, ReferenceNotFoundError, SecurityError, SkillError, SkillNotFoundError, ) -from agentpool.utils.baseregistry import AgentPoolError +from wolfharness.utils.baseregistry import AgentPoolError pytestmark = pytest.mark.unit diff --git a/tests/skills/test_flat_uri.py b/tests/skills/test_flat_uri.py index ce98c0205..ba97d1992 100644 --- a/tests/skills/test_flat_uri.py +++ b/tests/skills/test_flat_uri.py @@ -15,15 +15,15 @@ import pytest -from agentpool.capabilities.extension_registry import ( +from wolfharness.capabilities.extension_registry import ( ExtensionRegistry, Scope, ScopeLevel, ) -from agentpool.capabilities.resource_protocols import SkillEntry, SkillResource -from agentpool.capabilities.skill_manager_cap import SkillManagerCap -from agentpool.skills.skill import Skill -from agentpool.skills.uri_resolver import ResolvedSkillURI, SkillURIResolver +from wolfharness.capabilities.resource_protocols import SkillEntry, SkillResource +from wolfharness.capabilities.skill_manager_cap import SkillManagerCap +from wolfharness.skills.skill import Skill +from wolfharness.skills.uri_resolver import ResolvedSkillURI, SkillURIResolver pytestmark = pytest.mark.unit @@ -176,7 +176,7 @@ async def test_flat_uri_resolver_raises_for_missing_skill() -> None: resolve('skill://nonexistent') is called, Then SkillNotFoundError is raised. """ - from agentpool.skills.exceptions import SkillNotFoundError + from wolfharness.skills.exceptions import SkillNotFoundError reg = ExtensionRegistry() skill_cap = FakeSkillResource(skills={"existing": "content"}) diff --git a/tests/skills/test_load_skill_propagation.py b/tests/skills/test_load_skill_propagation.py index f25ef1b0f..7201658f0 100644 --- a/tests/skills/test_load_skill_propagation.py +++ b/tests/skills/test_load_skill_propagation.py @@ -15,11 +15,11 @@ import pytest -from agentpool.host.factory import _inject_pool_providers +from wolfharness.host.factory import _inject_pool_providers if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.unit diff --git a/tests/skills/test_manager_config.py b/tests/skills/test_manager_config.py index 44cb38277..8a80f3dad 100644 --- a/tests/skills/test_manager_config.py +++ b/tests/skills/test_manager_config.py @@ -11,18 +11,18 @@ import structlog from upathtools import UPath -from agentpool.skills.manager import SkillsManager -from agentpool_config.skills import SkillsConfig +from wolfharness.skills.manager import SkillsManager +from wolfharness_config.skills import SkillsConfig pytestmark = pytest.mark.unit @pytest.fixture(autouse=True) -def _setup_agentpool_logging() -> None: - """Ensure agentpool loggers are configured for test capture. +def _setup_wolfharness_logging() -> None: + """Ensure wolfharness loggers are configured for test capture. - Resets structlog to a minimal configuration and sets the agentpool + Resets structlog to a minimal configuration and sets the wolfharness logger tree to DEBUG so that caplog reliably captures log messages regardless of structlog auto-configuration order in parallel runs. """ @@ -38,9 +38,9 @@ def _setup_agentpool_logging() -> None: cache_logger_on_first_use=True, ) - agentpool_root = logging.getLogger("agentpool") - agentpool_root.setLevel(logging.DEBUG) - agentpool_root.propagate = True + wolfharness_root = logging.getLogger("wolfharness") + wolfharness_root.setLevel(logging.DEBUG) + wolfharness_root.propagate = True logging.getLogger().setLevel(logging.DEBUG) @@ -122,7 +122,7 @@ async def test_discover_skills_logging( caplog: pytest.LogCaptureFixture, monkeypatch: pytest.MonkeyPatch ): """Test that missing custom paths log WARNING and missing default paths log DEBUG.""" - from agentpool_config import skills + from wolfharness_config import skills mock_default = [UPath("/non/existent/default/path")] monkeypatch.setattr(skills, "DEFAULT_SKILLS_PATHS", mock_default) diff --git a/tests/skills/test_mcp_skills_integration.py b/tests/skills/test_mcp_skills_integration.py index 27c880735..ab1213bdc 100644 --- a/tests/skills/test_mcp_skills_integration.py +++ b/tests/skills/test_mcp_skills_integration.py @@ -17,9 +17,9 @@ import pytest -from agentpool.capabilities.resource_protocols import SkillEntry, SkillResource -from agentpool.skills.skill import Skill -from agentpool_toolsets.builtin.skills import list_skills, load_skill +from wolfharness.capabilities.resource_protocols import SkillEntry, SkillResource +from wolfharness.skills.skill import Skill +from wolfharness_toolsets.builtin.skills import list_skills, load_skill pytestmark = pytest.mark.integration @@ -90,7 +90,7 @@ async def skill_exists(self, skill_name: str) -> bool: return True fake_child = _FakeSkillResource() - from agentpool.capabilities.skill_manager_cap import SkillManagerCap + from wolfharness.capabilities.skill_manager_cap import SkillManagerCap mock_cap = SkillManagerCap(local_skills={}, children=[fake_child], name="pool-skills") ctx_pool.skill_capabilities = [mock_cap] @@ -119,7 +119,7 @@ async def mock_resolve(uri: str): from types import SimpleNamespace - from agentpool.agents.context import AgentContext as RuntimeAgentContext + from wolfharness.agents.context import AgentContext as RuntimeAgentContext ctx = RuntimeAgentContext(node=SimpleNamespace(name="test"), pool=ctx_pool) diff --git a/tests/skills/test_registry_events.py b/tests/skills/test_registry_events.py index 400a1fc12..6324b670f 100644 --- a/tests/skills/test_registry_events.py +++ b/tests/skills/test_registry_events.py @@ -5,8 +5,8 @@ import pytest from upathtools import UPath -from agentpool.skills.registry import SkillsRegistry -from agentpool.skills.skill import Skill +from wolfharness.skills.registry import SkillsRegistry +from wolfharness.skills.skill import Skill pytestmark = pytest.mark.unit diff --git a/tests/skills/test_scratchpad_skill_reference_redflag.py b/tests/skills/test_scratchpad_skill_reference_redflag.py index 56fc33a87..dc42521d0 100644 --- a/tests/skills/test_scratchpad_skill_reference_redflag.py +++ b/tests/skills/test_scratchpad_skill_reference_redflag.py @@ -31,10 +31,10 @@ import pytest -from agentpool.skills.exceptions import SkillNotFoundError -from agentpool.skills.skill import Skill -from agentpool.skills.uri_resolver import SkillURIResolver -from agentpool_toolsets.builtin.skills import load_skill +from wolfharness.skills.exceptions import SkillNotFoundError +from wolfharness.skills.skill import Skill +from wolfharness.skills.uri_resolver import SkillURIResolver +from wolfharness_toolsets.builtin.skills import load_skill pytestmark = pytest.mark.integration @@ -56,7 +56,7 @@ def __init__(self, skills: list[Skill]) -> None: self._skills = skills async def list_skills(self): - from agentpool.capabilities.resource_protocols import SkillEntry + from wolfharness.capabilities.resource_protocols import SkillEntry return [ SkillEntry( @@ -245,7 +245,7 @@ async def test_load_skill_tool_with_uri_and_reference( ctx = mock_agent_context_with_resolver # We need to mock _load_reference_content to avoid actual MCP calls - with patch("agentpool_toolsets.builtin.skills._load_reference_content") as mock_load_ref: + with patch("wolfharness_toolsets.builtin.skills._load_reference_content") as mock_load_ref: mock_load_ref.return_value = ( "\n\n## Reference: expert_knowledge/excavator/excavator-hard-starting.md\n\n" "# Excavator Hard Starting\n\nDiagnostic procedure." diff --git a/tests/skills/test_skill_parsing.py b/tests/skills/test_skill_parsing.py index 90bac3361..7973165f2 100644 --- a/tests/skills/test_skill_parsing.py +++ b/tests/skills/test_skill_parsing.py @@ -9,7 +9,7 @@ import pytest from upathtools import UPath -from agentpool.skills.skill import Skill +from wolfharness.skills.skill import Skill pytestmark = pytest.mark.unit diff --git a/tests/skills/test_skill_tool_manager.py b/tests/skills/test_skill_tool_manager.py index fc34256ea..c86d0cc47 100644 --- a/tests/skills/test_skill_tool_manager.py +++ b/tests/skills/test_skill_tool_manager.py @@ -17,9 +17,9 @@ import pytest -from agentpool.skills.skill_tool_manager import SkillToolManager -from agentpool.tools.base import Tool -from agentpool_config.skills import SkillToolConfig +from wolfharness.skills.skill_tool_manager import SkillToolManager +from wolfharness.tools.base import Tool +from wolfharness_config.skills import SkillToolConfig pytestmark = pytest.mark.unit @@ -67,7 +67,7 @@ def test_import_nonexistent_module(self, manager: SkillToolManager) -> None: import_path="nonexistent_module_xyz__test:nonexistent_func", ) - with patch("agentpool.skills.skill_tool_manager.logger") as mock_logger: + with patch("wolfharness.skills.skill_tool_manager.logger") as mock_logger: tool = manager.import_tool(config) assert tool is None @@ -77,7 +77,7 @@ def test_import_path_without_colon(self, manager: SkillToolManager) -> None: """Import path without ':' logs warning and returns None.""" config = SkillToolConfig(type="python", import_path="os") - with patch("agentpool.skills.skill_tool_manager.logger") as mock_logger: + with patch("wolfharness.skills.skill_tool_manager.logger") as mock_logger: tool = manager.import_tool(config) assert tool is None @@ -89,7 +89,7 @@ def test_import_non_callable_attribute(self, manager: SkillToolManager) -> None: # os.sep is a plain string, not callable config = SkillToolConfig(type="python", import_path="os:sep") - with patch("agentpool.skills.skill_tool_manager.logger") as mock_logger: + with patch("wolfharness.skills.skill_tool_manager.logger") as mock_logger: tool = manager.import_tool(config) assert tool is None @@ -103,7 +103,7 @@ def test_import_nonexistent_attribute(self, manager: SkillToolManager) -> None: import_path="os:this_attr_does_not_exist_xyz", ) - with patch("agentpool.skills.skill_tool_manager.logger") as mock_logger: + with patch("wolfharness.skills.skill_tool_manager.logger") as mock_logger: tool = manager.import_tool(config) assert tool is None @@ -141,7 +141,7 @@ def test_batch_mixed_valid_invalid(self, manager: SkillToolManager) -> None: SkillToolConfig(type="python", import_path="os:sep"), # non-callable ] - with patch("agentpool.skills.skill_tool_manager.logger"): + with patch("wolfharness.skills.skill_tool_manager.logger"): tools = manager.import_tools(configs) assert len(tools) == 2 @@ -154,7 +154,7 @@ def test_batch_all_invalid(self, manager: SkillToolManager) -> None: SkillToolConfig(type="python", import_path="os:sep"), # non-callable ] - with patch("agentpool.skills.skill_tool_manager.logger"): + with patch("wolfharness.skills.skill_tool_manager.logger"): tools = manager.import_tools(configs) assert tools == [] diff --git a/tests/skills/test_skills.py b/tests/skills/test_skills.py index aa5f65b61..6163530ea 100644 --- a/tests/skills/test_skills.py +++ b/tests/skills/test_skills.py @@ -10,8 +10,8 @@ import pytest from upathtools import UPath -from agentpool.skills.registry import SkillsRegistry -from agentpool.skills.skill import Skill +from wolfharness.skills.registry import SkillsRegistry +from wolfharness.skills.skill import Skill pytestmark = pytest.mark.unit diff --git a/tests/skills/test_skills_config.py b/tests/skills/test_skills_config.py index 5737be361..e931fa173 100644 --- a/tests/skills/test_skills_config.py +++ b/tests/skills/test_skills_config.py @@ -5,7 +5,7 @@ import pytest from upathtools import UPath -from agentpool_config.skills import DEFAULT_SKILLS_PATHS, SkillsConfig +from wolfharness_config.skills import DEFAULT_SKILLS_PATHS, SkillsConfig pytestmark = pytest.mark.unit diff --git a/tests/skills/test_skills_integration.py b/tests/skills/test_skills_integration.py index a0d8cafef..2eeec88f3 100644 --- a/tests/skills/test_skills_integration.py +++ b/tests/skills/test_skills_integration.py @@ -12,7 +12,7 @@ from upathtools import UPath import yaml -from agentpool.delegation.pool import AgentPool +from wolfharness.delegation.pool import AgentPool pytestmark = pytest.mark.integration @@ -117,7 +117,7 @@ async def test_skills_disable_defaults(monkeypatch: pytest.MonkeyPatch): Assert that default paths are NOT searched. """ - from agentpool_config import skills + from wolfharness_config import skills # Mock default paths to something we can control with tempfile.TemporaryDirectory() as temp_dir: diff --git a/tests/skills/test_uri_resolver.py b/tests/skills/test_uri_resolver.py index e93ee0d82..f7d90cd0e 100644 --- a/tests/skills/test_uri_resolver.py +++ b/tests/skills/test_uri_resolver.py @@ -14,9 +14,9 @@ import pytest -from agentpool.capabilities.resource_protocols import SkillEntry, SkillResource -from agentpool.skills.exceptions import SecurityError, SkillNotFoundError -from agentpool.skills.uri_resolver import ( +from wolfharness.capabilities.resource_protocols import SkillEntry, SkillResource +from wolfharness.skills.exceptions import SecurityError, SkillNotFoundError +from wolfharness.skills.uri_resolver import ( ResolvedSkillURI, SkillURIResolver, _validate_skill_name, diff --git a/tests/storage/test_checkpoint_storage.py b/tests/storage/test_checkpoint_storage.py index 8813bd640..fb777e3b8 100644 --- a/tests/storage/test_checkpoint_storage.py +++ b/tests/storage/test_checkpoint_storage.py @@ -14,11 +14,11 @@ ) import pytest -from agentpool.sessions.models import PendingDeferredCall -from agentpool.storage.manager import StorageManager -from agentpool.storage.serialization import serialize_messages -from agentpool_config.storage import MemoryStorageConfig, StorageConfig -from agentpool_storage.memory_provider.provider import MemoryStorageProvider +from wolfharness.sessions.models import PendingDeferredCall +from wolfharness.storage.manager import StorageManager +from wolfharness.storage.serialization import serialize_messages +from wolfharness_config.storage import MemoryStorageConfig, StorageConfig +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider pytestmark = pytest.mark.unit diff --git a/tests/storage/test_deferred_serialization.py b/tests/storage/test_deferred_serialization.py index 54f4223a0..d99868301 100644 --- a/tests/storage/test_deferred_serialization.py +++ b/tests/storage/test_deferred_serialization.py @@ -6,8 +6,8 @@ import pytest -from agentpool.sessions.models import PendingDeferredCall -from agentpool.storage.serialization import ( +from wolfharness.sessions.models import PendingDeferredCall +from wolfharness.storage.serialization import ( deserialize_pending_calls, serialize_pending_calls, ) diff --git a/tests/storage/test_memory_checkpoint.py b/tests/storage/test_memory_checkpoint.py index 51ef81f3c..378f94dc4 100644 --- a/tests/storage/test_memory_checkpoint.py +++ b/tests/storage/test_memory_checkpoint.py @@ -6,7 +6,7 @@ import pytest -from agentpool_storage.memory_provider.provider import MemoryStorageProvider +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider @pytest.fixture @@ -59,7 +59,7 @@ async def test_delete_checkpoint_nonexistent(self, store: MemoryStorageProvider) @pytest.mark.unit async def test_session_delete_cleans_checkpoint(self, store: MemoryStorageProvider) -> None: """Deleting a session also cleans up its checkpoint data.""" - from agentpool.sessions import SessionData + from wolfharness.sessions import SessionData session_id = "s1" data = SessionData(session_id=session_id, agent_name="test_agent") diff --git a/tests/storage/test_protocols.py b/tests/storage/test_protocols.py index 1a98724ee..2d6fb2b0f 100644 --- a/tests/storage/test_protocols.py +++ b/tests/storage/test_protocols.py @@ -7,9 +7,9 @@ import pytest -from agentpool_storage.adapter import StorageProviderAdapter -from agentpool_storage.base import StorageProvider -from agentpool_storage.protocols import ( +from wolfharness_storage.adapter import StorageProviderAdapter +from wolfharness_storage.base import StorageProvider +from wolfharness_storage.protocols import ( CheckpointStore, CommandLog, MessagePersistence, @@ -189,19 +189,19 @@ class TestProviderProtocolConformance: """Test that concrete providers pass isinstance checks.""" def test_memory_storage_provider_satisfies_session_persistence(self) -> None: - from agentpool_storage.memory_provider.provider import MemoryStorageProvider + from wolfharness_storage.memory_provider.provider import MemoryStorageProvider provider = MemoryStorageProvider() assert isinstance(provider, SessionPersistence) def test_memory_storage_provider_satisfies_checkpoint_store(self) -> None: - from agentpool_storage.memory_provider.provider import MemoryStorageProvider + from wolfharness_storage.memory_provider.provider import MemoryStorageProvider provider = MemoryStorageProvider() assert isinstance(provider, CheckpointStore) def test_memory_storage_provider_isinstance(self) -> None: - from agentpool_storage.memory_provider.provider import MemoryStorageProvider + from wolfharness_storage.memory_provider.provider import MemoryStorageProvider provider = MemoryStorageProvider() protocols = [ diff --git a/tests/storage/test_sql_checkpoint.py b/tests/storage/test_sql_checkpoint.py index ba0c7ea97..4871c8b1e 100644 --- a/tests/storage/test_sql_checkpoint.py +++ b/tests/storage/test_sql_checkpoint.py @@ -11,9 +11,9 @@ import pytest -from agentpool.sessions import SessionData -from agentpool_config.storage import SQLStorageConfig -from agentpool_storage.sql_provider import SQLModelProvider +from wolfharness.sessions import SessionData +from wolfharness_config.storage import SQLStorageConfig +from wolfharness_storage.sql_provider import SQLModelProvider if TYPE_CHECKING: diff --git a/tests/storage/test_sql_truncate_messages.py b/tests/storage/test_sql_truncate_messages.py index 30c0fd680..9f7822178 100644 --- a/tests/storage/test_sql_truncate_messages.py +++ b/tests/storage/test_sql_truncate_messages.py @@ -14,9 +14,9 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlmodel import select -from agentpool_config.storage import SQLStorageConfig -from agentpool_storage.sql_provider.models import Message -from agentpool_storage.sql_provider.sql_provider import SQLModelProvider +from wolfharness_config.storage import SQLStorageConfig +from wolfharness_storage.sql_provider.models import Message +from wolfharness_storage.sql_provider.sql_provider import SQLModelProvider if TYPE_CHECKING: diff --git a/tests/team_mode/conftest.py b/tests/team_mode/conftest.py index 9f27f52ba..28165cefa 100644 --- a/tests/team_mode/conftest.py +++ b/tests/team_mode/conftest.py @@ -25,9 +25,9 @@ if TYPE_CHECKING: from pydantic_ai.messages import ModelMessage, ModelResponse, ToolReturnPart - from agentpool import AgentPool - from agentpool.capabilities.agent_context import AgentContextDeps - from agentpool_config.team_mode import TeamModeConfig + from wolfharness import AgentPool + from wolfharness.capabilities.agent_context import AgentContextDeps + from wolfharness_config.team_mode import TeamModeConfig # --------------------------------------------------------------------------- @@ -89,10 +89,10 @@ def build_agent_context( invoke ``TeamCommCapability`` methods without going through ``Agent.run()``. """ - from agentpool.capabilities.agent_context import AgentContextDeps - from agentpool.capabilities.runloop_delegation import RunLoopDelegationService - from agentpool.host.context import RunScope - from agentpool.host.registry import AgentRegistry + from wolfharness.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.runloop_delegation import RunLoopDelegationService + from wolfharness.host.context import RunScope + from wolfharness.host.registry import AgentRegistry session_pool = pool.session_pool assert session_pool is not None @@ -200,7 +200,7 @@ def make_enabled_config( notice_delivery_mode: str = "steer", ) -> TeamModeConfig: """Create an enabled TeamModeConfig for testing.""" - from agentpool_config.team_mode import TeamModeConfig + from wolfharness_config.team_mode import TeamModeConfig return TeamModeConfig( enabled=True, @@ -250,7 +250,7 @@ def make_run_context( If ``session_pool`` is provided, ensures its async methods and sub-attributes are properly mocked for team tool operations. """ - from agentpool.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.agent_context import AgentContextDeps cfg = config or make_enabled_config(base_dir=base_dir) @@ -289,7 +289,7 @@ def init_team( members: list[dict[str, str]] | None = None, ) -> None: """Initialize a real FileTeamState with a team and registered members.""" - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState if members is None: members = [ diff --git a/tests/team_mode/test_display_e2e.py b/tests/team_mode/test_display_e2e.py index 51f38d457..108027d47 100644 --- a/tests/team_mode/test_display_e2e.py +++ b/tests/team_mode/test_display_e2e.py @@ -12,22 +12,22 @@ import pytest -from agentpool.agents.events.events import SpawnSessionStart, StreamCompleteEvent +from wolfharness.agents.events.events import SpawnSessionStart, StreamCompleteEvent @pytest.mark.unit @pytest.mark.asyncio async def test_e2e_team_member_display_name_propagation(): # noqa: PLR0915 """Verify display_name flows from SpawnSessionStart through ToolPart and session title.""" - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( MessageWithParts, Session, ToolPart, ) - from agentpool_server.opencode_server.opencode_event_bridge import ( + from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) - from agentpool_server.opencode_server.opencode_message_bridge import ( + from wolfharness_server.opencode_server.opencode_message_bridge import ( OpenCodeMessageBridgeMixin, ) @@ -104,7 +104,7 @@ async def test_e2e_team_member_display_name_propagation(): # noqa: PLR0915 mock_session.title = "New Session" # Simulate pre-existing default title with patch( - "agentpool_server.opencode_server.opencode_event_bridge.ensure_session", + "wolfharness_server.opencode_server.opencode_event_bridge.ensure_session", new_callable=AsyncMock, return_value=mock_session, ): @@ -169,14 +169,14 @@ async def test_e2e_team_member_display_name_propagation(): # noqa: PLR0915 @pytest.mark.asyncio async def test_e2e_lead_display_name_propagation(): """Verify lead agent gets 'Lead' role in display name.""" - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( MessageWithParts, Session, ) - from agentpool_server.opencode_server.opencode_event_bridge import ( + from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) - from agentpool_server.opencode_server.opencode_message_bridge import ( + from wolfharness_server.opencode_server.opencode_message_bridge import ( OpenCodeMessageBridgeMixin, ) @@ -233,7 +233,7 @@ async def test_e2e_lead_display_name_propagation(): mock_session.title = "New Session" with patch( - "agentpool_server.opencode_server.opencode_event_bridge.ensure_session", + "wolfharness_server.opencode_server.opencode_event_bridge.ensure_session", new_callable=AsyncMock, return_value=mock_session, ): @@ -250,14 +250,14 @@ async def test_e2e_lead_display_name_propagation(): @pytest.mark.asyncio async def test_e2e_regular_subagent_no_team_context(): """Verify non-team subagents don't get team prefix.""" - from agentpool_server.opencode_server.models import ( + from wolfharness_server.opencode_server.models import ( MessageWithParts, Session, ) - from agentpool_server.opencode_server.opencode_event_bridge import ( + from wolfharness_server.opencode_server.opencode_event_bridge import ( OpenCodeEventBridgeMixin, ) - from agentpool_server.opencode_server.opencode_message_bridge import ( + from wolfharness_server.opencode_server.opencode_message_bridge import ( OpenCodeMessageBridgeMixin, ) @@ -310,7 +310,7 @@ async def test_e2e_regular_subagent_no_team_context(): mock_session.title = "New Session" with patch( - "agentpool_server.opencode_server.opencode_event_bridge.ensure_session", + "wolfharness_server.opencode_server.opencode_event_bridge.ensure_session", new_callable=AsyncMock, return_value=mock_session, ): diff --git a/tests/team_mode/test_display_enrichment.py b/tests/team_mode/test_display_enrichment.py index 2f4ff1fc3..ae9f9b22e 100644 --- a/tests/team_mode/test_display_enrichment.py +++ b/tests/team_mode/test_display_enrichment.py @@ -9,7 +9,7 @@ import pytest -from agentpool.agents.events.events import SpawnSessionStart +from wolfharness.agents.events.events import SpawnSessionStart def _make_team_spawn_event( diff --git a/tests/team_mode/test_flow_budget.py b/tests/team_mode/test_flow_budget.py index 1628b3f01..947da02c4 100644 --- a/tests/team_mode/test_flow_budget.py +++ b/tests/team_mode/test_flow_budget.py @@ -21,17 +21,17 @@ import pytest import yamling -from agentpool import AgentPool, AgentsManifest -from agentpool.capabilities.file_team_state import FileTeamState -from agentpool.capabilities.team_comm_capability import TeamCommCapability from tests.team_mode.conftest import build_agent_context, make_mock_run_context +from wolfharness import AgentPool, AgentsManifest +from wolfharness.capabilities.file_team_state import FileTeamState +from wolfharness.capabilities.team_comm_capability import TeamCommCapability if TYPE_CHECKING: from collections.abc import AsyncIterator from pathlib import Path - from agentpool_config.team_mode import TeamModeConfig + from wolfharness_config.team_mode import TeamModeConfig # --------------------------------------------------------------------------- diff --git a/tests/team_mode/test_flow_error_containment.py b/tests/team_mode/test_flow_error_containment.py index d6489aade..255d4d9cf 100644 --- a/tests/team_mode/test_flow_error_containment.py +++ b/tests/team_mode/test_flow_error_containment.py @@ -16,14 +16,14 @@ from pydantic_ai.messages import ToolReturn import pytest -from agentpool.capabilities.file_team_state import FileTeamState -from agentpool.capabilities.team_comm_capability import TeamCommCapability from tests.team_mode.conftest import build_agent_context, make_mock_run_context +from wolfharness.capabilities.file_team_state import FileTeamState +from wolfharness.capabilities.team_comm_capability import TeamCommCapability if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool_config.team_mode import TeamModeConfig + from wolfharness import AgentPool + from wolfharness_config.team_mode import TeamModeConfig # --------------------------------------------------------------------------- diff --git a/tests/team_mode/test_flow_lifecycle.py b/tests/team_mode/test_flow_lifecycle.py index f849d3665..1423a5932 100644 --- a/tests/team_mode/test_flow_lifecycle.py +++ b/tests/team_mode/test_flow_lifecycle.py @@ -16,8 +16,8 @@ from pydantic_ai.models.function import AgentInfo, FunctionModel import pytest -from agentpool.capabilities.team_comm_capability import TeamCommCapability -from agentpool_config.team_mode import TeamModeConfig +from wolfharness.capabilities.team_comm_capability import TeamCommCapability +from wolfharness_config.team_mode import TeamModeConfig # --------------------------------------------------------------------------- @@ -85,7 +85,7 @@ def _make_run_context( Returns: A MagicMock whose .deps is a mock AgentContextDeps. """ - from agentpool.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.agent_context import AgentContextDeps cfg = config or _make_enabled_config(base_dir=base_dir) @@ -109,7 +109,7 @@ def _init_team( members: list[dict[str, str]] | None = None, ) -> None: """Initialize a real FileTeamState with a team and registered members.""" - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState if members is None: members = [ diff --git a/tests/team_mode/test_flow_role_aware.py b/tests/team_mode/test_flow_role_aware.py index d59df3215..d379e0eac 100644 --- a/tests/team_mode/test_flow_role_aware.py +++ b/tests/team_mode/test_flow_role_aware.py @@ -17,13 +17,13 @@ from pydantic_ai.tools import ToolDefinition import pytest -from agentpool.capabilities.team_comm_capability import TeamCommCapability from tests.team_mode.conftest import build_agent_context, make_mock_run_context +from wolfharness.capabilities.team_comm_capability import TeamCommCapability if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool_config.team_mode import TeamModeConfig + from wolfharness import AgentPool + from wolfharness_config.team_mode import TeamModeConfig # --------------------------------------------------------------------------- diff --git a/tests/team_mode/test_integration_collab_flow.py b/tests/team_mode/test_integration_collab_flow.py index 53e72e648..8667ebe37 100644 --- a/tests/team_mode/test_integration_collab_flow.py +++ b/tests/team_mode/test_integration_collab_flow.py @@ -11,7 +11,6 @@ import pytest -from agentpool.capabilities.team_comm_capability import TeamCommCapability from tests.team_mode.conftest import ( init_team, make_enabled_config, @@ -21,6 +20,7 @@ make_mock_registry, make_run_context, ) +from wolfharness.capabilities.team_comm_capability import TeamCommCapability if TYPE_CHECKING: @@ -192,7 +192,7 @@ async def test_send_message_with_persist_to_blackboard_integration( assert "Persisted to blackboard key 'critical_findings'" in result.return_value # Verify blackboard was actually written. - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_state = FileTeamState(str(tmp_path)) bb = team_state.read_blackboard("team_123", "critical_findings") @@ -256,7 +256,7 @@ async def test_batch_creation_with_hash_and_symbolic_refs(tmp_path: Path) -> Non assert "Created 3 tasks" in result.return_value # Verify dependencies were resolved. - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_state = FileTeamState(str(tmp_path)) tasks = team_state.list_tasks("team_123") @@ -472,7 +472,7 @@ async def test_agent_in_the_loop_team_tools(team_mode_pool: Any) -> None: ] # Collect all messages from the agent run result. - from agentpool.agents.events.events import StreamCompleteEvent + from wolfharness.agents.events.events import StreamCompleteEvent final_message = None for e in events: diff --git a/tests/team_mode/test_integration_defaults.py b/tests/team_mode/test_integration_defaults.py index 638cc2e16..a1392a285 100644 --- a/tests/team_mode/test_integration_defaults.py +++ b/tests/team_mode/test_integration_defaults.py @@ -12,8 +12,8 @@ import pytest -from agentpool.capabilities.team_comm_capability import TeamCommCapability -from agentpool_config.team_mode import MemberSpec, TeamDefaultsConfig, TeamModeConfig +from wolfharness.capabilities.team_comm_capability import TeamCommCapability +from wolfharness_config.team_mode import MemberSpec, TeamDefaultsConfig, TeamModeConfig def _make_defaults_config(base_dir: str) -> TeamModeConfig: @@ -42,7 +42,7 @@ def _make_run_context( session_id: str = "lead_session_001", ) -> MagicMock: """Create a mock RunContext with AgentContextDeps deps for integration tests.""" - from agentpool.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.agent_context import AgentContextDeps agent_ctx = MagicMock(spec=AgentContextDeps) agent_ctx.session.metadata = metadata @@ -64,7 +64,7 @@ async def test_team_create_with_config_default_members(tmp_path: Any) -> None: When: team_create is called with empty members. Then: uses defaults.members to create the team with child sessions. """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState config = _make_defaults_config(str(tmp_path)) @@ -214,7 +214,7 @@ def _make_child_state() -> Any: from unittest.mock import patch with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock(return_value="Skill docs"), ) as mock_load: result = await cap.team_create(ctx, "my_team", []) @@ -291,7 +291,7 @@ async def test_team_create_defaults_member_instructions_propagated(tmp_path: Any from unittest.mock import patch with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock(return_value="Skill docs"), ): result = await cap.team_create(ctx, "my_team", []) @@ -312,7 +312,7 @@ async def test_team_create_config_default_members_then_delete(tmp_path: Any) -> When: team_delete is called afterwards. Then: team is successfully deleted. """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState config = _make_defaults_config(str(tmp_path)) diff --git a/tests/team_mode/test_integration_mode.py b/tests/team_mode/test_integration_mode.py index 308ba1980..d69348c15 100644 --- a/tests/team_mode/test_integration_mode.py +++ b/tests/team_mode/test_integration_mode.py @@ -13,19 +13,19 @@ import pytest import yamling -from agentpool.capabilities.file_team_state import FileTeamState -from agentpool.capabilities.team_comm_capability import TeamCommCapability -from agentpool.models.manifest import AgentsManifest -from agentpool_config.team_mode import ( +from tests.team_mode.conftest import build_agent_context, make_mock_run_context +from wolfharness.capabilities.file_team_state import FileTeamState +from wolfharness.capabilities.team_comm_capability import TeamCommCapability +from wolfharness.models.manifest import AgentsManifest +from wolfharness_config.team_mode import ( MemberSpec, TeamDefaultsConfig, TeamModeConfig, ) -from tests.team_mode.conftest import build_agent_context, make_mock_run_context if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool # --------------------------------------------------------------------------- @@ -103,7 +103,7 @@ def _make_run_context( session_id: Session ID string for the mock SessionState. delegation: Mock DelegationService (defaults to a generic MagicMock). """ - from agentpool.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.agent_context import AgentContextDeps cfg = config or _make_enabled_config(base_dir=base_dir) diff --git a/tests/team_mode/test_integration_parallel.py b/tests/team_mode/test_integration_parallel.py index c789e1108..09f6cd7fd 100644 --- a/tests/team_mode/test_integration_parallel.py +++ b/tests/team_mode/test_integration_parallel.py @@ -20,13 +20,13 @@ from pydantic_ai.models.function import AgentInfo, FunctionModel import pytest -from agentpool.capabilities.team_comm_capability import TeamCommCapability from tests.team_mode.conftest import build_agent_context, make_mock_run_context +from wolfharness.capabilities.team_comm_capability import TeamCommCapability if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool_config.team_mode import TeamModeConfig + from wolfharness import AgentPool + from wolfharness_config.team_mode import TeamModeConfig # --------------------------------------------------------------------------- diff --git a/tests/team_mode/test_integration_session.py b/tests/team_mode/test_integration_session.py index 791c1c373..9355db4ca 100644 --- a/tests/team_mode/test_integration_session.py +++ b/tests/team_mode/test_integration_session.py @@ -21,18 +21,18 @@ import pytest import yamling -from agentpool import AgentPool, AgentsManifest -from agentpool.capabilities.agent_context import AgentContextDeps -from agentpool.capabilities.runloop_delegation import RunLoopDelegationService -from agentpool.capabilities.team_comm_capability import TeamCommCapability -from agentpool.host.context import RunScope -from agentpool.host.registry import AgentRegistry -from agentpool.orchestrator.core import SessionState # noqa: TC001 -from agentpool.orchestrator.run import RunHandle +from wolfharness import AgentPool, AgentsManifest +from wolfharness.capabilities.agent_context import AgentContextDeps +from wolfharness.capabilities.runloop_delegation import RunLoopDelegationService +from wolfharness.capabilities.team_comm_capability import TeamCommCapability +from wolfharness.host.context import RunScope +from wolfharness.host.registry import AgentRegistry +from wolfharness.orchestrator.core import SessionState # noqa: TC001 +from wolfharness.orchestrator.run import RunHandle if TYPE_CHECKING: - from agentpool_config.team_mode import TeamModeConfig + from wolfharness_config.team_mode import TeamModeConfig def _make_manifest( @@ -205,7 +205,7 @@ async def test_member_sessions_closed_when_lead_idle_and_no_active_runs( assert "Team 'test_team' created with 2 members" in create_result.return_value # Extract member session IDs from team state (exclude lead). - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_id = create_result.return_value.split("team_id=")[1].strip() team_state = FileTeamState(str(tmp_path)) @@ -304,7 +304,7 @@ async def test_cleanup_deferred_when_lead_has_active_run( ) assert "Team 'test_team' created with 1 members" in create_result.return_value - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_id = create_result.return_value.split("team_id=")[1].strip() team_state = FileTeamState(str(tmp_path)) @@ -389,7 +389,7 @@ async def test_cleanup_deferred_when_member_has_active_run( ) assert "Team 'test_team' created with 1 members" in create_result.return_value - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_id = create_result.return_value.split("team_id=")[1].strip() team_state = FileTeamState(str(tmp_path)) diff --git a/tests/team_mode/test_live.py b/tests/team_mode/test_live.py index 396069f11..f41bde429 100644 --- a/tests/team_mode/test_live.py +++ b/tests/team_mode/test_live.py @@ -79,7 +79,7 @@ def _create_test_config(tmp_path: Path) -> Path: def _collect_tool_names(events: list[Any]) -> list[str]: """Extract tool names from ``ToolCallStartEvent`` entries.""" - from agentpool.agents.events.events import ToolCallStartEvent + from wolfharness.agents.events.events import ToolCallStartEvent return [e.tool_name for e in events if isinstance(e, ToolCallStartEvent)] @@ -88,7 +88,7 @@ def _collect_text(events: list[Any]) -> str: """Concatenate all text deltas from ``PartDeltaEvent`` entries.""" from pydantic_ai import TextPartDelta, ThinkingPartDelta - from agentpool.agents.events.events import PartDeltaEvent + from wolfharness.agents.events.events import PartDeltaEvent parts: list[str] = [] for e in events: @@ -148,7 +148,7 @@ async def test_live_full_team_lifecycle(tmp_path: Path) -> None: Then: all seven team tools are invoked and the final response contains "ALL TESTS PASSED". """ - from agentpool.delegation.pool import AgentPool + from wolfharness.delegation.pool import AgentPool config_path = _create_test_config(tmp_path) @@ -186,7 +186,7 @@ async def test_live_member_session_cleanup(tmp_path: Path) -> None: Then: after the run completes, no active child sessions with ``parent_session_id`` matching the lead session remain. """ - from agentpool.delegation.pool import AgentPool + from wolfharness.delegation.pool import AgentPool config_path = _create_test_config(tmp_path) @@ -232,7 +232,7 @@ async def test_live_team_status_reflects_members(tmp_path: Path) -> None: Then: the ``team_create`` and ``team_status`` tools are invoked, and the response text mentions both member names. """ - from agentpool.delegation.pool import AgentPool + from wolfharness.delegation.pool import AgentPool config_path = _create_test_config(tmp_path) diff --git a/tests/team_mode/test_unit_batch_progress.py b/tests/team_mode/test_unit_batch_progress.py index 5c5f0e662..e83206af6 100644 --- a/tests/team_mode/test_unit_batch_progress.py +++ b/tests/team_mode/test_unit_batch_progress.py @@ -11,7 +11,7 @@ import pytest -from agentpool.capabilities.file_team_state import ( +from wolfharness.capabilities.file_team_state import ( FileTeamState, TaskRecord, format_owner_summary, @@ -180,7 +180,7 @@ def test_batch_exceeding_max_tasks_atomic_failure( When: create_tasks_batch would exceed _MAX_TASKS. Then: ValueError raised with max tasks message. """ - from agentpool.capabilities.file_team_state import _MAX_TASKS + from wolfharness.capabilities.file_team_state import _MAX_TASKS for i in range(_MAX_TASKS - 1): initialized_team.create_task("team-1", {"subject": f"Filler {i}"}) diff --git a/tests/team_mode/test_unit_capability.py b/tests/team_mode/test_unit_capability.py index 0d9b5c533..c625594c9 100644 --- a/tests/team_mode/test_unit_capability.py +++ b/tests/team_mode/test_unit_capability.py @@ -9,8 +9,8 @@ from pydantic_ai.tools import ToolDefinition import pytest -from agentpool.capabilities.team_comm_capability import TeamCommCapability -from agentpool_config.team_mode import TeamBounds, TeamModeConfig +from wolfharness.capabilities.team_comm_capability import TeamCommCapability +from wolfharness_config.team_mode import TeamBounds, TeamModeConfig # ---- Helpers ---- @@ -233,7 +233,7 @@ def _make_factory() -> Any: Returns an AgentFactory with a mock pool (the method under test does not access self._pool). """ - from agentpool.host.factory import AgentFactory + from wolfharness.host.factory import AgentFactory mock_pool = MagicMock() return AgentFactory(mock_pool) @@ -263,7 +263,7 @@ def _make_native_config(team_mode: Any = None) -> Any: Returns: A NativeAgentConfig with model='openai:test' and no tools. """ - from agentpool.models.agents import NativeAgentConfig + from wolfharness.models.agents import NativeAgentConfig return NativeAgentConfig( name="test_agent", @@ -452,7 +452,7 @@ def _make_run_context( Returns: A MagicMock whose .deps is a mock AgentContextDeps. """ - from agentpool.capabilities.agent_context import AgentContextDeps + from wolfharness.capabilities.agent_context import AgentContextDeps cfg = config or _make_enabled_config(base_dir=base_dir) @@ -501,7 +501,7 @@ def _make_lead_metadata(team_id: str = "team_123") -> dict[str, Any]: def _init_team(base_dir: str, team_id: str = "team_123") -> None: """Initialize a real FileTeamState with a team and members.""" - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState state = FileTeamState(base_dir) state.init( @@ -650,7 +650,7 @@ async def test_send_message_uses_steer_by_default(tmp_path: Any) -> None: When: send_message is called. Then: session_pool.send_message called with DeliveryMode.STEER. """ - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode _init_team(str(tmp_path)) mock_pool = MagicMock() @@ -758,7 +758,7 @@ async def test_bounds_started_at_recorded(tmp_path: Any) -> None: When: team_create completes. Then: state.json contains a 'started_at' field with an ISO timestamp. """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState config = _make_enabled_config( member_eligible=["worker", "reviewer"], @@ -1560,7 +1560,7 @@ async def test_shutdown_request_success(tmp_path: Any) -> None: assert result.return_value == "Shutdown completed for translator_agent" mock_pool.close_session.assert_awaited_once_with("sess_translator") # Verify member is removed from the members dict entirely (hard remove). - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_state = FileTeamState(str(tmp_path)) state = team_state._read_json(team_state._state_path("team_123")) @@ -1688,7 +1688,7 @@ async def test_send_message_queue_mode(tmp_path: Any) -> None: When: send_message is called. Then: DeliveryMode.QUEUE is used. """ - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode _init_team(str(tmp_path)) mock_pool = MagicMock() @@ -1803,7 +1803,7 @@ async def test_team_create_uses_config_default_members(tmp_path: Any) -> None: When: team_create is called with members=[]. Then: uses defaults.members from config to create the team. """ - from agentpool_config.team_mode import MemberSpec, TeamDefaultsConfig + from wolfharness_config.team_mode import MemberSpec, TeamDefaultsConfig config = _make_enabled_config( member_eligible=["translator", "reviewer"], @@ -1850,9 +1850,9 @@ async def test_resolve_agent_context_from_runtime_context(tmp_path: Any) -> None The tool functions receive ctx.deps = agents.context.AgentContext, and our capabilities.agent_context.AgentContextDeps is at ctx.deps.data. """ - from agentpool.agents.context import AgentContext as RuntimeAgentContext - from agentpool.capabilities.agent_context import AgentContextDeps - from agentpool.orchestrator.session_controller import SessionState + from wolfharness.agents.context import AgentContext as RuntimeAgentContext + from wolfharness.capabilities.agent_context import AgentContextDeps + from wolfharness.orchestrator.session_controller import SessionState # Create our capabilities AgentContextDeps (the frozen dataclass). session = SessionState(session_id="test-session-123", agent_name="test_agent") @@ -2165,7 +2165,7 @@ async def test_team_add_member_success(tmp_path: Any) -> None: assert mock_pool.send_message.await_count == 3 # Verify agent field in team state is the actual agent type, not the member name. - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_state = FileTeamState(str(tmp_path)) state = team_state._read_json(team_state._state_path("team_123")) @@ -2277,7 +2277,7 @@ async def test_team_add_member_ephemeral(tmp_path: Any) -> None: assert result.return_value == "Member 'temp_member' added to team (lifecycle=ephemeral)" # Verify the member was registered in team state. - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_state = FileTeamState(str(tmp_path)) sid = team_state.get_member_session_id("team_123", "temp_member") @@ -2309,7 +2309,7 @@ async def test_shutdown_request_removes_member(tmp_path: Any) -> None: assert result.return_value == "Shutdown completed for translator_agent" mock_pool.close_session.assert_awaited_once_with("sess_translator") # Verify member removed from team state (hard remove, not soft shutdown). - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_state = FileTeamState(str(tmp_path)) sid = team_state.get_member_session_id("team_123", "translator_agent") @@ -2382,7 +2382,7 @@ async def test_team_add_member_non_ascii_name(tmp_path: Any) -> None: assert "added to team" in result.return_value # Verify blackboard key was sanitized (non-ASCII chars replaced with _). - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState safe_name = re.sub(r"[^a-zA-Z0-9_]", "_", "推理员B") team_state = FileTeamState(str(tmp_path)) @@ -2401,7 +2401,7 @@ async def test_team_add_member_hyphen_in_name(tmp_path: Any) -> None: assert "added to team" in result.return_value # Verify blackboard key was sanitized (hyphen replaced with _). - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState safe_name = re.sub(r"[^a-zA-Z0-9_]", "_", "logician-B") team_state = FileTeamState(str(tmp_path)) @@ -2415,7 +2415,7 @@ async def test_team_add_member_agent_field_correct(tmp_path: Any) -> None: cap, ctx, _mock_pool, _mock_delegation, _mock_registry = _make_add_member_setup(tmp_path) await cap.team_add_member(ctx, "my_member", "editor") - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_state = FileTeamState(str(tmp_path)) state = team_state._read_json(team_state._state_path("team_123")) @@ -2430,7 +2430,7 @@ async def test_team_add_member_roster_includes_work_summary(tmp_path: Any) -> No When: team_add_member is called. Then: the initial prompt to the new member includes work-status for each member. """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState cap, ctx, mock_pool, _mock_delegation, _mock_registry = _make_add_member_setup(tmp_path) @@ -2536,7 +2536,7 @@ async def test_shutdown_request_non_ascii_name(tmp_path: Any) -> None: assert "Shutdown completed" in result.return_value # Verify blackboard was written with sanitized key. - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState safe_name = re.sub(r"[^a-zA-Z0-9_]", "_", "推理员") team_state = FileTeamState(str(tmp_path)) @@ -2590,7 +2590,7 @@ async def test_send_message_to_nonexistent_member_no_phantom(tmp_path: Any) -> N assert "not found" in result.return_value # Verify NO phantom entry was created in team state. - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_state = FileTeamState(str(tmp_path)) state = team_state._read_json(team_state._state_path("team_123")) @@ -3452,7 +3452,7 @@ async def test_after_run_reminder_for_unfinished_tasks(tmp_path: Any) -> None: Then: routes a reminder message to the member's own session via session_pool.send_message with QUEUE mode. """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState _init_team(str(tmp_path)) team_state = FileTeamState(str(tmp_path)) @@ -3489,7 +3489,7 @@ async def test_after_run_reminder_for_unfinished_tasks(tmp_path: Any) -> None: # Verify QUEUE mode was used. call_args = mock_pool.send_message.await_args call_kwargs = call_args.kwargs - from agentpool.lifecycle.types import DeliveryMode + from wolfharness.lifecycle.types import DeliveryMode assert call_kwargs.get("mode") is DeliveryMode.QUEUE # Verify message content (2nd positional arg) mentions the unfinished task. @@ -3507,7 +3507,7 @@ async def test_after_run_no_reminder_for_lead(tmp_path: Any) -> None: When: after_run fires. Then: no reminder is sent (lead doesn't get task reminders). """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState _init_team(str(tmp_path)) team_state = FileTeamState(str(tmp_path)) @@ -3547,7 +3547,7 @@ async def test_after_run_no_reminder_when_session_closing(tmp_path: Any) -> None When: after_run fires. Then: no reminder is sent (shutdown path handles notification instead). """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState _init_team(str(tmp_path)) team_state = FileTeamState(str(tmp_path)) @@ -3588,7 +3588,7 @@ async def test_after_run_no_duplicate_reminder(tmp_path: Any) -> None: When: after_run fires again. Then: no second reminder is sent (max 1 per session). """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState _init_team(str(tmp_path)) team_state = FileTeamState(str(tmp_path)) @@ -3631,7 +3631,7 @@ async def test_after_run_no_reminder_when_no_unfinished_tasks(tmp_path: Any) -> When: after_run fires. Then: no reminder is sent. """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState _init_team(str(tmp_path)) team_state = FileTeamState(str(tmp_path)) @@ -3678,7 +3678,7 @@ async def test_shutdown_request_warns_about_unfinished_tasks(tmp_path: Any) -> N When: shutdown_request is called. Then: return value includes a warning about the unfinished task. """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState _init_team(str(tmp_path)) team_state = FileTeamState(str(tmp_path)) @@ -3719,7 +3719,7 @@ async def test_shutdown_request_no_warning_when_tasks_completed(tmp_path: Any) - When: shutdown_request is called. Then: return value is the standard message with no warning. """ - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState _init_team(str(tmp_path)) team_state = FileTeamState(str(tmp_path)) diff --git a/tests/team_mode/test_unit_collab_flow.py b/tests/team_mode/test_unit_collab_flow.py index 448c14fac..73f531a46 100644 --- a/tests/team_mode/test_unit_collab_flow.py +++ b/tests/team_mode/test_unit_collab_flow.py @@ -12,7 +12,6 @@ import pytest -from agentpool.capabilities.team_comm_capability import TeamCommCapability from tests.team_mode.conftest import ( init_team, make_enabled_config, @@ -21,6 +20,7 @@ make_mock_pool, make_run_context, ) +from wolfharness.capabilities.team_comm_capability import TeamCommCapability if TYPE_CHECKING: @@ -686,7 +686,7 @@ async def test_send_message_with_persist_to_blackboard(tmp_path: Path) -> None: assert "Message sent to reviewer_agent" in result.return_value assert "Persisted to blackboard key 'findings'" in result.return_value # Verify blackboard was written. - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_state = FileTeamState(str(tmp_path)) bb = team_state.read_blackboard("team_123", "findings") @@ -1322,7 +1322,7 @@ async def test_task_create_batch_exceeding_max_tasks(tmp_path: Path) -> None: cap = TeamCommCapability(config, "coordinator", make_lead_metadata()) # Create tasks to near the limit (100 max). - from agentpool.capabilities.file_team_state import _MAX_TASKS, FileTeamState + from wolfharness.capabilities.file_team_state import _MAX_TASKS, FileTeamState team_state = FileTeamState(str(tmp_path)) for i in range(_MAX_TASKS - 1): @@ -1361,7 +1361,7 @@ async def test_task_create_batch_with_progress_total(tmp_path: Path) -> None: task_id = task_id_line.split("-> ")[1].strip() # Verify progress_total was stored. - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState state = FileTeamState(str(tmp_path)) task = state.get_task("team_123", task_id) @@ -1438,7 +1438,7 @@ async def test_shutdown_request_success(tmp_path: Path) -> None: mock_pool.close_session.assert_awaited_once() # Verify member removed from team state. - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_state = FileTeamState(str(tmp_path)) state_path = team_state._state_path("team_123") @@ -1513,7 +1513,7 @@ async def test_delete_blackboard_success(tmp_path: Path) -> None: await cap.write_blackboard(ctx, "test_key", "test_value") # Verify it exists. - from agentpool.capabilities.file_team_state import FileTeamState + from wolfharness.capabilities.file_team_state import FileTeamState team_state = FileTeamState(str(tmp_path)) assert team_state.read_blackboard("team_123", "test_key") is not None @@ -1577,7 +1577,7 @@ async def test_team_create_exceeds_max_members(tmp_path: Path) -> None: When: team_create is called with 3 members. Then: error returned about exceeding max_members. """ - from agentpool_config.team_mode import TeamBounds + from wolfharness_config.team_mode import TeamBounds config = make_enabled_config(base_dir=str(tmp_path)) config = config.model_copy(update={"bounds": TeamBounds(max_members=2)}) @@ -1614,7 +1614,7 @@ async def test_team_add_member_exceeds_max_members(tmp_path: Path) -> None: When: team_add_member is called to add a 3rd member. Then: error returned about exceeding max_members. """ - from agentpool_config.team_mode import TeamBounds + from wolfharness_config.team_mode import TeamBounds config = make_enabled_config( member_eligible=["worker", "reviewer", "editor"], diff --git a/tests/team_mode/test_unit_config.py b/tests/team_mode/test_unit_config.py index b67fdc1de..9be691a2e 100644 --- a/tests/team_mode/test_unit_config.py +++ b/tests/team_mode/test_unit_config.py @@ -5,7 +5,7 @@ from pydantic import ValidationError import pytest -from agentpool_config.team_mode import ( +from wolfharness_config.team_mode import ( BlackboardConfig, MemberSpec, TeamBounds, diff --git a/tests/team_mode/test_unit_file_state.py b/tests/team_mode/test_unit_file_state.py index 0965bfef4..d61fa369e 100644 --- a/tests/team_mode/test_unit_file_state.py +++ b/tests/team_mode/test_unit_file_state.py @@ -13,7 +13,7 @@ import pytest -from agentpool.capabilities.file_team_state import ( +from wolfharness.capabilities.file_team_state import ( FileTeamState, TaskRecord, format_task_xml, diff --git a/tests/team_mode/test_unit_skill_injection.py b/tests/team_mode/test_unit_skill_injection.py index 4512065f1..0b6e61387 100644 --- a/tests/team_mode/test_unit_skill_injection.py +++ b/tests/team_mode/test_unit_skill_injection.py @@ -15,7 +15,6 @@ import pytest -from agentpool.capabilities.team_comm_capability import TeamCommCapability from tests.team_mode.conftest import ( init_team, make_enabled_config, @@ -23,6 +22,7 @@ make_mock_pool, make_run_context, ) +from wolfharness.capabilities.team_comm_capability import TeamCommCapability # --------------------------------------------------------------------------- @@ -78,7 +78,7 @@ async def test_team_create_with_member_skills_injects_instruction_blocks( cap = _make_cap() with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock(return_value="Skill instructions text"), ) as mock_load: result = await cap.team_create( @@ -105,7 +105,7 @@ async def test_team_create_without_skills_no_injection(tmp_path: Any) -> None: cap = _make_cap() with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock() + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock() ) as mock_load: result = await cap.team_create( ctx, @@ -127,7 +127,7 @@ async def test_team_create_skills_before_instructions(tmp_path: Any) -> None: cap = _make_cap() with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock(return_value="Skill docs"), ): await cap.team_create( @@ -158,7 +158,7 @@ async def test_team_create_skills_dedup(tmp_path: Any) -> None: cap = _make_cap() with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock(return_value="x"), ) as mock_load: await cap.team_create( @@ -186,7 +186,7 @@ async def test_team_add_member_with_skills_injects_block(tmp_path: Any) -> None: cap = _make_cap() with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock(return_value="Skill text"), ) as mock_load: result = await cap.team_add_member( @@ -213,7 +213,7 @@ async def test_team_add_member_without_skills_no_injection(tmp_path: Any) -> Non cap = _make_cap() with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock() + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock() ) as mock_load: result = await cap.team_add_member( ctx, @@ -236,7 +236,7 @@ async def test_team_add_member_empty_skills_list_no_injection(tmp_path: Any) -> cap = _make_cap() with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock() + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock() ) as mock_load: await cap.team_add_member(ctx, "new_worker", "worker", skills=[]) @@ -256,7 +256,7 @@ async def test_skill_not_visible_renders_error_text_member_created(tmp_path: Any cap = _make_cap() with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock(return_value=("Skill 'lodestone' not found. Available skills: some_other")), ): result = await cap.team_add_member(ctx, "new_worker", "worker", skills=["lodestone"]) @@ -274,7 +274,7 @@ async def test_skill_load_exception_renders_error_text_member_created(tmp_path: cap = _make_cap() with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock(side_effect=RuntimeError("boom")), ): result = await cap.team_add_member(ctx, "new_worker", "worker", skills=["bad"]) @@ -298,7 +298,7 @@ async def test_skill_injection_no_tool_assembly_contract(tmp_path: Any) -> None: cap = _make_cap() with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock(return_value="docs"), ) as mock_load: await cap.team_add_member(ctx, "new_worker", "worker", skills=["s1"]) @@ -326,7 +326,7 @@ async def test_skill_uri_reference_path_display_name(tmp_path: Any) -> None: cap = _make_cap() with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock(return_value="ref content"), ) as mock_load: await cap.team_add_member( @@ -355,7 +355,7 @@ async def test_team_create_skills_non_list_degrades_gracefully(tmp_path: Any) -> cap = _make_cap() with patch( - "agentpool_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock() + "wolfharness_toolsets.builtin.skills.load_skill_for_node", new=AsyncMock() ) as mock_load: result = await cap.team_create( ctx, diff --git a/tests/teams/test_parallel_agents.py b/tests/teams/test_parallel_agents.py index 807fe3723..08238a5ae 100644 --- a/tests/teams/test_parallel_agents.py +++ b/tests/teams/test_parallel_agents.py @@ -7,8 +7,8 @@ from pydantic import BaseModel import pytest -from agentpool import AgentPool, AgentsManifest -from agentpool.delegation.base_team import BaseTeam +from wolfharness import AgentPool, AgentsManifest +from wolfharness.delegation.base_team import BaseTeam pytestmark = pytest.mark.integration diff --git a/tests/teams/test_team.py b/tests/teams/test_team.py index b6951b5f3..6c0650910 100644 --- a/tests/teams/test_team.py +++ b/tests/teams/test_team.py @@ -6,8 +6,8 @@ import pytest -from agentpool import Agent, ChatMessage -from agentpool.delegation.base_team import BaseTeam +from wolfharness import Agent, ChatMessage +from wolfharness.delegation.base_team import BaseTeam pytestmark = pytest.mark.unit diff --git a/tests/teams/test_team_run.py b/tests/teams/test_team_run.py index 903f8e7fc..4c058191d 100644 --- a/tests/teams/test_team_run.py +++ b/tests/teams/test_team_run.py @@ -6,9 +6,9 @@ import anyio import pytest -from agentpool import Agent, ChatMessage -from agentpool.utils.model_helpers import function_to_model -from agentpool.utils.time_utils import get_now +from wolfharness import Agent, ChatMessage +from wolfharness.utils.model_helpers import function_to_model +from wolfharness.utils.time_utils import get_now pytestmark = pytest.mark.integration diff --git a/tests/teams/test_team_streaming.py b/tests/teams/test_team_streaming.py index a1bbb996f..153f53808 100644 --- a/tests/teams/test_team_streaming.py +++ b/tests/teams/test_team_streaming.py @@ -17,21 +17,21 @@ import pytest -from agentpool import Agent -from agentpool.agents.events import ( +from wolfharness import Agent +from wolfharness.agents.events import ( SpawnSessionStart, StreamCompleteEvent, SubAgentEvent, ) -from agentpool.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError -from agentpool.delegation.base_team import BaseTeam -from agentpool.messaging import ChatMessage +from wolfharness.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError +from wolfharness.delegation.base_team import BaseTeam +from wolfharness.messaging import ChatMessage pytestmark = pytest.mark.integration -pytestmark = pytest.mark.filterwarnings("ignore::DeprecationWarning:agentpool.agents.base_agent") +pytestmark = pytest.mark.filterwarnings("ignore::DeprecationWarning:wolfharness.agents.base_agent") # ============================================================================ @@ -43,7 +43,7 @@ def _make_echo_agent(name: str, response: str = "hello") -> Agent[Any, str]: """Create an Agent that echoes a fixed response via function_to_model.""" from functools import partial - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model async def _echo(_msg: str, *, _response: str = response) -> str: return _response @@ -84,7 +84,7 @@ async def test_team_run_stream_depth_guard() -> None: async def test_team_run_stream_depth_at_limit_ok() -> None: """Team.run_stream() should NOT raise at depth = MAX - 1.""" - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model async def echo(msg: str) -> str: return msg @@ -104,7 +104,7 @@ async def echo(msg: str) -> str: async def test_team_run_stream_emits_spawn_session_start() -> None: """Each member should emit SpawnSessionStart before SubAgentEvent content.""" - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model async def echo(msg: str) -> str: return msg @@ -133,7 +133,7 @@ async def echo(msg: str) -> str: async def test_spawn_session_start_precedes_subagent_for_member() -> None: """For each member, SpawnSessionStart should appear before any SubAgentEvent.""" - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model async def echo(msg: str) -> str: return msg @@ -164,7 +164,7 @@ async def echo(msg: str) -> str: async def test_subagent_event_preserves_session_ids() -> None: """SubAgentEvent should carry child_session_id and parent_session_id.""" - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model async def echo(msg: str) -> str: return msg @@ -189,7 +189,7 @@ async def echo(msg: str) -> str: async def test_spawn_session_start_carries_session_ids() -> None: """SpawnSessionStart should carry child_session_id and parent_session_id.""" - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model async def echo(msg: str) -> str: return msg @@ -209,7 +209,7 @@ async def echo(msg: str) -> str: async def test_out_of_pool_team_generates_session_ids() -> None: """Team without pool should generate session IDs and not crash.""" - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model async def echo(msg: str) -> str: return msg @@ -239,7 +239,7 @@ async def echo(msg: str) -> str: @pytest.mark.skip(reason="L2 migration: requires mock internals — remains L1 unit test") async def test_pool_backed_team_creates_child_sessions() -> None: """Team with pool.sessions should call create_child_session for each member.""" - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model async def echo(msg: str) -> str: return msg @@ -298,7 +298,7 @@ async def echo(msg: str) -> str: async def test_team_kwargs_session_id_depth_popped() -> None: """Passing session_id/depth in kwargs should not cause duplicate keyword errors.""" - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model async def echo(msg: str) -> str: return msg @@ -324,7 +324,7 @@ async def echo(msg: str) -> str: async def test_team_run_unchanged() -> None: """Team.run() should not be affected by run_stream() changes.""" - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model async def echo(msg: str) -> str: return msg @@ -341,7 +341,7 @@ async def echo(msg: str) -> str: async def test_nested_subagent_event_session_ids_preserved() -> None: """Nested SubAgentEvent IDs should be preserved when a member is itself a Team.""" - from agentpool.utils.model_helpers import function_to_model + from wolfharness.utils.model_helpers import function_to_model async def echo(msg: str) -> str: return msg diff --git a/tests/test_acp_modality_capabilities.py b/tests/test_acp_modality_capabilities.py index fca7c0cf9..86b99b0b6 100644 --- a/tests/test_acp_modality_capabilities.py +++ b/tests/test_acp_modality_capabilities.py @@ -12,8 +12,8 @@ import pytest -from agentpool.models.model_configs import BaseModelConfig, StringModelConfig -from agentpool_config.model_capabilities import ModelCapabilities +from wolfharness.models.model_configs import BaseModelConfig, StringModelConfig +from wolfharness_config.model_capabilities import ModelCapabilities pytestmark = pytest.mark.unit diff --git a/tests/test_agent_factory_modality.py b/tests/test_agent_factory_modality.py index e393329fd..3930104a2 100644 --- a/tests/test_agent_factory_modality.py +++ b/tests/test_agent_factory_modality.py @@ -14,20 +14,20 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool.agents.native_agent.agent import ( +from wolfharness.agents.native_agent.agent import ( Agent, _intersect_capabilities, _model_config_names, ) -from agentpool.capabilities.modality_filter import ModalityFilterCapability -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.model_configs import ( +from wolfharness.capabilities.modality_filter import ModalityFilterCapability +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.model_configs import ( FallbackModelConfig, OpenAIModelConfig, StringModelConfig, TestModelConfig as _TestModelConfig, ) -from agentpool_config.model_capabilities import ModelCapabilities +from wolfharness_config.model_capabilities import ModelCapabilities pytestmark = [pytest.mark.unit] @@ -305,7 +305,7 @@ async def test_resolve_capabilities_called_for_string_model() -> None: # Mock resolve_capabilities to avoid real tokonomics calls. mock_caps = _text_only_caps() with patch( - "agentpool.host.stubs.resolve_capabilities", + "wolfharness.host.stubs.resolve_capabilities", new_callable=AsyncMock, return_value=mock_caps, ) as mock_resolve: @@ -332,7 +332,7 @@ async def test_fallback_model_does_not_call_resolve_per_sub_model() -> None: agent = Agent(name="test", model="test", agent_config=config) with patch( - "agentpool.host.stubs.resolve_capabilities", + "wolfharness.host.stubs.resolve_capabilities", new_callable=AsyncMock, ) as mock_resolve: await agent.get_agentlet(model=None, output_type=str) @@ -366,7 +366,7 @@ async def test_fallback_model_user_filter_gets_declared_caps() -> None: ) with patch( - "agentpool.host.stubs.resolve_capabilities", + "wolfharness.host.stubs.resolve_capabilities", new_callable=AsyncMock, ): pydantic_agent = await agent.get_agentlet(model=None, output_type=str) @@ -398,7 +398,7 @@ async def test_agent_creation_no_tokonomics_query_for_custom_model() -> None: agent = Agent(name="test", model="test", agent_config=config) with patch( - "agentpool.host.stubs.CapabilityCache.get_capability", + "wolfharness.host.stubs.CapabilityCache.get_capability", new_callable=AsyncMock, ) as mock_get: pydantic_agent = await agent.get_agentlet(model=None, output_type=str) @@ -416,7 +416,7 @@ async def test_agent_creation_no_tokonomics_query_for_custom_model() -> None: @pytest.mark.integration async def test_agent_creation_uses_cached_values() -> None: """Agent creation should use cached capability values when available.""" - from agentpool.host.stubs import _get_default_cache + from wolfharness.host.stubs import _get_default_cache cache = _get_default_cache() # Pre-populate cache for the model. diff --git a/tests/test_capability_cache.py b/tests/test_capability_cache.py index 1d0a0d501..2275c5aaf 100644 --- a/tests/test_capability_cache.py +++ b/tests/test_capability_cache.py @@ -11,8 +11,8 @@ import pytest -from agentpool.host.stubs import CapabilityCache, resolve_capabilities -from agentpool_config.model_capabilities import ModelCapabilities +from wolfharness.host.stubs import CapabilityCache, resolve_capabilities +from wolfharness_config.model_capabilities import ModelCapabilities pytestmark = pytest.mark.unit diff --git a/tests/test_config/test_package_skill_scopes.py b/tests/test_config/test_package_skill_scopes.py index bb463ecc6..30d7fb6d8 100644 --- a/tests/test_config/test_package_skill_scopes.py +++ b/tests/test_config/test_package_skill_scopes.py @@ -3,14 +3,14 @@ import pytest import yaml -from agentpool_config import resolution +from wolfharness_config import resolution pytestmark = pytest.mark.unit def test_include_package_records_package_skill_scopes(tmp_path, monkeypatch): - config_path = tmp_path / "agentpool.yaml" + config_path = tmp_path / "wolfharness.yaml" config_path.write_text( yaml.safe_dump( { diff --git a/tests/test_event_bus_conditional_replay.py b/tests/test_event_bus_conditional_replay.py index 4bc08b5e7..fda36bf05 100644 --- a/tests/test_event_bus_conditional_replay.py +++ b/tests/test_event_bus_conditional_replay.py @@ -15,11 +15,11 @@ from pydantic_ai import TextPartDelta import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( PartDeltaEvent, RunStartedEvent, ) -from agentpool.orchestrator.core import ( +from wolfharness.orchestrator.core import ( EventBus, drain_and_merge, ) diff --git a/tests/test_event_bus_mechanics.py b/tests/test_event_bus_mechanics.py index 6c36d1b30..50ae94f32 100644 --- a/tests/test_event_bus_mechanics.py +++ b/tests/test_event_bus_mechanics.py @@ -18,11 +18,11 @@ import pytest -from agentpool.agents.events import RunStartedEvent, StateUpdate -from agentpool.lifecycle.comm_channel import ProtocolChannel -from agentpool.lifecycle.journal import MemoryJournal -from agentpool.lifecycle.types import RunState -from agentpool.orchestrator.event_bus import EventBus, EventEnvelope, OverflowPolicy +from wolfharness.agents.events import RunStartedEvent, StateUpdate +from wolfharness.lifecycle.comm_channel import ProtocolChannel +from wolfharness.lifecycle.journal import MemoryJournal +from wolfharness.lifecycle.types import RunState +from wolfharness.orchestrator.event_bus import EventBus, EventEnvelope, OverflowPolicy pytestmark = [pytest.mark.unit, pytest.mark.anyio] diff --git a/tests/test_modality_e2e.py b/tests/test_modality_e2e.py index 9f6ed30e8..0c0e90773 100644 --- a/tests/test_modality_e2e.py +++ b/tests/test_modality_e2e.py @@ -22,14 +22,14 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool.agents.native_agent.agent import Agent -from agentpool.capabilities.modality_filter import ModalityFilterCapability -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.model_configs import ( +from wolfharness.agents.native_agent.agent import Agent +from wolfharness.capabilities.modality_filter import ModalityFilterCapability +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.model_configs import ( FallbackModelConfig, TestModelConfig as _TestModelConfig, ) -from agentpool_config.model_capabilities import ModelCapabilities +from wolfharness_config.model_capabilities import ModelCapabilities pytestmark = [pytest.mark.integration] @@ -387,7 +387,7 @@ async def test_acp_agent_image_input_false_advertises_false() -> None: # The ACP agent derives image_prompts from # model_config.capabilities.image_input. We test this logic directly # by simulating the derivation that occurs in initialize(). - from agentpool.models.model_configs import BaseModelConfig + from wolfharness.models.model_configs import BaseModelConfig model_config = _TestModelConfig(capabilities=_text_only_caps()) assert isinstance(model_config, BaseModelConfig) diff --git a/tests/test_modality_filter.py b/tests/test_modality_filter.py index 988d518ea..de052647e 100644 --- a/tests/test_modality_filter.py +++ b/tests/test_modality_filter.py @@ -19,8 +19,8 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool.capabilities.modality_filter import ModalityFilterCapability -from agentpool_config.model_capabilities import ModelCapabilities +from wolfharness.capabilities.modality_filter import ModalityFilterCapability +from wolfharness_config.model_capabilities import ModelCapabilities pytestmark = pytest.mark.unit @@ -540,8 +540,8 @@ def test_get_ordering_wrapped_by_budget_and_dcp() -> None: assert ordering is not None assert isinstance(ordering, CapabilityOrdering) # wrapped_by means those capabilities are OUTER, self is INNER. - from agentpool.capabilities.dcp.capability import DynamicContextPruningCapability - from agentpool.capabilities.tool_output_budget import ToolOutputBudgetCapability + from wolfharness.capabilities.dcp.capability import DynamicContextPruningCapability + from wolfharness.capabilities.tool_output_budget import ToolOutputBudgetCapability assert ToolOutputBudgetCapability in ordering.wrapped_by assert DynamicContextPruningCapability in ordering.wrapped_by diff --git a/tests/test_modality_filter_config.py b/tests/test_modality_filter_config.py index 6bca8c54a..050e76215 100644 --- a/tests/test_modality_filter_config.py +++ b/tests/test_modality_filter_config.py @@ -15,7 +15,7 @@ from pydantic import TypeAdapter, ValidationError import pytest -from agentpool_config.capabilities import ( +from wolfharness_config.capabilities import ( KNOWN_CAPABILITY_TYPES, BuiltinCapabilityConfig, ModalityFilterCapabilityConfig, @@ -54,7 +54,7 @@ def test_build_capability_returns_modality_filter() -> None: """``build_capability()`` returns a ``ModalityFilterCapability`` instance.""" config = ModalityFilterCapabilityConfig() capability = build_capability(config) - from agentpool.capabilities.modality_filter import ModalityFilterCapability + from wolfharness.capabilities.modality_filter import ModalityFilterCapability assert isinstance(capability, ModalityFilterCapability) diff --git a/tests/test_modality_utils.py b/tests/test_modality_utils.py index 80eb08b74..9abee3495 100644 --- a/tests/test_modality_utils.py +++ b/tests/test_modality_utils.py @@ -12,7 +12,7 @@ ) import pytest -from agentpool.capabilities.modality_utils import ( +from wolfharness.capabilities.modality_utils import ( classify_binary_content, describe_multimodal_content, ) diff --git a/tests/test_model_capabilities.py b/tests/test_model_capabilities.py index 3e7e570fb..8120a0e60 100644 --- a/tests/test_model_capabilities.py +++ b/tests/test_model_capabilities.py @@ -4,7 +4,7 @@ import pytest -from agentpool.models.model_configs import ( +from wolfharness.models.model_configs import ( AnthropicModelConfig, BaseModelConfig, FallbackModelConfig, @@ -16,7 +16,7 @@ StringModelConfig, TestModelConfig, ) -from agentpool_config.model_capabilities import ModelCapabilities +from wolfharness_config.model_capabilities import ModelCapabilities pytestmark = pytest.mark.unit diff --git a/tests/test_opencode_display_propagation.py b/tests/test_opencode_display_propagation.py index 6632b230d..fc348f406 100644 --- a/tests/test_opencode_display_propagation.py +++ b/tests/test_opencode_display_propagation.py @@ -4,7 +4,7 @@ import pytest -from agentpool.agents.events.events import SpawnSessionStart +from wolfharness.agents.events.events import SpawnSessionStart @pytest.mark.unit @@ -60,7 +60,7 @@ def test_spawn_session_start_display_name_set_when_differs_from_source_name() -> @pytest.mark.unit def test_agent_model_has_display_name_field() -> None: """The OpenCode Agent model should have a display_name field.""" - from agentpool_server.opencode_server.models.agent import Agent + from wolfharness_server.opencode_server.models.agent import Agent agent = Agent(name="test_agent") assert agent.display_name is None @@ -74,7 +74,7 @@ def test_ensure_session_accepts_title_parameter() -> None: """ensure_session should accept an optional title parameter.""" import inspect - from agentpool_server.opencode_server.opencode_session_routes import ensure_session + from wolfharness_server.opencode_server.opencode_session_routes import ensure_session sig = inspect.signature(ensure_session) assert "title" in sig.parameters diff --git a/tests/test_opencode_provider_modality.py b/tests/test_opencode_provider_modality.py index 007e5e10e..8ca3bcd29 100644 --- a/tests/test_opencode_provider_modality.py +++ b/tests/test_opencode_provider_modality.py @@ -7,8 +7,8 @@ import pytest from tokonomics.model_discovery.model_info import ModelInfo, ModelPricing -from agentpool_config.model_capabilities import ModelCapabilities -from agentpool_server.opencode_server.models.provider import Model +from wolfharness_config.model_capabilities import ModelCapabilities +from wolfharness_server.opencode_server.models.provider import Model pytestmark = pytest.mark.unit diff --git a/tests/test_sse_conditional_replay_integration.py b/tests/test_sse_conditional_replay_integration.py index 8e23c1cd6..0ad07ebbe 100644 --- a/tests/test_sse_conditional_replay_integration.py +++ b/tests/test_sse_conditional_replay_integration.py @@ -18,10 +18,10 @@ import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( RunStartedEvent, ) -from agentpool.orchestrator.core import ( +from wolfharness.orchestrator.core import ( EventBus, ) @@ -219,7 +219,7 @@ async def test_user_messages_display_correctly_after_restart() -> None: session_id = "sess-int-4" # Simulate a user message with text and image parts - from agentpool.agents.events.events import CustomEvent + from wolfharness.agents.events.events import CustomEvent user_msg_parts = [ {"type": "text", "text": "Hello, analyze this image"}, diff --git a/tests/tool_impls/question/test_question_for_user.py b/tests/tool_impls/question/test_question_for_user.py index ff32571eb..e0c69ecad 100644 --- a/tests/tool_impls/question/test_question_for_user.py +++ b/tests/tool_impls/question/test_question_for_user.py @@ -9,8 +9,8 @@ from pydantic_ai import ModelRetry import pytest -from agentpool.tasks.exceptions import RunAbortedError -from agentpool_toolsets.builtin.question_tools import ( +from wolfharness.tasks.exceptions import RunAbortedError +from wolfharness_toolsets.builtin.question_tools import ( Question, QuestionTools, Suggest, diff --git a/tests/tool_impls/question/test_question_tool.py b/tests/tool_impls/question/test_question_tool.py index acac4f6d1..11f7cf92a 100644 --- a/tests/tool_impls/question/test_question_tool.py +++ b/tests/tool_impls/question/test_question_tool.py @@ -18,9 +18,9 @@ from pydantic_ai import ModelRetry import pytest -from agentpool.tasks.exceptions import RunAbortedError -from agentpool.tool_impls.question.tool import QuestionTool -from agentpool.tools.base import ToolResult +from wolfharness.tasks.exceptions import RunAbortedError +from wolfharness.tool_impls.question.tool import QuestionTool +from wolfharness.tools.base import ToolResult @pytest.mark.unit diff --git a/tests/tool_impls/test_tool_impls_imports.py b/tests/tool_impls/test_tool_impls_imports.py index c7f17c291..806756c94 100644 --- a/tests/tool_impls/test_tool_impls_imports.py +++ b/tests/tool_impls/test_tool_impls_imports.py @@ -15,15 +15,15 @@ TOOL_IMPLS_MODULES = [ - "agentpool.tool_impls.agent_cli", - "agentpool.tool_impls.bash", - "agentpool.tool_impls.delete_path", - "agentpool.tool_impls.download_file", - "agentpool.tool_impls.execute_code", - "agentpool.tool_impls.grep", - "agentpool.tool_impls.list_directory", - "agentpool.tool_impls.question", - "agentpool.tool_impls.read", + "wolfharness.tool_impls.agent_cli", + "wolfharness.tool_impls.bash", + "wolfharness.tool_impls.delete_path", + "wolfharness.tool_impls.download_file", + "wolfharness.tool_impls.execute_code", + "wolfharness.tool_impls.grep", + "wolfharness.tool_impls.list_directory", + "wolfharness.tool_impls.question", + "wolfharness.tool_impls.read", ] diff --git a/tests/tools/test_deferred_exports.py b/tests/tools/test_deferred_exports.py index 8f3ad3834..186c66ad4 100644 --- a/tests/tools/test_deferred_exports.py +++ b/tests/tools/test_deferred_exports.py @@ -1,4 +1,4 @@ -"""Tests for CallDeferred and ApprovalRequired re-exports from agentpool.tools. +"""Tests for CallDeferred and ApprovalRequired re-exports from wolfharness.tools. These are pydantic-ai exception classes used by tool authors for: - CallDeferred: Signal that tool execution should be deferred. @@ -11,7 +11,7 @@ import pytest -from agentpool.tools import ApprovalRequired, CallDeferred +from wolfharness.tools import ApprovalRequired, CallDeferred pytestmark = pytest.mark.unit @@ -65,9 +65,9 @@ def test_approval_required_is_pydantic_ai_class(): assert ApprovalRequired is PydanticApprovalRequired -def test_both_in_agentpool_tools_all(): - """Both exceptions should be listed in agentpool.tools.__all__.""" - from agentpool import tools +def test_both_in_wolfharness_tools_all(): + """Both exceptions should be listed in wolfharness.tools.__all__.""" + from wolfharness import tools assert "CallDeferred" in tools.__all__ assert "ApprovalRequired" in tools.__all__ diff --git a/tests/tools/test_deferred_tool.py b/tests/tools/test_deferred_tool.py index d9284b88e..eec53f02b 100644 --- a/tests/tools/test_deferred_tool.py +++ b/tests/tools/test_deferred_tool.py @@ -4,7 +4,7 @@ import pytest -from agentpool.tools.base import FunctionTool, Tool +from wolfharness.tools.base import FunctionTool, Tool pytestmark = pytest.mark.unit diff --git a/tests/tools/test_deferred_validation.py b/tests/tools/test_deferred_validation.py index 69e4c37ad..3cf162b87 100644 --- a/tests/tools/test_deferred_validation.py +++ b/tests/tools/test_deferred_validation.py @@ -11,8 +11,8 @@ import pytest -from agentpool.tools.base import Tool -from agentpool.tools.exceptions import ToolError +from wolfharness.tools.base import Tool +from wolfharness.tools.exceptions import ToolError pytestmark = pytest.mark.unit diff --git a/tests/tools/test_execution_environment_tools.py b/tests/tools/test_execution_environment_tools.py index dff9c36d7..1a8479638 100644 --- a/tests/tools/test_execution_environment_tools.py +++ b/tests/tools/test_execution_environment_tools.py @@ -10,11 +10,11 @@ from exxec.models import ExecutionResult import pytest -from agentpool import Agent, AgentContext -from agentpool.agents.context import AgentRunContext -from agentpool.tool_impls.bash import BashTool -from agentpool.tool_impls.execute_code import ExecuteCodeTool -from agentpool_toolsets.builtin.execution_environment import ProcessManagementTools +from wolfharness import Agent, AgentContext +from wolfharness.agents.context import AgentRunContext +from wolfharness.tool_impls.bash import BashTool +from wolfharness.tool_impls.execute_code import ExecuteCodeTool +from wolfharness_toolsets.builtin.execution_environment import ProcessManagementTools pytestmark = pytest.mark.unit diff --git a/tests/tools/test_file_editor.py b/tests/tools/test_file_editor.py index 7558d909c..fb778aceb 100644 --- a/tests/tools/test_file_editor.py +++ b/tests/tools/test_file_editor.py @@ -6,7 +6,7 @@ import pytest -from agentpool_toolsets.builtin.file_edit.file_edit import edit_file_tool +from wolfharness_toolsets.builtin.file_edit.file_edit import edit_file_tool pytestmark = pytest.mark.unit diff --git a/tests/tools/test_mcp_tools.py b/tests/tools/test_mcp_tools.py index ed4dd3228..461782803 100644 --- a/tests/tools/test_mcp_tools.py +++ b/tests/tools/test_mcp_tools.py @@ -5,7 +5,7 @@ from pydantic_ai import FunctionToolCallEvent import pytest -from agentpool import Agent +from wolfharness import Agent pytestmark = pytest.mark.unit diff --git a/tests/tools/test_openapi_toolsets.py b/tests/tools/test_openapi_toolsets.py index 5970c9f15..534875ffe 100644 --- a/tests/tools/test_openapi_toolsets.py +++ b/tests/tools/test_openapi_toolsets.py @@ -7,7 +7,7 @@ from openapi_spec_validator import validate import pytest -from agentpool_toolsets.openapi import OpenAPITools +from wolfharness_toolsets.openapi import OpenAPITools pytestmark = pytest.mark.unit diff --git a/tests/tools/test_pick.py b/tests/tools/test_pick.py index e025dcbc7..03fa135cd 100644 --- a/tests/tools/test_pick.py +++ b/tests/tools/test_pick.py @@ -2,7 +2,7 @@ import pytest -from agentpool import Agent +from wolfharness import Agent # All tests in this file create real Agent instances that need OPENAI_API_KEY. diff --git a/tests/tools/test_pydantic_ai_schema.py b/tests/tools/test_pydantic_ai_schema.py index 7d43e4b4b..ad175213d 100644 --- a/tests/tools/test_pydantic_ai_schema.py +++ b/tests/tools/test_pydantic_ai_schema.py @@ -5,7 +5,7 @@ import pytest from schemez import OpenAIFunctionDefinition -from agentpool.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability pytestmark = pytest.mark.unit diff --git a/tests/tools/test_runcontext.py b/tests/tools/test_runcontext.py index 6169a9fe3..ae57876ac 100644 --- a/tests/tools/test_runcontext.py +++ b/tests/tools/test_runcontext.py @@ -6,11 +6,11 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, AgentContext -from agentpool.delegation import AgentPool -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest -from agentpool_config.toolsets import SubagentToolsetConfig +from wolfharness import Agent, AgentContext +from wolfharness.delegation import AgentPool +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest +from wolfharness_config.toolsets import SubagentToolsetConfig async def run_ctx_tool(ctx: RunContext) -> str: diff --git a/tests/tools/test_tool_confirmation.py b/tests/tools/test_tool_confirmation.py index 81e067b30..170c21a23 100644 --- a/tests/tools/test_tool_confirmation.py +++ b/tests/tools/test_tool_confirmation.py @@ -3,8 +3,8 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, Tool -from agentpool.ui.mock_provider import MockInputProvider +from wolfharness import Agent, Tool +from wolfharness.ui.mock_provider import MockInputProvider pytestmark = pytest.mark.unit diff --git a/tests/tools/test_tool_schema.py b/tests/tools/test_tool_schema.py index 463bb4310..2f24669d0 100644 --- a/tests/tools/test_tool_schema.py +++ b/tests/tools/test_tool_schema.py @@ -20,15 +20,15 @@ import pytest from schemez import OpenAIFunctionDefinition -from agentpool.log import configure_logging -from agentpool.tools.base import FunctionTool, Tool +from wolfharness.log import configure_logging +from wolfharness.tools.base import FunctionTool, Tool pytestmark = pytest.mark.unit if TYPE_CHECKING: - from agentpool.agents.context import AgentContext + from wolfharness.agents.context import AgentContext @pytest.fixture(autouse=True) @@ -976,7 +976,7 @@ def test_get_json_schema_no_toolresult_return_warning_with_schema_override() -> """Dataclass ToolResult return + schema_override must not emit return-schema UserWarnings.""" import warnings - from agentpool.tools.base import FunctionTool, ToolResult + from wolfharness.tools.base import FunctionTool, ToolResult def returns_tool_result(x: int) -> ToolResult: return ToolResult(content=str(x)) diff --git a/tests/tools/test_workers.py b/tests/tools/test_workers.py index 9814c9a98..6be1c8137 100644 --- a/tests/tools/test_workers.py +++ b/tests/tools/test_workers.py @@ -9,9 +9,9 @@ from pydantic_ai.models.test import TestModel import pytest -from agentpool import Agent, AgentPool, AgentsManifest -from agentpool.agents.events import RunErrorEvent, SpawnSessionStart, StreamCompleteEvent -from agentpool.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError +from wolfharness import Agent, AgentPool, AgentsManifest +from wolfharness.agents.events import RunErrorEvent, SpawnSessionStart, StreamCompleteEvent +from wolfharness.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError pytestmark = pytest.mark.integration @@ -21,8 +21,8 @@ from collections.abc import AsyncIterator from pathlib import Path - from agentpool.agents.base_agent import BaseAgent - from agentpool.orchestrator.core import SessionPool + from wolfharness.agents.base_agent import BaseAgent + from wolfharness.orchestrator.core import SessionPool class StructuredResponse(BaseModel): @@ -189,7 +189,7 @@ async def _run_and_collect_events( This helper subscribes to the EventBus BEFORE starting the run, so all events — including spawn events — are received. """ - from agentpool.orchestrator.core import drain_and_merge + from wolfharness.orchestrator.core import drain_and_merge stream = await session_pool.event_bus.subscribe(session_id, scope=scope) diff --git a/tests/toolsets/builtin/test_as_capability.py b/tests/toolsets/builtin/test_as_capability.py index 233a17035..2bcec6541 100644 --- a/tests/toolsets/builtin/test_as_capability.py +++ b/tests/toolsets/builtin/test_as_capability.py @@ -13,8 +13,8 @@ from pydantic_ai.toolsets import AbstractToolset import pytest -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool_toolsets.builtin import ( +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness_toolsets.builtin import ( CodeTools, DebugTools, ProcessManagementTools, @@ -145,8 +145,8 @@ class TestSkillsToolsAsCapability: async def test_skill_manager_cap_exposes_load_and_list_tools(self) -> None: """SkillManagerCap toolset includes load_skill and list_skills tools.""" - from agentpool.capabilities.skill_manager_cap import SkillManagerCap - from agentpool.skills.skill import Skill + from wolfharness.capabilities.skill_manager_cap import SkillManagerCap + from wolfharness.skills.skill import Skill local_skill = Skill( name="test-skill", diff --git a/tests/toolsets/test_agentic_edit.py b/tests/toolsets/test_agentic_edit.py index 1bd99d29d..ab2e4be1a 100644 --- a/tests/toolsets/test_agentic_edit.py +++ b/tests/toolsets/test_agentic_edit.py @@ -8,8 +8,8 @@ import pytest -from agentpool import Agent -from agentpool_toolsets.fsspec_toolset import FSSpecTools +from wolfharness import Agent +from wolfharness_toolsets.fsspec_toolset import FSSpecTools if TYPE_CHECKING: diff --git a/tests/toolsets/test_builtin_handlers.py b/tests/toolsets/test_builtin_handlers.py index 889c69e3e..e8c849706 100644 --- a/tests/toolsets/test_builtin_handlers.py +++ b/tests/toolsets/test_builtin_handlers.py @@ -15,14 +15,14 @@ ) import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( RunErrorEvent, StreamCompleteEvent, ToolCallStartEvent, detailed_print_handler, simple_print_handler, ) -from agentpool.messaging import ChatMessage +from wolfharness.messaging import ChatMessage pytestmark = pytest.mark.unit diff --git a/tests/toolsets/test_custom_toolset.py b/tests/toolsets/test_custom_toolset.py index 98d1926a0..38a7888cf 100644 --- a/tests/toolsets/test_custom_toolset.py +++ b/tests/toolsets/test_custom_toolset.py @@ -6,8 +6,8 @@ import pytest -from agentpool.capabilities.function_toolset import FunctionToolsetCapability -from agentpool_config.toolsets import CustomToolsetConfig +from wolfharness.capabilities.function_toolset import FunctionToolsetCapability +from wolfharness_config.toolsets import CustomToolsetConfig pytestmark = pytest.mark.unit diff --git a/tests/toolsets/test_diff_application.py b/tests/toolsets/test_diff_application.py index 081feda03..f0de7d48c 100644 --- a/tests/toolsets/test_diff_application.py +++ b/tests/toolsets/test_diff_application.py @@ -10,7 +10,7 @@ import pytest from sublime_search import apply_diff_hunks, parse_locationless_diff -from agentpool_toolsets.fsspec_toolset.helpers import apply_diff_hunks_streaming +from wolfharness_toolsets.fsspec_toolset.helpers import apply_diff_hunks_streaming pytestmark = pytest.mark.unit diff --git a/tests/toolsets/test_input_provider_propagation.py b/tests/toolsets/test_input_provider_propagation.py index 1c9c84681..d86e81ec1 100644 --- a/tests/toolsets/test_input_provider_propagation.py +++ b/tests/toolsets/test_input_provider_propagation.py @@ -16,10 +16,10 @@ import pytest -from agentpool import AgentPool, AgentsManifest -from agentpool.agents.events import StreamCompleteEvent -from agentpool.messaging.messages import ChatMessage -from agentpool.ui.base import InputProvider +from wolfharness import AgentPool, AgentsManifest +from wolfharness.agents.events import StreamCompleteEvent +from wolfharness.messaging.messages import ChatMessage +from wolfharness.ui.base import InputProvider pytestmark = pytest.mark.integration @@ -240,10 +240,10 @@ async def test_input_provider_propagated_when_session_bound_only() -> None: ctx.get_input_provider() would return a provider via SessionState, the provider IS propagated to the child session. """ - from agentpool.agents.context import AgentContext - from agentpool.messaging.messagenode import MessageNode - from agentpool.orchestrator.core import SessionPool - from agentpool_toolsets.builtin.subagent_tools import SubagentTools + from wolfharness.agents.context import AgentContext + from wolfharness.messaging.messagenode import MessageNode + from wolfharness.orchestrator.core import SessionPool + from wolfharness_toolsets.builtin.subagent_tools import SubagentTools fake_provider = FakeInputProviderSession() diff --git a/tests/toolsets/test_mcp_discovery.py b/tests/toolsets/test_mcp_discovery.py index dcb307f6a..4c5344039 100644 --- a/tests/toolsets/test_mcp_discovery.py +++ b/tests/toolsets/test_mcp_discovery.py @@ -11,10 +11,10 @@ from pydantic_ai import RunContext import pytest -from agentpool.agents.context import AgentContext -from agentpool.mcp_server.client import MCPClient -from agentpool_config.mcp_server import StdioMCPServerConfig -from agentpool_toolsets.mcp_discovery.toolset import MCPDiscoveryToolset +from wolfharness.agents.context import AgentContext +from wolfharness.mcp_server.client import MCPClient +from wolfharness_config.mcp_server import StdioMCPServerConfig +from wolfharness_toolsets.mcp_discovery.toolset import MCPDiscoveryToolset pytestmark = [pytest.mark.asyncio, pytest.mark.unit] @@ -69,7 +69,7 @@ async def mock_sampling_callback(*args, **kwargs): with ( patch.object(toolset, "_get_server_config", return_value=mock_config), - patch("agentpool_toolsets.mcp_discovery.toolset.MCPClient") as mock_client_cls, + patch("wolfharness_toolsets.mcp_discovery.toolset.MCPClient") as mock_client_cls, ): mock_client_cls.return_value = mock_client diff --git a/tests/toolsets/test_notifications.py b/tests/toolsets/test_notifications.py index 54f8ded2f..4fd1ca5ba 100644 --- a/tests/toolsets/test_notifications.py +++ b/tests/toolsets/test_notifications.py @@ -7,8 +7,8 @@ import pytest -from agentpool_config.toolsets import NotificationsToolsetConfig -from agentpool_toolsets.notifications import NotificationsTools +from wolfharness_config.toolsets import NotificationsToolsetConfig +from wolfharness_toolsets.notifications import NotificationsTools pytestmark = pytest.mark.unit diff --git a/tests/toolsets/test_package_scoped_skills.py b/tests/toolsets/test_package_scoped_skills.py index ec53ec3fd..62c91b6fb 100644 --- a/tests/toolsets/test_package_scoped_skills.py +++ b/tests/toolsets/test_package_scoped_skills.py @@ -7,10 +7,10 @@ import pytest from upathtools import UPath -from agentpool.capabilities.resource_protocols import SkillEntry, SkillResource -from agentpool.capabilities.skill_manager_cap import SkillManagerCap -from agentpool.skills.skill import Skill -from agentpool_toolsets.builtin.skills import list_skills, load_skill, load_skill_for_node +from wolfharness.capabilities.resource_protocols import SkillEntry, SkillResource +from wolfharness.capabilities.skill_manager_cap import SkillManagerCap +from wolfharness.skills.skill import Skill +from wolfharness_toolsets.builtin.skills import list_skills, load_skill, load_skill_for_node def _write_skill(root, name: str, description: str) -> Skill: @@ -77,7 +77,7 @@ def is_skill_visible_to_node(self, skill: Skill, node_name: str | None) -> bool: def _ctx(pool: _FakePool, node_name: str) -> Any: """Build a RuntimeAgentContext (AgentContext) deps with pool + node name.""" - from agentpool.agents.context import AgentContext as RuntimeAgentContext + from wolfharness.agents.context import AgentContext as RuntimeAgentContext node = SimpleNamespace(name=node_name) return RuntimeAgentContext(node=node, pool=pool) diff --git a/tests/toolsets/test_process_integration.py b/tests/toolsets/test_process_integration.py index 3d8628ca7..48902a4c5 100644 --- a/tests/toolsets/test_process_integration.py +++ b/tests/toolsets/test_process_integration.py @@ -6,10 +6,10 @@ import pytest -from agentpool.delegation.pool import AgentPool -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest -from agentpool_config.toolsets import ( +from wolfharness.delegation.pool import AgentPool +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest +from wolfharness_config.toolsets import ( FSSpecToolsetConfig, ProcessManagementToolsetConfig, ) diff --git a/tests/toolsets/test_subagent_async.py b/tests/toolsets/test_subagent_async.py index ffdf0dcd7..51f4d822d 100644 --- a/tests/toolsets/test_subagent_async.py +++ b/tests/toolsets/test_subagent_async.py @@ -4,7 +4,7 @@ import pytest -from agentpool import AgentPool, AgentsManifest +from wolfharness import AgentPool, AgentsManifest pytestmark = pytest.mark.integration diff --git a/tests/toolsets/test_subagent_child_session.py b/tests/toolsets/test_subagent_child_session.py index 9f14cd688..1b46d5ddd 100644 --- a/tests/toolsets/test_subagent_child_session.py +++ b/tests/toolsets/test_subagent_child_session.py @@ -20,17 +20,17 @@ import pytest -from agentpool import AgentPool, AgentsManifest -from agentpool.agents.context import AgentContext, AgentRunContext -from agentpool.agents.events import ( +from wolfharness import AgentPool, AgentsManifest +from wolfharness.agents.context import AgentContext, AgentRunContext +from wolfharness.agents.events import ( RunStartedEvent, SpawnSessionStart, SubAgentEvent, ) -from agentpool.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError -from agentpool.orchestrator.core import EventEnvelope -from agentpool_storage.memory_provider.provider import MemoryStorageProvider -from agentpool_toolsets.builtin.subagent_tools import SubagentTools +from wolfharness.agents.exceptions import MAX_DELEGATION_DEPTH, DelegationDepthError +from wolfharness.orchestrator.core import EventEnvelope +from wolfharness_storage.memory_provider.provider import MemoryStorageProvider +from wolfharness_toolsets.builtin.subagent_tools import SubagentTools pytestmark = pytest.mark.integration @@ -357,7 +357,7 @@ async def test_task_uses_run_ctx_depth() -> None: async def test_subagent_tools_does_not_import_identifiers() -> None: """subagent_tools module does not import identifier — uses create_child_session instead.""" - import agentpool_toolsets.builtin.subagent_tools as mod + import wolfharness_toolsets.builtin.subagent_tools as mod # The module should not have 'identifier' in its namespace assert not hasattr(mod, "identifier"), ( diff --git a/tests/toolsets/test_tool_filtering.py b/tests/toolsets/test_tool_filtering.py index 9f6da6e8f..bc922d2cc 100644 --- a/tests/toolsets/test_tool_filtering.py +++ b/tests/toolsets/test_tool_filtering.py @@ -4,8 +4,12 @@ import pytest -from agentpool.capabilities.filtered_toolset import FilteredToolsetCapability -from agentpool_config.toolsets import CodeToolsetConfig, SkillsToolsetConfig, SubagentToolsetConfig +from wolfharness.capabilities.filtered_toolset import FilteredToolsetCapability +from wolfharness_config.toolsets import ( + CodeToolsetConfig, + SkillsToolsetConfig, + SubagentToolsetConfig, +) pytestmark = pytest.mark.unit diff --git a/tests/unit/test_open_code_config_cleanup.py b/tests/unit/test_open_code_config_cleanup.py index b423c2729..3e4b07040 100644 --- a/tests/unit/test_open_code_config_cleanup.py +++ b/tests/unit/test_open_code_config_cleanup.py @@ -2,7 +2,7 @@ import pytest -from agentpool_config.session_pool import OpenCodeConfig +from wolfharness_config.session_pool import OpenCodeConfig pytestmark = pytest.mark.unit diff --git a/tests/utils/test_context_wrapping.py b/tests/utils/test_context_wrapping.py index 19b6d429c..dea5ec760 100644 --- a/tests/utils/test_context_wrapping.py +++ b/tests/utils/test_context_wrapping.py @@ -8,7 +8,7 @@ from pydantic_ai import RunContext import pytest -from agentpool.agents.context import AgentContext +from wolfharness.agents.context import AgentContext pytestmark = pytest.mark.unit @@ -39,7 +39,7 @@ async def test_sync_function_no_context(self): def simple() -> str: return "Be helpful" - from agentpool.utils.context_wrapping import wrap_instruction + from wolfharness.utils.context_wrapping import wrap_instruction wrapped = wrap_instruction(simple) run_ctx = self._create_mock_run_context() @@ -52,7 +52,7 @@ async def test_async_function_no_context(self): async def simple_async() -> str: return "Be helpful and async" - from agentpool.utils.context_wrapping import wrap_instruction + from wolfharness.utils.context_wrapping import wrap_instruction wrapped = wrap_instruction(simple_async) run_ctx = self._create_mock_run_context() @@ -65,7 +65,7 @@ async def test_function_with_agent_context(self): def with_agent(ctx: AgentContext) -> str: return f"Tool: {ctx.tool_name or 'none'}" - from agentpool.utils.context_wrapping import wrap_instruction + from wolfharness.utils.context_wrapping import wrap_instruction wrapped = wrap_instruction(with_agent) @@ -83,7 +83,7 @@ async def test_async_function_with_agent_context(self): async def with_agent_async(ctx: AgentContext) -> str: return f"Tool (async): {ctx.tool_name or 'none'}" - from agentpool.utils.context_wrapping import wrap_instruction + from wolfharness.utils.context_wrapping import wrap_instruction wrapped = wrap_instruction(with_agent_async) @@ -101,7 +101,7 @@ async def test_function_with_run_context(self): def with_run(ctx: RunContext) -> str: return f"RunContext: {ctx.deps or 'none'}" - from agentpool.utils.context_wrapping import wrap_instruction + from wolfharness.utils.context_wrapping import wrap_instruction wrapped = wrap_instruction(with_run) run_ctx = self._create_mock_run_context() @@ -114,7 +114,7 @@ async def test_function_with_both_contexts(self): def with_both(agent_ctx: AgentContext, run_ctx: RunContext) -> str: return f"Agent: {agent_ctx.tool_name or 'none'}, Run: {run_ctx.deps or 'none'}" - from agentpool.utils.context_wrapping import wrap_instruction + from wolfharness.utils.context_wrapping import wrap_instruction wrapped = wrap_instruction(with_both) @@ -135,7 +135,7 @@ async def test_error_handling_with_fallback(self): def error_func() -> str: raise ValueError("This should be caught") - from agentpool.utils.context_wrapping import wrap_instruction + from wolfharness.utils.context_wrapping import wrap_instruction wrapped = wrap_instruction(error_func, fallback="Fallback text") run_ctx = self._create_mock_run_context() @@ -148,7 +148,7 @@ async def test_default_fallback_empty_string(self): def error_func() -> str: raise ValueError("Error") - from agentpool.utils.context_wrapping import wrap_instruction + from wolfharness.utils.context_wrapping import wrap_instruction wrapped = wrap_instruction(error_func) # No fallback specified run_ctx = self._create_mock_run_context() @@ -161,7 +161,7 @@ async def test_wrapped_preserves_function_name(self): def named_function() -> str: return "test" - from agentpool.utils.context_wrapping import wrap_instruction + from wolfharness.utils.context_wrapping import wrap_instruction wrapped = wrap_instruction(named_function) @@ -183,7 +183,7 @@ def with_run(ctx: RunContext) -> str: def with_both(agent_ctx: AgentContext, run_ctx: RunContext) -> str: return "both" - from agentpool.utils.context_wrapping import wrap_instruction + from wolfharness.utils.context_wrapping import wrap_instruction # All should be accepted as InstructionFunc for func in [simple, with_agent, with_run, with_both]: diff --git a/tests/utils/test_dag.py b/tests/utils/test_dag.py index b19178c31..105a389ef 100644 --- a/tests/utils/test_dag.py +++ b/tests/utils/test_dag.py @@ -4,7 +4,7 @@ import pytest -from agentpool.utils.dag import DAGNode, dag_iterator, dag_to_list +from wolfharness.utils.dag import DAGNode, dag_iterator, dag_to_list pytestmark = pytest.mark.unit diff --git a/tests/utils/test_safe_args_as_dict.py b/tests/utils/test_safe_args_as_dict.py index 999e6e6c4..b765da763 100644 --- a/tests/utils/test_safe_args_as_dict.py +++ b/tests/utils/test_safe_args_as_dict.py @@ -10,7 +10,7 @@ from pydantic_ai.messages import ToolCallPart import pytest -from agentpool.utils.pydantic_ai_helpers import safe_args_as_dict +from wolfharness.utils.pydantic_ai_helpers import safe_args_as_dict pytestmark = pytest.mark.unit diff --git a/tests/utils/test_task_group.py b/tests/utils/test_task_group.py index d134aea29..e9d6f65bc 100644 --- a/tests/utils/test_task_group.py +++ b/tests/utils/test_task_group.py @@ -7,7 +7,7 @@ import anyio import pytest -from agentpool.utils.task_group import ManagedTaskGroup +from wolfharness.utils.task_group import ManagedTaskGroup pytestmark = pytest.mark.unit diff --git a/tests/utils/test_usage.py b/tests/utils/test_usage.py index 10ddd11e5..853786aac 100644 --- a/tests/utils/test_usage.py +++ b/tests/utils/test_usage.py @@ -9,7 +9,7 @@ from pydantic_ai import RunUsage import pytest -from agentpool.utils.usage import diff_usage +from wolfharness.utils.usage import diff_usage @pytest.mark.unit diff --git a/tests/vcr/_acp_helpers.py b/tests/vcr/_acp_helpers.py index e08bda337..e940ea8d0 100644 --- a/tests/vcr/_acp_helpers.py +++ b/tests/vcr/_acp_helpers.py @@ -21,13 +21,13 @@ from anyio.abc import ByteReceiveStream, ByteSendStream from acp import AgentSideConnection, ClientSideConnection, DefaultACPClient -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent if TYPE_CHECKING: from typing import Any, Protocol - from agentpool import AgentPool + from wolfharness import AgentPool class _PoolWithGetAgent(Protocol): """Protocol for a pool with the ``get_agent`` compat shim attached.""" diff --git a/tests/vcr/conftest.py b/tests/vcr/conftest.py index 564afc065..e064f3a61 100644 --- a/tests/vcr/conftest.py +++ b/tests/vcr/conftest.py @@ -19,7 +19,7 @@ import pytest import yamling -from agentpool import AgentPool, AgentsManifest +from wolfharness import AgentPool, AgentsManifest if TYPE_CHECKING: diff --git a/tests/vcr/test_acp_protocol.py b/tests/vcr/test_acp_protocol.py index d2913ccf2..a8e925163 100644 --- a/tests/vcr/test_acp_protocol.py +++ b/tests/vcr/test_acp_protocol.py @@ -39,7 +39,7 @@ if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/vcr/test_acp_subagent.py b/tests/vcr/test_acp_subagent.py index c3a59c14c..97a5efa3c 100644 --- a/tests/vcr/test_acp_subagent.py +++ b/tests/vcr/test_acp_subagent.py @@ -31,7 +31,7 @@ if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/vcr/test_acp_tool_call.py b/tests/vcr/test_acp_tool_call.py index e185ae626..4696e1d4e 100644 --- a/tests/vcr/test_acp_tool_call.py +++ b/tests/vcr/test_acp_tool_call.py @@ -31,7 +31,7 @@ if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/vcr/test_agui_protocol.py b/tests/vcr/test_agui_protocol.py index 97bec1164..383947452 100644 --- a/tests/vcr/test_agui_protocol.py +++ b/tests/vcr/test_agui_protocol.py @@ -33,14 +33,14 @@ from httpx import ASGITransport, AsyncClient import pytest -from agentpool_server.agui_server import AGUIServer from tests.vcr.conftest import cassette_exists +from wolfharness_server.agui_server import AGUIServer if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/vcr/test_delegation.py b/tests/vcr/test_delegation.py index 5b7a57103..ea9032967 100644 --- a/tests/vcr/test_delegation.py +++ b/tests/vcr/test_delegation.py @@ -19,16 +19,16 @@ import pytest -from agentpool.agents.events import ( +from tests.vcr.conftest import cassette_exists +from wolfharness.agents.events import ( SpawnSessionStart, StreamCompleteEvent, SubAgentEvent, ) -from tests.vcr.conftest import cassette_exists if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/vcr/test_event_bus_sequences.py b/tests/vcr/test_event_bus_sequences.py index e775d317f..99f698726 100644 --- a/tests/vcr/test_event_bus_sequences.py +++ b/tests/vcr/test_event_bus_sequences.py @@ -22,8 +22,8 @@ if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool.orchestrator.event_bus import EventBus + from wolfharness import AgentPool + from wolfharness.orchestrator.event_bus import EventBus pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/vcr/test_lifecycle_recovery.py b/tests/vcr/test_lifecycle_recovery.py index 77ff038c6..4f3835b60 100644 --- a/tests/vcr/test_lifecycle_recovery.py +++ b/tests/vcr/test_lifecycle_recovery.py @@ -18,12 +18,12 @@ import pytest -from agentpool.lifecycle.journal import MemoryJournal from tests.vcr.conftest import cassette_exists +from wolfharness.lifecycle.journal import MemoryJournal if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/vcr/test_native_basic.py b/tests/vcr/test_native_basic.py index 4a7f6deed..d63a76393 100644 --- a/tests/vcr/test_native_basic.py +++ b/tests/vcr/test_native_basic.py @@ -16,12 +16,12 @@ from dirty_equals import IsStr import pytest -from agentpool.agents.events import StreamCompleteEvent from tests.vcr.conftest import cassette_exists +from wolfharness.agents.events import StreamCompleteEvent if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.vcr diff --git a/tests/vcr/test_native_streaming.py b/tests/vcr/test_native_streaming.py index d5488743f..4fb5941d1 100644 --- a/tests/vcr/test_native_streaming.py +++ b/tests/vcr/test_native_streaming.py @@ -18,17 +18,17 @@ from pydantic_ai.messages import TextPart, ThinkingPart import pytest -from agentpool.agents.events import ( +from tests.vcr.conftest import cassette_exists +from wolfharness.agents.events import ( PartDeltaEvent, PartStartEvent, RunStartedEvent, StreamCompleteEvent, ) -from tests.vcr.conftest import cassette_exists if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.vcr diff --git a/tests/vcr/test_native_tool_call.py b/tests/vcr/test_native_tool_call.py index 3ad36df8c..3345a14b1 100644 --- a/tests/vcr/test_native_tool_call.py +++ b/tests/vcr/test_native_tool_call.py @@ -16,16 +16,16 @@ from dirty_equals import IsPartialDict, IsStr import pytest -from agentpool.agents.events import ( +from tests.vcr.conftest import cassette_exists +from wolfharness.agents.events import ( StreamCompleteEvent, ToolCallCompleteEvent, ToolCallStartEvent, ) -from tests.vcr.conftest import cassette_exists if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.vcr diff --git a/tests/vcr/test_openai_api_protocol.py b/tests/vcr/test_openai_api_protocol.py index 24eb3ca2b..eb9dbab9a 100644 --- a/tests/vcr/test_openai_api_protocol.py +++ b/tests/vcr/test_openai_api_protocol.py @@ -20,14 +20,14 @@ from fastapi.testclient import TestClient import pytest -from agentpool_server.openai_api_server.server import OpenAIAPIServer from tests.vcr.conftest import cassette_exists +from wolfharness_server.openai_api_server.server import OpenAIAPIServer if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/vcr/test_opencode_protocol.py b/tests/vcr/test_opencode_protocol.py index bc2d6d74e..074918635 100644 --- a/tests/vcr/test_opencode_protocol.py +++ b/tests/vcr/test_opencode_protocol.py @@ -22,19 +22,19 @@ from fastapi.testclient import TestClient import pytest -from agentpool_server.opencode_server.dependencies import get_state -from agentpool_server.opencode_server.routes import agent_router, file_router, session_router -from agentpool_server.opencode_server.routes.global_routes import router as global_router -from agentpool_server.opencode_server.routes.message_routes import router as message_router -from agentpool_server.opencode_server.state import ServerState from tests.vcr.conftest import cassette_exists +from wolfharness_server.opencode_server.dependencies import get_state +from wolfharness_server.opencode_server.routes import agent_router, file_router, session_router +from wolfharness_server.opencode_server.routes.global_routes import router as global_router +from wolfharness_server.opencode_server.routes.message_routes import router as message_router +from wolfharness_server.opencode_server.state import ServerState if TYPE_CHECKING: from collections.abc import AsyncIterator from pathlib import Path - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/vcr/test_runloop_streaming.py b/tests/vcr/test_runloop_streaming.py index 374550f4f..fe53ff654 100644 --- a/tests/vcr/test_runloop_streaming.py +++ b/tests/vcr/test_runloop_streaming.py @@ -21,7 +21,7 @@ if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/vcr/test_session_controller.py b/tests/vcr/test_session_controller.py index 4d37c734f..fcb8498ac 100644 --- a/tests/vcr/test_session_controller.py +++ b/tests/vcr/test_session_controller.py @@ -21,7 +21,7 @@ if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/vcr/test_skill_command_vcr.py b/tests/vcr/test_skill_command_vcr.py index 8d37a2075..4c138c038 100644 --- a/tests/vcr/test_skill_command_vcr.py +++ b/tests/vcr/test_skill_command_vcr.py @@ -22,17 +22,17 @@ import pytest -from agentpool.agents.events import ( +from tests.vcr.conftest import cassette_exists +from wolfharness.agents.events import ( PartStartEvent, StreamCompleteEvent, UserMessageInsertedEvent, ) -from tests.vcr.conftest import cassette_exists if TYPE_CHECKING: - from agentpool import AgentPool - from agentpool.orchestrator.event_bus import EventBus + from wolfharness import AgentPool + from wolfharness.orchestrator.event_bus import EventBus pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/vcr/test_team_mode.py b/tests/vcr/test_team_mode.py index 056b6d5ae..a343a5040 100644 --- a/tests/vcr/test_team_mode.py +++ b/tests/vcr/test_team_mode.py @@ -30,7 +30,7 @@ import pytest -from agentpool.agents.events import ( +from wolfharness.agents.events import ( PartDeltaEvent, StreamCompleteEvent, ToolCallCompleteEvent, @@ -41,7 +41,7 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = pytest.mark.vcr diff --git a/tests/vcr/test_turn_tool_calls.py b/tests/vcr/test_turn_tool_calls.py index 9be481316..03de50747 100644 --- a/tests/vcr/test_turn_tool_calls.py +++ b/tests/vcr/test_turn_tool_calls.py @@ -18,16 +18,16 @@ from dirty_equals import IsStr import pytest -from agentpool.agents.events import ( +from tests.vcr.conftest import cassette_exists +from wolfharness.agents.events import ( StreamCompleteEvent, ToolCallCompleteEvent, ToolCallStartEvent, ) -from tests.vcr.conftest import cassette_exists if TYPE_CHECKING: - from agentpool import AgentPool + from wolfharness import AgentPool pytestmark = [pytest.mark.vcr, pytest.mark.integration] diff --git a/tests/verification/test_acp_display_config.py b/tests/verification/test_acp_display_config.py index 2b81d9e25..0bd449d17 100755 --- a/tests/verification/test_acp_display_config.py +++ b/tests/verification/test_acp_display_config.py @@ -44,7 +44,7 @@ def test_config_model() -> bool: print_section("Test 1: Config Model Field") try: - from agentpool_config.pool_server import ACPPoolServerConfig + from wolfharness_config.pool_server import ACPPoolServerConfig # Test 1.1: Field accepts "zed" (new mode) config_zed = ACPPoolServerConfig(subagent_display_mode="zed") @@ -98,7 +98,7 @@ def test_default_value() -> bool: print_section("Test 2: Default Value") try: - from agentpool_config.pool_server import ACPPoolServerConfig + from wolfharness_config.pool_server import ACPPoolServerConfig # Test default value config_default = ACPPoolServerConfig() @@ -119,7 +119,7 @@ def test_cli_option() -> bool: try: # Test that help shows the option result = subprocess.run( - ["uv", "run", "agentpool", "serve-acp", "--help"], + ["uv", "run", "wolfharness", "serve-acp", "--help"], capture_output=True, text=True, timeout=30, @@ -147,10 +147,10 @@ def test_server_initialization() -> bool: print_section("Test 4: Server Initialization") try: - from agentpool import AgentPool - from agentpool.models.manifest import AgentsManifest - from agentpool_config.pool_server import ACPPoolServerConfig - from agentpool_server.acp_server.server import ACPServer + from wolfharness import AgentPool + from wolfharness.models.manifest import AgentsManifest + from wolfharness_config.pool_server import ACPPoolServerConfig + from wolfharness_server.acp_server.server import ACPServer # Create a minimal manifest manifest_dict = { @@ -220,7 +220,7 @@ def test_agent_display_mode() -> bool: from dataclasses import fields import inspect - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent # Test 5.1: AgentPoolACPAgent has subagent_display_mode field field_names = [f.name for f in fields(AgentPoolACPAgent)] @@ -262,7 +262,7 @@ def test_session_display_mode() -> bool: try: from dataclasses import fields - from agentpool_server.acp_server.session import ACPSession + from wolfharness_server.acp_server.session import ACPSession # Test 6.1: ACPSession has subagent_display_mode field field_names = [f.name for f in fields(ACPSession)] @@ -295,8 +295,8 @@ def test_end_to_end_flow() -> bool: try: from dataclasses import fields - from agentpool.models.manifest import AgentsManifest - from agentpool_server.acp_server.server import ACPServer + from wolfharness.models.manifest import AgentsManifest + from wolfharness_server.acp_server.server import ACPServer # Create minimal manifest manifest_dict = { @@ -317,7 +317,7 @@ def test_end_to_end_flow() -> bool: # Test 7.2: Verify agent has access to mode via server reference # (AgentPoolACPAgent gets subagent_display_mode from server at instantiation) - from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent + from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent # Check that AgentPoolACPAgent stores the mode sig_fields = {f.name: f for f in fields(AgentPoolACPAgent)} @@ -328,7 +328,7 @@ def test_end_to_end_flow() -> bool: # SessionManager.create_session accepts subagent_display_mode parameter import inspect - from agentpool_server.acp_server.session_manager import ACPSessionManager + from wolfharness_server.acp_server.session_manager import ACPSessionManager sig = inspect.signature(ACPSessionManager.create_session) params = sig.parameters @@ -349,7 +349,7 @@ def test_end_to_end_flow() -> bool: return False # Test 7.4: Verify ACPSession stores the mode - from agentpool_server.acp_server.session import ACPSession + from wolfharness_server.acp_server.session import ACPSession sig_fields = {f.name: f for f in fields(ACPSession)} assert "subagent_display_mode" in sig_fields diff --git a/tests/verification/test_rfc0011_lineage.py b/tests/verification/test_rfc0011_lineage.py index 8a1710c16..e133e7656 100644 --- a/tests/verification/test_rfc0011_lineage.py +++ b/tests/verification/test_rfc0011_lineage.py @@ -5,12 +5,12 @@ import pytest from sqlalchemy import select -from agentpool import Agent, AgentPool, AgentsManifest, NativeAgentConfig -from agentpool.agents.events import RunStartedEvent -from agentpool_config.storage import SQLStorageConfig, StorageConfig -from agentpool_storage.sql_provider import SQLModelProvider -from agentpool_storage.sql_provider.models import Conversation -from agentpool_toolsets.builtin.subagent_tools import SubagentTools +from wolfharness import Agent, AgentPool, AgentsManifest, NativeAgentConfig +from wolfharness.agents.events import RunStartedEvent +from wolfharness_config.storage import SQLStorageConfig, StorageConfig +from wolfharness_storage.sql_provider import SQLModelProvider +from wolfharness_storage.sql_provider.models import Conversation +from wolfharness_toolsets.builtin.subagent_tools import SubagentTools pytestmark = pytest.mark.integration @@ -123,7 +123,7 @@ async def test_subagent_event_lineage(test_pool): def test_conversation_model_defines_parent_id() -> None: """Regression: ORM must expose parent_id so log_session INSERT and DB schema stay aligned.""" - from agentpool_storage.sql_provider.models import Conversation + from wolfharness_storage.sql_provider.models import Conversation assert "parent_id" in Conversation.model_fields diff --git a/tests/agentpool_server/acp_server/__init__.py b/tests/wolfharness_server/acp_server/__init__.py similarity index 100% rename from tests/agentpool_server/acp_server/__init__.py rename to tests/wolfharness_server/acp_server/__init__.py diff --git a/tests/agentpool_server/acp_server/test_acp_mcp_end_to_end.py b/tests/wolfharness_server/acp_server/test_acp_mcp_end_to_end.py similarity index 98% rename from tests/agentpool_server/acp_server/test_acp_mcp_end_to_end.py rename to tests/wolfharness_server/acp_server/test_acp_mcp_end_to_end.py index b4018ee97..5f47ca164 100644 --- a/tests/agentpool_server/acp_server/test_acp_mcp_end_to_end.py +++ b/tests/wolfharness_server/acp_server/test_acp_mcp_end_to_end.py @@ -11,11 +11,11 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool_server.acp_server.acp_mcp_manager import ( +from wolfharness_server.acp_server.acp_mcp_manager import ( AcpMcpConnection, AcpMcpConnectionManager, ) -from agentpool_server.acp_server.acp_mcp_transport import AcpMcpTransport +from wolfharness_server.acp_server.acp_mcp_transport import AcpMcpTransport pytestmark = [pytest.mark.unit, pytest.mark.anyio] diff --git a/tests/agentpool_server/acp_server/test_acp_mcp_fastmcp_integration.py b/tests/wolfharness_server/acp_server/test_acp_mcp_fastmcp_integration.py similarity index 98% rename from tests/agentpool_server/acp_server/test_acp_mcp_fastmcp_integration.py rename to tests/wolfharness_server/acp_server/test_acp_mcp_fastmcp_integration.py index a2fc78ca4..bb5dd5645 100644 --- a/tests/agentpool_server/acp_server/test_acp_mcp_fastmcp_integration.py +++ b/tests/wolfharness_server/acp_server/test_acp_mcp_fastmcp_integration.py @@ -38,11 +38,11 @@ from acp.exceptions import RequestError from acp.schema.mcp import AcpMcpServer -from agentpool import Agent -from agentpool.delegation import AgentPool -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent -from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnection -from agentpool_server.acp_server.acp_mcp_transport import AcpMcpTransport +from wolfharness import Agent +from wolfharness.delegation import AgentPool +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnection +from wolfharness_server.acp_server.acp_mcp_transport import AcpMcpTransport if TYPE_CHECKING: @@ -66,8 +66,8 @@ def mock_connection(): @pytest.fixture def default_test_agent() -> Agent: """Create a simple test agent with a pool.""" - from agentpool.models.agents import NativeAgentConfig - from agentpool.models.manifest import AgentsManifest + from wolfharness.models.agents import NativeAgentConfig + from wolfharness.models.manifest import AgentsManifest def simple_callback(message: str) -> str: return f"Test response: {message}" diff --git a/tests/agentpool_server/acp_server/test_acp_mcp_manager.py b/tests/wolfharness_server/acp_server/test_acp_mcp_manager.py similarity index 99% rename from tests/agentpool_server/acp_server/test_acp_mcp_manager.py rename to tests/wolfharness_server/acp_server/test_acp_mcp_manager.py index a1d9f42bd..ca8fb72b2 100644 --- a/tests/agentpool_server/acp_server/test_acp_mcp_manager.py +++ b/tests/wolfharness_server/acp_server/test_acp_mcp_manager.py @@ -8,7 +8,7 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool_server.acp_server.acp_mcp_manager import ( +from wolfharness_server.acp_server.acp_mcp_manager import ( AcpMcpConnection, AcpMcpConnectionManager, ) diff --git a/tests/agentpool_server/acp_server/test_acp_mcp_red_flags.py b/tests/wolfharness_server/acp_server/test_acp_mcp_red_flags.py similarity index 96% rename from tests/agentpool_server/acp_server/test_acp_mcp_red_flags.py rename to tests/wolfharness_server/acp_server/test_acp_mcp_red_flags.py index 55c26bd4f..643117840 100644 --- a/tests/agentpool_server/acp_server/test_acp_mcp_red_flags.py +++ b/tests/wolfharness_server/acp_server/test_acp_mcp_red_flags.py @@ -13,12 +13,12 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool import Agent -from agentpool.delegation import AgentPool -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent -from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnection +from wolfharness import Agent +from wolfharness.delegation import AgentPool +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnection pytestmark = [pytest.mark.unit, pytest.mark.anyio] diff --git a/tests/agentpool_server/acp_server/test_acp_mcp_session_cleanup.py b/tests/wolfharness_server/acp_server/test_acp_mcp_session_cleanup.py similarity index 95% rename from tests/agentpool_server/acp_server/test_acp_mcp_session_cleanup.py rename to tests/wolfharness_server/acp_server/test_acp_mcp_session_cleanup.py index eaa367e82..2f5b5c416 100644 --- a/tests/agentpool_server/acp_server/test_acp_mcp_session_cleanup.py +++ b/tests/wolfharness_server/acp_server/test_acp_mcp_session_cleanup.py @@ -12,12 +12,12 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool import Agent -from agentpool.delegation import AgentPool -from agentpool.models.agents import NativeAgentConfig -from agentpool.models.manifest import AgentsManifest -from agentpool_server.acp_server.acp_agent import AgentPoolACPAgent -from agentpool_server.acp_server.acp_mcp_manager import ( +from wolfharness import Agent +from wolfharness.delegation import AgentPool +from wolfharness.models.agents import NativeAgentConfig +from wolfharness.models.manifest import AgentsManifest +from wolfharness_server.acp_server.acp_agent import AgentPoolACPAgent +from wolfharness_server.acp_server.acp_mcp_manager import ( AcpMcpConnection, AcpMcpConnectionManager, ) diff --git a/tests/agentpool_server/acp_server/test_acp_mcp_transport.py b/tests/wolfharness_server/acp_server/test_acp_mcp_transport.py similarity index 98% rename from tests/agentpool_server/acp_server/test_acp_mcp_transport.py rename to tests/wolfharness_server/acp_server/test_acp_mcp_transport.py index a888c1c21..36cb132a3 100644 --- a/tests/agentpool_server/acp_server/test_acp_mcp_transport.py +++ b/tests/wolfharness_server/acp_server/test_acp_mcp_transport.py @@ -3,8 +3,8 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnection -from agentpool_server.acp_server.acp_mcp_transport import AcpMcpTransport +from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnection +from wolfharness_server.acp_server.acp_mcp_transport import AcpMcpTransport pytestmark = pytest.mark.integration diff --git a/tests/agentpool_server/acp_server/test_e2e_session_lifecycle.py b/tests/wolfharness_server/acp_server/test_e2e_session_lifecycle.py similarity index 97% rename from tests/agentpool_server/acp_server/test_e2e_session_lifecycle.py rename to tests/wolfharness_server/acp_server/test_e2e_session_lifecycle.py index 4850f657f..0d937d324 100644 --- a/tests/agentpool_server/acp_server/test_e2e_session_lifecycle.py +++ b/tests/wolfharness_server/acp_server/test_e2e_session_lifecycle.py @@ -30,9 +30,9 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool.mcp_server.config_snapshot import McpConfigSnapshot -from agentpool.mcp_server.manager import MCPManager -from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager +from wolfharness.mcp_server.config_snapshot import McpConfigSnapshot +from wolfharness.mcp_server.manager import MCPManager +from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager class _FakeTransport: diff --git a/tests/agentpool_server/acp_server/test_resume_active_run.py b/tests/wolfharness_server/acp_server/test_resume_active_run.py similarity index 92% rename from tests/agentpool_server/acp_server/test_resume_active_run.py rename to tests/wolfharness_server/acp_server/test_resume_active_run.py index e9ec6e179..69b417d6b 100644 --- a/tests/agentpool_server/acp_server/test_resume_active_run.py +++ b/tests/wolfharness_server/acp_server/test_resume_active_run.py @@ -15,9 +15,9 @@ import pytest -from agentpool.lifecycle import RunState -from agentpool.orchestrator.run import RunHandle -from agentpool.orchestrator.session_controller import SessionController, SessionState +from wolfharness.lifecycle import RunState +from wolfharness.orchestrator.run import RunHandle +from wolfharness.orchestrator.session_controller import SessionController, SessionState @pytest.mark.integration diff --git a/tests/agentpool_server/acp_server/test_resume_reconnect.py b/tests/wolfharness_server/acp_server/test_resume_reconnect.py similarity index 98% rename from tests/agentpool_server/acp_server/test_resume_reconnect.py rename to tests/wolfharness_server/acp_server/test_resume_reconnect.py index 4e283f26c..ae2cce7e3 100644 --- a/tests/agentpool_server/acp_server/test_resume_reconnect.py +++ b/tests/wolfharness_server/acp_server/test_resume_reconnect.py @@ -25,8 +25,8 @@ import pytest from acp.schema.mcp import AcpMcpServer -from agentpool.mcp_server.manager import MCPManager -from agentpool_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager +from wolfharness.mcp_server.manager import MCPManager +from wolfharness_server.acp_server.acp_mcp_manager import AcpMcpConnectionManager class _FakeTransport: diff --git a/tests/agentpool_server/acp_server/test_resume_session_lifecycle.py b/tests/wolfharness_server/acp_server/test_resume_session_lifecycle.py similarity index 95% rename from tests/agentpool_server/acp_server/test_resume_session_lifecycle.py rename to tests/wolfharness_server/acp_server/test_resume_session_lifecycle.py index 77ab61461..129428b74 100644 --- a/tests/agentpool_server/acp_server/test_resume_session_lifecycle.py +++ b/tests/wolfharness_server/acp_server/test_resume_session_lifecycle.py @@ -12,9 +12,9 @@ import pytest -from agentpool.mcp_server.manager import MCPManager -from agentpool.sessions import SessionData -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness.mcp_server.manager import MCPManager +from wolfharness.sessions import SessionData +from wolfharness_server.acp_server.session_manager import ACPSessionManager @pytest.mark.integration @@ -97,7 +97,7 @@ async def mock_old_close() -> None: try: with patch( - "agentpool_server.acp_server.session_manager.ACPSession", + "wolfharness_server.acp_server.session_manager.ACPSession", return_value=mock_new_session, ): result = await acp_manager.resume_session( diff --git a/tests/agentpool_server/acp_server/test_websocket_disconnect.py b/tests/wolfharness_server/acp_server/test_websocket_disconnect.py similarity index 98% rename from tests/agentpool_server/acp_server/test_websocket_disconnect.py rename to tests/wolfharness_server/acp_server/test_websocket_disconnect.py index 63e3facab..3303cf1c6 100644 --- a/tests/agentpool_server/acp_server/test_websocket_disconnect.py +++ b/tests/wolfharness_server/acp_server/test_websocket_disconnect.py @@ -11,7 +11,7 @@ import pytest -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness_server.acp_server.session_manager import ACPSessionManager def _make_mock_session(session_id: str) -> AsyncMock: diff --git a/tests/agentpool_server/acp_server/test_websocket_disconnect_during_run.py b/tests/wolfharness_server/acp_server/test_websocket_disconnect_during_run.py similarity index 91% rename from tests/agentpool_server/acp_server/test_websocket_disconnect_during_run.py rename to tests/wolfharness_server/acp_server/test_websocket_disconnect_during_run.py index 8fec052c6..e2ba2ea06 100644 --- a/tests/agentpool_server/acp_server/test_websocket_disconnect_during_run.py +++ b/tests/wolfharness_server/acp_server/test_websocket_disconnect_during_run.py @@ -21,10 +21,10 @@ import pytest -from agentpool.lifecycle import RunState -from agentpool.orchestrator.run import RunHandle -from agentpool.orchestrator.session_controller import SessionController, SessionState -from agentpool_server.acp_server.session_manager import ACPSessionManager +from wolfharness.lifecycle import RunState +from wolfharness.orchestrator.run import RunHandle +from wolfharness.orchestrator.session_controller import SessionController, SessionState +from wolfharness_server.acp_server.session_manager import ACPSessionManager @pytest.mark.integration diff --git a/tests/agentpool_server/shared/__init__.py b/tests/wolfharness_server/shared/__init__.py similarity index 100% rename from tests/agentpool_server/shared/__init__.py rename to tests/wolfharness_server/shared/__init__.py diff --git a/tests/agentpool_server/shared/test_model_utils.py b/tests/wolfharness_server/shared/test_model_utils.py similarity index 91% rename from tests/agentpool_server/shared/test_model_utils.py rename to tests/wolfharness_server/shared/test_model_utils.py index 667d291f3..aa9ec905b 100644 --- a/tests/agentpool_server/shared/test_model_utils.py +++ b/tests/wolfharness_server/shared/test_model_utils.py @@ -8,8 +8,8 @@ import pytest from tokonomics.model_discovery.model_info import ModelInfo, ModelPricing -from agentpool_server.opencode_server.models import ModelCost, ModelLimit -from agentpool_server.shared.model_utils import ( +from wolfharness_server.opencode_server.models import ModelCost, ModelLimit +from wolfharness_server.shared.model_utils import ( _apply_configured_variants, _build_providers_from_tokonomics, _extract_provider, @@ -72,7 +72,7 @@ class TestExtractProvider: def test_string_config_openai(self) -> None: """Extract provider from StringModelConfig with openai identifier.""" - from agentpool.models.model_configs import StringModelConfig + from wolfharness.models.model_configs import StringModelConfig config = StringModelConfig(identifier="openai:gpt-4o") result = _extract_provider(config) @@ -80,7 +80,7 @@ def test_string_config_openai(self) -> None: def test_string_config_anthropic(self) -> None: """Extract provider from StringModelConfig with anthropic identifier.""" - from agentpool.models.model_configs import StringModelConfig + from wolfharness.models.model_configs import StringModelConfig config = StringModelConfig(identifier="anthropic:claude-sonnet-4") result = _extract_provider(config) @@ -88,7 +88,7 @@ def test_string_config_anthropic(self) -> None: def test_string_config_no_provider(self) -> None: """Return unknown for StringModelConfig without provider prefix.""" - from agentpool.models.model_configs import StringModelConfig + from wolfharness.models.model_configs import StringModelConfig config = StringModelConfig(identifier="gpt-4o") result = _extract_provider(config) @@ -96,7 +96,7 @@ def test_string_config_no_provider(self) -> None: def test_anthropic_config(self) -> None: """Return anthropic for AnthropicModelConfig.""" - from agentpool.models.model_configs import AnthropicModelConfig + from wolfharness.models.model_configs import AnthropicModelConfig config = AnthropicModelConfig(identifier="claude-opus-4-5") result = _extract_provider(config) @@ -104,7 +104,7 @@ def test_anthropic_config(self) -> None: def test_openai_config(self) -> None: """Return openai for OpenAIModelConfig.""" - from agentpool.models.model_configs import OpenAIModelConfig + from wolfharness.models.model_configs import OpenAIModelConfig config = OpenAIModelConfig(identifier="gpt-5.1-chat-latest") result = _extract_provider(config) @@ -112,7 +112,7 @@ def test_openai_config(self) -> None: def test_gemini_config(self) -> None: """Return google for GeminiModelConfig.""" - from agentpool.models.model_configs import GeminiModelConfig + from wolfharness.models.model_configs import GeminiModelConfig config = GeminiModelConfig(identifier="gemini-2.0-flash") result = _extract_provider(config) @@ -120,7 +120,7 @@ def test_gemini_config(self) -> None: def test_fallback_config_first_string(self) -> None: """Extract provider from first model in FallbackModelConfig.""" - from agentpool.models.model_configs import FallbackModelConfig, StringModelConfig + from wolfharness.models.model_configs import FallbackModelConfig, StringModelConfig config = FallbackModelConfig(models=[StringModelConfig(identifier="openai:gpt-4o")]) result = _extract_provider(config) @@ -128,7 +128,7 @@ def test_fallback_config_first_string(self) -> None: def test_fallback_config_first_anthropic(self) -> None: """Extract anthropic when first model is AnthropicModelConfig.""" - from agentpool.models.model_configs import AnthropicModelConfig, FallbackModelConfig + from wolfharness.models.model_configs import AnthropicModelConfig, FallbackModelConfig config = FallbackModelConfig(models=[AnthropicModelConfig(identifier="claude-opus-4-5")]) result = _extract_provider(config) @@ -137,7 +137,7 @@ def test_fallback_config_first_anthropic(self) -> None: def test_fallback_config_empty_models(self) -> None: """Return unknown for FallbackModelConfig with empty models list - minimum 1 required.""" # Note: FallbackModelConfig requires at least 1 model, so we test with String instead - from agentpool.models.model_configs import FallbackModelConfig + from wolfharness.models.model_configs import FallbackModelConfig # Single model fallback with unknown provider string config = FallbackModelConfig(models=["unknown-model-name"]) @@ -146,7 +146,7 @@ def test_fallback_config_empty_models(self) -> None: def test_fallback_config_nested_fallback(self) -> None: """Handle nested FallbackModelConfig.""" - from agentpool.models.model_configs import ( + from wolfharness.models.model_configs import ( AnthropicModelConfig, FallbackModelConfig, ) @@ -247,7 +247,7 @@ class TestApplyConfiguredVariants: @pytest.fixture def sample_provider(self) -> Any: """Create a sample Provider for testing.""" - from agentpool_server.opencode_server.models import Model, Provider + from wolfharness_server.opencode_server.models import Model, Provider model = Model( id="gpt-4o", @@ -387,7 +387,7 @@ class TestResolveModelInfoFromResponse: def test_variant_match(self) -> None: """Resolve raw API names to variant name and configured provider.""" - from agentpool.models.model_configs import StringModelConfig + from wolfharness.models.model_configs import StringModelConfig # get_model() canonicalizes "openai-chat" → "openai", so # _resolve_variant_identifier() returns "openai:svc/kimi-k2". @@ -399,7 +399,7 @@ def test_variant_match(self) -> None: def test_variant_match_with_explicit_provider(self) -> None: """Resolve to variant name with explicit provider field in config.""" - from agentpool.models.model_configs import StringModelConfig + from wolfharness.models.model_configs import StringModelConfig variants = { "kimi-k2": StringModelConfig( @@ -412,7 +412,7 @@ def test_variant_match_with_explicit_provider(self) -> None: def test_no_match_fallback(self) -> None: """Fall back to raw names when no variant matches.""" - from agentpool.models.model_configs import StringModelConfig + from wolfharness.models.model_configs import StringModelConfig variants = {"kimi-k2": StringModelConfig(identifier="openai-chat:svc/kimi-k2")} result = resolve_model_info_from_response("gpt-4o", "openai", variants) @@ -425,25 +425,25 @@ def test_empty_variants(self) -> None: def test_none_model_name(self) -> None: """Return ('unknown', provider_name) when model_name is None.""" - from agentpool.models.model_configs import StringModelConfig + from wolfharness.models.model_configs import StringModelConfig variants = {"kimi-k2": StringModelConfig(identifier="openai-chat:svc/kimi-k2")} result = resolve_model_info_from_response(None, "openai-chat", variants) assert result == ("unknown", "openai-chat") def test_none_provider_name(self) -> None: - """Return (model_name, 'agentpool') when provider_name is None.""" + """Return (model_name, 'wolfharness') when provider_name is None.""" result = resolve_model_info_from_response("gpt-4o", None, {}) - assert result == ("gpt-4o", "agentpool") + assert result == ("gpt-4o", "wolfharness") def test_both_none(self) -> None: - """Return ('unknown', 'agentpool') when both inputs are None.""" + """Return ('unknown', 'wolfharness') when both inputs are None.""" result = resolve_model_info_from_response(None, None, {}) - assert result == ("unknown", "agentpool") + assert result == ("unknown", "wolfharness") def test_non_string_config_variant(self) -> None: """Test matching with OpenAIModelConfig (non-StringModelConfig).""" - from agentpool.models.model_configs import OpenAIModelConfig + from wolfharness.models.model_configs import OpenAIModelConfig # OpenAIModelConfig resolves to variant_name as-is per _resolve_variant_identifier variants = {"gpt-5": OpenAIModelConfig(identifier="gpt-5.1-chat-latest")} @@ -457,7 +457,7 @@ def test_non_string_config_variant(self) -> None: def test_multiple_variants_same_identifier_first_wins(self) -> None: """First variant in dict order wins when multiple match the same identifier.""" - from agentpool.models.model_configs import StringModelConfig + from wolfharness.models.model_configs import StringModelConfig config = StringModelConfig(identifier="openai-chat:svc/kimi-k2") variants = {"first": config, "second": config} diff --git a/ty.toml b/ty.toml index 8e1714b61..b252da728 100644 --- a/ty.toml +++ b/ty.toml @@ -108,8 +108,8 @@ invalid-await = "ignore" # mock awaitable patterns # (.where(), .asc(), column comparisons). Suppress broadly. [[overrides]] include = [ - "src/agentpool_storage/sql_provider/**", - "src/agentpool/lifecycle/journal.py", + "src/wolfharness_storage/sql_provider/**", + "src/wolfharness/lifecycle/journal.py", ] [overrides.rules] @@ -117,14 +117,14 @@ invalid-argument-type = "ignore" # .where() column expressions unresolved-attribute = "ignore" # .asc() on column objects # Wrapper/decorator files: ty doesn't follow __wrapped__, __signature__, -# __agentpool_wrapped__ dynamic attributes set on wrapper functions. +# __wolfharness_wrapped__ dynamic attributes set on wrapper functions. [[overrides]] include = [ - "src/agentpool/tools/tool_wrapping.py", - "src/agentpool/utils/signatures.py", - "src/agentpool/talk/talk.py", - "src/agentpool/running/discovery.py", - "src/agentpool/mcp_server/client.py", + "src/wolfharness/tools/tool_wrapping.py", + "src/wolfharness/utils/signatures.py", + "src/wolfharness/talk/talk.py", + "src/wolfharness/running/discovery.py", + "src/wolfharness/mcp_server/client.py", ] [overrides.rules] @@ -154,8 +154,8 @@ invalid-assignment = "ignore" # content union assignment # Pydantic model fields, nor anyio Timeout constructor signatures. [[overrides]] include = [ - "src/agentpool_config/graph_translation.py", - "src/agentpool_config/mcp_server.py", + "src/wolfharness_config/graph_translation.py", + "src/wolfharness_config/mcp_server.py", ] [overrides.rules] @@ -163,7 +163,7 @@ invalid-argument-type = "ignore" # dict-spread to Pydantic, Timeout init # CLI ui: anyio's _parallel_safe attribute not recognized by ty. [[overrides]] -include = ["src/agentpool_cli/ui.py"] +include = ["src/wolfharness_cli/ui.py"] [overrides.rules] unresolved-attribute = "ignore" # _parallel_safe on anyio decorator @@ -172,8 +172,8 @@ unresolved-attribute = "ignore" # _parallel_safe on anyio decorator # the actual session/proxy type after protocol dispatch. [[overrides]] include = [ - "src/agentpool_server/acp_server/input_provider.py", - "src/agentpool_server/acp_server/session_agent_mgmt.py", + "src/wolfharness_server/acp_server/input_provider.py", + "src/wolfharness_server/acp_server/session_agent_mgmt.py", ] [overrides.rules] diff --git a/uv.lock b/uv.lock index 5bd842928..3e09a8646 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 1 requires-python = "==3.13.*" resolution-markers = [ "sys_platform == 'win32'", @@ -9,548 +9,251 @@ resolution-markers = [ [manifest] constraints = [{ name = "extism-sys", specifier = "<1.13.0" }] +[[manifest.dependency-metadata]] +name = "mknodes" +version = "2.2.14" +requires-dist = ["wolfharness", "anybadge", "anyenv[httpx]", "clinspector", "coloraide", "epregistry", "fieldz", "fsspec", "git-changelog", "githarbor", "gitpython", "griffelib", "jinja2", "jinjarope[icons]", "mkdocstrings[python]", "natsort", "pipdeptree", "pydantic", "pytest-asyncio", "python-dotenv", "setuptools", "tomli-w", "typer", "universal-pathlib", "upathtools[httpx]", "yamling", "zensical"] + [[package]] name = "ag-ui-protocol" version = "0.1.19" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a7/10/4ad299267a7d04b89935aa99eef62979758fcf95aee9f8bb5d70c35b1be1/ag_ui_protocol-0.1.19.tar.gz", hash = "sha256:43c27f60d41712dcad0e9e0a203cbdf1c8e248b22417374c5c68321c448af4ea", size = 10720, upload-time = "2026-06-02T17:26:15.627Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/10/4ad299267a7d04b89935aa99eef62979758fcf95aee9f8bb5d70c35b1be1/ag_ui_protocol-0.1.19.tar.gz", hash = "sha256:43c27f60d41712dcad0e9e0a203cbdf1c8e248b22417374c5c68321c448af4ea", size = 10720 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/0a/bcad8116eb058e4b4a305e3fc37ebd7efc879deeb86b854f1c5b8b6e97dd/ag_ui_protocol-0.1.19-py3-none-any.whl", hash = "sha256:898843b1410d378824da0c6a776486288b9c5828689d0bf563118868e37f390f", size = 13490, upload-time = "2026-06-02T17:26:16.313Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0a/bcad8116eb058e4b4a305e3fc37ebd7efc879deeb86b854f1c5b8b6e97dd/ag_ui_protocol-0.1.19-py3-none-any.whl", hash = "sha256:898843b1410d378824da0c6a776486288b9c5828689d0bf563118868e37f390f", size = 13490 }, ] [[package]] -name = "agentpool" -version = "2.9.5" -source = { editable = "." } +name = "aiofile" +version = "3.11.1" +source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ag-ui-protocol" }, - { name = "alembic" }, - { name = "anyenv", extra = ["httpx"] }, - { name = "anyio" }, - { name = "docler" }, - { name = "docstring-parser" }, - { name = "epregistry" }, - { name = "evented" }, - { name = "exxec" }, - { name = "fastapi" }, - { name = "fastmcp" }, - { name = "filelock" }, - { name = "fsspec" }, - { name = "httpx" }, - { name = "jinja2" }, - { name = "jinjarope" }, - { name = "keyring" }, - { name = "logfire", extra = ["fastapi"] }, - { name = "mcp" }, - { name = "pillow" }, - { name = "platformdirs" }, - { name = "promptantic" }, - { name = "psygnal" }, - { name = "py-key-value-aio", extra = ["disk"] }, - { name = "pydantic" }, - { name = "pydantic-ai-slim", extra = ["anthropic", "google", "mistral", "openai", "retries"] }, - { name = "pydantic-graph" }, - { name = "pydantic-xml" }, - { name = "pydocket" }, - { name = "python-dotenv" }, - { name = "rich" }, - { name = "ripgrep-rs" }, - { name = "schemez", extra = ["codegen"] }, - { name = "searchly", extra = ["all"] }, - { name = "slashed" }, - { name = "sqlalchemy", extra = ["aiosqlite"] }, - { name = "sqlmodel" }, - { name = "starlette" }, - { name = "structlog" }, - { name = "sublime-search" }, - { name = "tokonomics" }, - { name = "toprompt" }, - { name = "typer" }, - { name = "upathtools", extra = ["httpx"] }, - { name = "uvicorn", extra = ["standard"] }, - { name = "watchfiles" }, - { name = "websockets" }, - { name = "yamling" }, + { name = "caio" }, ] - -[package.optional-dependencies] -a2a = [ - { name = "fasta2a" }, - { name = "starlette" }, +sdist = { url = "https://files.pythonhosted.org/packages/48/41/2fea7e193e061ce54eacc3b7bc0e6a99e4fcff43c78cf0a76dd781ed8334/aiofile-3.11.1.tar.gz", hash = "sha256:1f91912c6643d2a4e49ca4ae3514f0bf3867ce948a36d99a6411b8f4755f4cf9", size = 19342 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/cd/0d76dfc5de72bde52f55f53e925c7d152d9c7906634ec1e0cbc7e8d4ad93/aiofile-3.11.1-py3-none-any.whl", hash = "sha256:ce77d14ac07f77bc2b757834a5c129321f3f705c474593deed5ab209079a52c9", size = 20446 }, ] -bot = [ - { name = "croniter" }, - { name = "python-telegram-bot", extra = ["socks"] }, - { name = "slack-sdk" }, - { name = "slackify-markdown" }, + +[[package]] +name = "aiohappyeyeballs" +version = "2.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/f4/eec0465c2f67b2664688d0240b3212d5196fd89e741df67ddb81f8d35658/aiohappyeyeballs-2.7.1.tar.gz", hash = "sha256:065665c041c42a5938ed220bdcd7230f22527fbec085e1853d2402c8a3615d9d", size = 24757 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/43/1947f06babed6b3f1d7f38b0c767f52df66bfb2bc10b468c4a7de9eceff2/aiohappyeyeballs-2.7.1-py3-none-any.whl", hash = "sha256:9243213661e29250eb41368e5daa826fc017156c3b8a11440826b2e3ed376472", size = 15038 }, ] -braintrust = [ - { name = "autoevals" }, - { name = "braintrust" }, + +[[package]] +name = "aiohttp" +version = "3.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, ] -clipboard = [ - { name = "copykitten" }, +sdist = { url = "https://files.pythonhosted.org/packages/58/d9/22ce5786ac0c1653ae8b6c23bded02c1686d11f0dbb45b31ce128e0df985/aiohttp-3.14.3.tar.gz", hash = "sha256:9491196535a88924a60afd5b5f434b5b203b6cc616250878dbdb223a8f7844bc", size = 7971213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/be/5afd201cc0ab139029aadb75392efe85a293403d9dd3a3226161c21ce00c/aiohttp-3.14.3-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:2e9878ae68e4a5f1c0abe4dd497dbc3d51946f5837b56759e2a02e78fa90ef86", size = 506269 }, + { url = "https://files.pythonhosted.org/packages/22/09/dec8189d62b45ade009f6792a2264b942a90cb88aeaf181239933cd72c3c/aiohttp-3.14.3-cp313-cp313-android_21_x86_64.whl", hash = "sha256:f3d2669fe7dec7fc359ecdb5984b29b50d85d5d00f8c1cb61de4f4a24ee42627", size = 515166 }, + { url = "https://files.pythonhosted.org/packages/28/24/2854869d29ed8a8b19d74f9ec6629515f7e04d02dd329d9d179201e58e47/aiohttp-3.14.3-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:cc7cb243a68167172f48c1fd43cee91ec4b1d40cefd190edd43369d1a6bc9c82", size = 486263 }, + { url = "https://files.pythonhosted.org/packages/d4/dd/57187c8be2a35aea65eaee3bd2c3dcbbcf0204f5106c89637e3610380cd1/aiohttp-3.14.3-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:78253b573e6ffab5028924fc98bc281aae05445969982a10864bc360dea2016c", size = 492299 }, + { url = "https://files.pythonhosted.org/packages/b9/11/06ae6ed8f0d414edf4068861e233d8fe23ee699bfd4b3ceb8663db948a62/aiohttp-3.14.3-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7041d52c3a7fa20c9e8c182b534704abb19502c8bdcbde7ab23bfda6f642394f", size = 502235 }, + { url = "https://files.pythonhosted.org/packages/7e/a3/559639c34a345d2cf7c52dff6838119f2eaf29eb508227b5b83f573af813/aiohttp-3.14.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ac74facc01463f138b0da5580329cfcc82818dea5656e83ddcd11268fc12ff80", size = 750883 }, + { url = "https://files.pythonhosted.org/packages/91/cd/41e131f13afd1e7b0172a9d9eda085ef90eb8439f41f0d279db81ed3ae60/aiohttp-3.14.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d6218d92e450824e9b4881f44e8c09f1853b490f9a64130801024a4793b1b3b0", size = 508473 }, + { url = "https://files.pythonhosted.org/packages/bc/6b/e7f13410d391c6e55b4c007a8de024355389d7d459e3d64c42b2d33617e5/aiohttp-3.14.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:11fb37ef075669eee52ab1928fbf6e1741fada40409fa309ebde9607a962aebf", size = 509190 }, + { url = "https://files.pythonhosted.org/packages/97/21/6464573e53d69672cc1eada3e5c5cb2d2efa82701e8305a0f2047a576967/aiohttp-3.14.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55bdcc472aafe2de4a253045cc128007a64f1e0264fb675791e132ea5edaa3bd", size = 1761478 }, + { url = "https://files.pythonhosted.org/packages/1a/81/d217043a4c17fbce360905e3b2bdd20139ebc9a2de836d035d179c4da006/aiohttp-3.14.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c39846c3aad97a8530c89d7a3869a8f8e9e3762c6ac0504481e5c80948f7e807", size = 1735092 }, + { url = "https://files.pythonhosted.org/packages/a1/66/e13a02d0eeb1a9a502402a977abb4e4abff9fe4051c26f80558c57a7c975/aiohttp-3.14.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5895ef58c4620afe02fa16044f023dc4dafec08158f9d08874a46a7dbc0341b8", size = 1800546 }, + { url = "https://files.pythonhosted.org/packages/26/5e/57d42fca1d18cb5acc1cad945d017fabc5d6ae71d8a08ad66be8dc3ee544/aiohttp-3.14.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa9467a8113aa69d3d7c55a70ef0b7c636010a40993f3df9d9d0d73b3eb7ef24", size = 1895250 }, + { url = "https://files.pythonhosted.org/packages/ca/1c/7da8d08e74d56f00070822f9638ff3f1c563f8ad87d1efa996c87bfc8644/aiohttp-3.14.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7d2deec16eeedf55f2c7cf75b521ea3856a5177e123844f8fd0f114ce252cb5", size = 1789289 }, + { url = "https://files.pythonhosted.org/packages/cd/0f/cf16bcf56896981c1a0319f5d5db9337994b5165730c48a8fa07e9b34be6/aiohttp-3.14.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dd54d0e8717de95939766febac482ac0474d8ac3b048115f9f2b1d23a16e7db4", size = 1586706 }, + { url = "https://files.pythonhosted.org/packages/fe/6f/76eac12a7f2480e1e304f842efdb07db33256b0d9165b866b6ef0806c202/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df82f3787c940c94986b34222d59c9e38843fba85139f36e85255a82ad5355a9", size = 1724652 }, + { url = "https://files.pythonhosted.org/packages/39/b6/19c8c592baeeb94b75f966547d40c02ac7590902306ec5863d5c027cf506/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:42a67efc36300d052fb4508a53e8b6901b9284b599ae63945c377569c5fcc1e1", size = 1756239 }, + { url = "https://files.pythonhosted.org/packages/dc/c9/4e9383150296f97f873b680c4de8fb2cd88608fb9f48c79edcb111611abc/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7a75aa63cbf9b21cfaf60dc2657e19df2c2867d91707d653fee171ffeedd1371", size = 1769161 }, + { url = "https://files.pythonhosted.org/packages/aa/1e/147bdc6cc5de5f3ab011be8bf5d6e786633249f22c20bae06f85e45f5387/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e92eb8acc45eb6a9f4935071a77edf5b85cc6f8dfad5cd99e97653c26593cdde", size = 1578759 }, + { url = "https://files.pythonhosted.org/packages/fd/31/78388a9d6040ece2e11df62ea229a822cf5e52d238374b220ae9975b2623/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b014a6ed7cf912e787149fdc529166d3ceabac23f26efeea3158c9aba2354e7e", size = 1792025 }, + { url = "https://files.pythonhosted.org/packages/03/51/a3d29fdf2c25d796746af8ad6fe56a45d6256c38b0a8a2ed752e1160b3a2/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3d4f72af88ac2474bb5bca640030320e3d38a0163a1d7533500e87be458eef71", size = 1768477 }, + { url = "https://files.pythonhosted.org/packages/29/a6/442e18b5afeade534d877a2dc3c3e392aff8d49787890b0cf84790410267/aiohttp-3.14.3-cp313-cp313-win32.whl", hash = "sha256:5f08ec777f35ee70720233b8b9811d3bb5d728137f30ac91b7457709c3261ac0", size = 451069 }, + { url = "https://files.pythonhosted.org/packages/9d/69/3d876ac02659f271cf7f6769f14a8e3de5b6e888ed8b5a7e998086a4cec8/aiohttp-3.14.3-cp313-cp313-win_amd64.whl", hash = "sha256:dff9461ec275f22135650d5ba4b4931a11f3958df7dfbb8db630000d4dee0883", size = 476518 }, + { url = "https://files.pythonhosted.org/packages/b2/0e/50d6e6471cd31edce8b282bdec59375a3a69124d8a989a0b1313355cae52/aiohttp-3.14.3-cp313-cp313-win_arm64.whl", hash = "sha256:ddcac3c6b382e81f1dd0499199d4136b877beb4cb5ef770bbbfba56c4b8f55d2", size = 447676 }, ] -coding = [ - { name = "ast-grep-py" }, - { name = "grep-ast" }, - { name = "rustworkx" }, - { name = "tree-sitter" }, - { name = "tree-sitter-c" }, - { name = "tree-sitter-cpp" }, - { name = "tree-sitter-go" }, - { name = "tree-sitter-javascript" }, - { name = "tree-sitter-json" }, - { name = "tree-sitter-python" }, - { name = "tree-sitter-rust" }, - { name = "tree-sitter-typescript" }, - { name = "tree-sitter-yaml" }, + +[[package]] +name = "aioimaplib" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/da/a454c47fb8522e607425e15bf1f49ccfdb3d75f4071f40b63ebd49573495/aioimaplib-2.0.1.tar.gz", hash = "sha256:5a494c3b75f220977048f5eb2c7ba9c0570a3148aaf38bee844e37e4d7af8648", size = 35555 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/52/48aaa287fb3c4c995edcb602370b10d182dc5c48371df7cb3a404356733f/aioimaplib-2.0.1-py3-none-any.whl", hash = "sha256:727e00c35cf25106bd34611dddd6e2ddf91a5f1a7e72d9269f3ce62486b31e14", size = 34729 }, ] -composio = [ - { name = "composio" }, + +[[package]] +name = "aioitertools" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/3c/53c4a17a05fb9ea2313ee1777ff53f5e001aefd5cc85aa2f4c2d982e1e38/aioitertools-0.13.0.tar.gz", hash = "sha256:620bd241acc0bbb9ec819f1ab215866871b4bbd1f73836a55f799200ee86950c", size = 19322 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/a1/510b0a7fadc6f43a6ce50152e69dbd86415240835868bb0bd9b5b88b1e06/aioitertools-0.13.0-py3-none-any.whl", hash = "sha256:0be0292b856f08dfac90e31f4739432f4cb6d7520ab9eb73e143f4f2fa5259be", size = 24182 }, ] -events = [ - { name = "evented", extra = ["all"] }, + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, ] -langfuse = [ - { name = "langfuse" }, +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490 }, ] -markitdown = [ - { name = "markitdown" }, + +[[package]] +name = "aiosqlite" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/8a/64761f4005f17809769d23e518d915db74e6310474e733e3593cfc854ef1/aiosqlite-0.22.1.tar.gz", hash = "sha256:043e0bd78d32888c0a9ca90fc788b38796843360c855a7262a532813133a0650", size = 14821 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/b7/e3bf5133d697a08128598c8d0abc5e16377b51465a33756de24fa7dee953/aiosqlite-0.22.1-py3-none-any.whl", hash = "sha256:21c002eb13823fad740196c5a2e9d8e62f6243bd9e7e4a1f87fb5e44ecb4fceb", size = 17405 }, ] -mcp-discovery = [ - { name = "fastembed" }, - { name = "lancedb" }, - { name = "pyarrow" }, + +[[package]] +name = "alembic" +version = "1.18.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mako" }, + { name = "sqlalchemy" }, + { name = "typing-extensions" }, ] -mcp-run = [ - { name = "mcpx-py" }, +sdist = { url = "https://files.pythonhosted.org/packages/1a/cc/ac0bed8e562e7407fe55c3ba85a4dce86e6dbd8730887bd1e406a6c5c18a/alembic-1.18.5.tar.gz", hash = "sha256:1554982221dd17e9a749b53902407578eb305e453f71999e8c7f0a48389fff8e", size = 2060480 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/78/5fe6dc3a3a5b2f5a2a4faef8bfe336d5fa049a38884ab3172e0098160c01/alembic-1.18.5-py3-none-any.whl", hash = "sha256:06d8ba9d04558022f5395e9317de03d270f3dced49cee01f89fe7a13c26f14bc", size = 264664 }, ] -notifications = [ - { name = "apprise" }, + +[[package]] +name = "altgraph" +version = "0.17.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/f8/97fdf103f38fed6792a1601dbc16cc8aac56e7459a9fff08c812d8ae177a/altgraph-0.17.5.tar.gz", hash = "sha256:c87b395dd12fabde9c99573a9749d67da8d29ef9de0125c7f536699b4a9bc9e7", size = 48428 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/ba/000a1996d4308bc65120167c21241a3b205464a2e0b58deda26ae8ac21d1/altgraph-0.17.5-py2.py3-none-any.whl", hash = "sha256:f3a22400bce1b0c701683820ac4f3b159cd301acab067c51c653e06961600597", size = 21228 }, ] -promptlayer = [ - { name = "promptlayer" }, + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303 }, ] -tiktoken = [ - { name = "tiktoken" }, + +[[package]] +name = "annotated-types" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", size = 13427 }, ] -tts = [ - { name = "anyvoice", extra = ["openai", "tts-edge"] }, + +[[package]] +name = "anthropic" +version = "0.119.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "docstring-parser" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "typing-extensions" }, ] -viking = [ - { name = "openviking-sdk" }, +sdist = { url = "https://files.pythonhosted.org/packages/2a/c5/f1d53b7d27b25a7f491d39c5cd9d39805be2d115d7f7431a8bf22f286afe/anthropic-0.119.0.tar.gz", hash = "sha256:40a81b094ae2a0056a77771257943b19bd46edce1326e22f85c2794492097f0a", size = 999050 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/2e/5e90df53b474e856a3ae065c0df77e62bf58cb2df8819ec850d08b82518a/anthropic-0.119.0-py3-none-any.whl", hash = "sha256:2b39107077489d19d7c66000e9d9263293d431550fcf6b543ead785c6ac85962", size = 1012756 }, ] -watchdog = [ - { name = "watchdog" }, + +[[package]] +name = "anybadge" +version = "1.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, ] -zed = [ - { name = "zstandard" }, +sdist = { url = "https://files.pythonhosted.org/packages/64/08/ddad0d5398d0961d506b0489e737a06e29a963eff0f2f0a2bb2cfb36dd1f/anybadge-1.16.0.tar.gz", hash = "sha256:f4e95eca834482f9932f9020ac2fe04a5ca863728b446324a8d35b1e67faab71", size = 34616 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/7d/01b2ac2fec808dea667b8678938156c3910219f2c45ee2e0b01e72786d72/anybadge-1.16.0-py3-none-any.whl", hash = "sha256:bc9ef2e20d875ee09237a15250a17b6fd7e67276f083d32a297963cdec179918", size = 28412 }, ] -[package.dev-dependencies] -benchmark = [ - { name = "pyinstrument" }, -] -dev = [ - { name = "check-jsonschema" }, - { name = "devtools" }, - { name = "dirty-equals" }, - { name = "fastembed" }, - { name = "import-linter" }, - { name = "inline-snapshot" }, - { name = "lancedb" }, - { name = "openapi-spec-validator" }, - { name = "pyinstaller" }, - { name = "pyreadline3" }, - { name = "pytest" }, - { name = "pytest-asyncio" }, - { name = "pytest-cov" }, - { name = "pytest-recording" }, - { name = "pytest-rerunfailures" }, - { name = "pytest-timeout" }, - { name = "pytest-xdist" }, - { name = "syrupy" }, - { name = "vcrpy" }, +[[package]] +name = "anyenv" +version = "2.0.15" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aioitertools" }, + { name = "anyio" }, + { name = "appdirs" }, + { name = "universal-pathlib" }, ] -docs = [ - { name = "beautifulsoup4" }, - { name = "json-schema-for-humans" }, - { name = "mkdocs-material" }, - { name = "mknodes" }, - { name = "zensical" }, +sdist = { url = "https://files.pythonhosted.org/packages/a1/79/470d6fc8b16172292fd27d9c5ed112fc5efd0fa6c6636c9828071c21743f/anyenv-2.0.15.tar.gz", hash = "sha256:e55d27982a42099034d1ea424f943255d61b9dcc4e073dd1b574993c4d09acae", size = 97848 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/32/d7fbc87a89fe8f1e2ab871a8cc02839e900ac440c118d2101e12e322d5eb/anyenv-2.0.15-py3-none-any.whl", hash = "sha256:eba488219d9865b0ea2bdd120f6e41c0ab33619185d8ba20a5fa28148d3c030f", size = 161016 }, ] -lint = [ - { name = "mypy", extra = ["faster-cache"] }, - { name = "ruff" }, - { name = "ty" }, - { name = "types-croniter" }, - { name = "types-jsonschema" }, - { name = "types-pygments" }, - { name = "types-pyyaml" }, -] - -[package.metadata] -requires-dist = [ - { name = "ag-ui-protocol", specifier = ">=0.1.10" }, - { name = "alembic", specifier = ">=1.16.5" }, - { name = "anyenv", extras = ["httpx"], specifier = ">=0.3.0" }, - { name = "anyio", specifier = ">=4.0" }, - { name = "anyvoice", extras = ["tts-edge", "openai"], marker = "extra == 'tts'", specifier = ">=0.0.2" }, - { name = "apprise", marker = "extra == 'notifications'", specifier = ">=1.9.5" }, - { name = "ast-grep-py", marker = "extra == 'coding'", specifier = ">=0.40.0" }, - { name = "autoevals", marker = "extra == 'braintrust'" }, - { name = "braintrust", marker = "extra == 'braintrust'" }, - { name = "composio", marker = "extra == 'composio'" }, - { name = "copykitten", marker = "extra == 'clipboard'" }, - { name = "croniter", marker = "extra == 'bot'", specifier = ">=2.0.0" }, - { name = "docler", specifier = ">=1.0.3" }, - { name = "docstring-parser", specifier = ">=0.17.0" }, - { name = "epregistry" }, - { name = "evented", specifier = ">=1.0.5" }, - { name = "evented", extras = ["all"], marker = "extra == 'events'" }, - { name = "exxec", specifier = ">=0.1.0" }, - { name = "fasta2a", marker = "extra == 'a2a'" }, - { name = "fastapi" }, - { name = "fastembed", marker = "python_full_version < '3.14' and extra == 'mcp-discovery'", specifier = ">=0.7.4" }, - { name = "fastmcp", specifier = ">=2.12.4" }, - { name = "filelock", specifier = ">=3.13" }, - { name = "fsspec" }, - { name = "grep-ast", marker = "extra == 'coding'" }, - { name = "httpx" }, - { name = "jinja2" }, - { name = "jinjarope" }, - { name = "keyring", specifier = ">=25.6.0" }, - { name = "lancedb", marker = "python_full_version < '3.14' and extra == 'mcp-discovery'", specifier = ">=0.26.0" }, - { name = "langfuse", marker = "extra == 'langfuse'" }, - { name = "logfire", extras = ["fastapi"] }, - { name = "markitdown", marker = "python_full_version < '3.14' and extra == 'markitdown'" }, - { name = "mcp", specifier = ">=1.2.0" }, - { name = "mcpx-py", marker = "extra == 'mcp-run'", specifier = ">=0.7.0" }, - { name = "openviking-sdk", marker = "extra == 'viking'", specifier = ">=0.1.0" }, - { name = "pillow", specifier = ">=11.3.0" }, - { name = "platformdirs" }, - { name = "promptantic", specifier = ">=0.4.5" }, - { name = "promptlayer", marker = "extra == 'promptlayer'" }, - { name = "psygnal", specifier = ">=0.11.1" }, - { name = "py-key-value-aio", extras = ["disk"] }, - { name = "pyarrow", marker = "python_full_version < '3.14' and extra == 'mcp-discovery'", specifier = ">=19.0.0" }, - { name = "pydantic", specifier = ">=2.10.0" }, - { name = "pydantic-ai-slim", extras = ["openai", "google", "anthropic", "mistral", "retries"], specifier = ">=2.12.0" }, - { name = "pydantic-graph", specifier = ">=2.12.0" }, - { name = "pydantic-xml", specifier = ">=2.6.0" }, - { name = "pydocket", specifier = ">=0.16.1" }, - { name = "python-dotenv", specifier = ">=1.0.1" }, - { name = "python-telegram-bot", extras = ["socks"], marker = "extra == 'bot'", specifier = ">=21.0" }, - { name = "rich" }, - { name = "ripgrep-rs", specifier = ">=0.3.0" }, - { name = "rustworkx", marker = "extra == 'coding'", specifier = ">=0.17.1" }, - { name = "schemez", extras = ["codegen"] }, - { name = "searchly", extras = ["all"], specifier = ">=2.0.1" }, - { name = "slack-sdk", marker = "extra == 'bot'", specifier = ">=3.26.0" }, - { name = "slackify-markdown", marker = "extra == 'bot'", specifier = ">=0.2.0" }, - { name = "slashed", specifier = ">=0.1.0" }, - { name = "sqlalchemy", extras = ["aiosqlite"] }, - { name = "sqlmodel", specifier = ">=0.0.22" }, - { name = "starlette", specifier = ">=0.40" }, - { name = "starlette", marker = "extra == 'a2a'" }, - { name = "structlog", specifier = ">=25.5.0" }, - { name = "sublime-search", specifier = ">=0.3.1" }, - { name = "tiktoken", marker = "extra == 'tiktoken'" }, - { name = "tokonomics", specifier = ">=0.1.2" }, - { name = "toprompt", specifier = ">=0.0.1" }, - { name = "tree-sitter", marker = "extra == 'coding'", specifier = ">=0.25.2" }, - { name = "tree-sitter-c", marker = "extra == 'coding'", specifier = ">=0.24.1" }, - { name = "tree-sitter-cpp", marker = "extra == 'coding'", specifier = ">=0.23.0" }, - { name = "tree-sitter-go", marker = "extra == 'coding'", specifier = ">=0.23.0" }, - { name = "tree-sitter-javascript", marker = "extra == 'coding'", specifier = ">=0.25.0" }, - { name = "tree-sitter-json", marker = "extra == 'coding'", specifier = ">=0.24.0" }, - { name = "tree-sitter-python", marker = "extra == 'coding'", specifier = ">=0.25.0" }, - { name = "tree-sitter-rust", marker = "extra == 'coding'", specifier = ">=0.23.0" }, - { name = "tree-sitter-typescript", marker = "extra == 'coding'", specifier = ">=0.23.0" }, - { name = "tree-sitter-yaml", marker = "extra == 'coding'", specifier = ">=0.6.0" }, - { name = "typer" }, - { name = "upathtools", extras = ["httpx"], specifier = ">=0.1.0" }, - { name = "uvicorn", extras = ["standard"] }, - { name = "watchdog", marker = "extra == 'watchdog'", specifier = ">=4.0.0" }, - { name = "watchfiles", specifier = ">=1.1.1" }, - { name = "websockets", specifier = ">=15.0" }, - { name = "yamling", specifier = ">=2.0.2" }, - { name = "zstandard", marker = "extra == 'zed'", specifier = ">=0.23.0" }, -] -provides-extras = ["a2a", "bot", "braintrust", "clipboard", "coding", "composio", "events", "langfuse", "markitdown", "mcp-discovery", "mcp-run", "notifications", "promptlayer", "tiktoken", "tts", "watchdog", "zed", "viking"] - -[package.metadata.requires-dev] -benchmark = [{ name = "pyinstrument" }] -dev = [ - { name = "check-jsonschema", specifier = ">=0.35.0" }, - { name = "devtools" }, - { name = "dirty-equals", specifier = ">=0.9.0" }, - { name = "fastembed", marker = "python_full_version < '3.14'", specifier = ">=0.7.4" }, - { name = "import-linter", specifier = ">=2.12" }, - { name = "inline-snapshot", specifier = ">=0.13.0" }, - { name = "lancedb", marker = "python_full_version < '3.14'", specifier = ">=0.26.0" }, - { name = "openapi-spec-validator" }, - { name = "pyinstaller", specifier = ">=6.17.0" }, - { name = "pyreadline3" }, - { name = "pytest" }, - { name = "pytest-asyncio", specifier = ">=0.24.0" }, - { name = "pytest-cov" }, - { name = "pytest-recording", specifier = ">=0.13.0" }, - { name = "pytest-rerunfailures", specifier = ">=16.1" }, - { name = "pytest-timeout", specifier = ">=2.4.0" }, - { name = "pytest-xdist" }, - { name = "syrupy", specifier = ">=4.0.0" }, - { name = "vcrpy", specifier = ">=7.0.0" }, -] -docs = [ - { name = "beautifulsoup4", specifier = ">=4.14.3" }, - { name = "json-schema-for-humans", specifier = ">=1.0.0" }, - { name = "mkdocs-material" }, - { name = "mknodes" }, - { name = "zensical", specifier = ">=0.0.51" }, -] -lint = [ - { name = "mypy", extras = ["faster-cache"] }, - { name = "ruff" }, - { name = "ty" }, - { name = "types-croniter" }, - { name = "types-jsonschema", specifier = ">=4.25.1.20251009" }, - { name = "types-pygments" }, - { name = "types-pyyaml" }, -] - -[[package]] -name = "aiofile" -version = "3.11.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "caio" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/41/2fea7e193e061ce54eacc3b7bc0e6a99e4fcff43c78cf0a76dd781ed8334/aiofile-3.11.1.tar.gz", hash = "sha256:1f91912c6643d2a4e49ca4ae3514f0bf3867ce948a36d99a6411b8f4755f4cf9", size = 19342, upload-time = "2026-05-16T08:18:33.538Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/cd/0d76dfc5de72bde52f55f53e925c7d152d9c7906634ec1e0cbc7e8d4ad93/aiofile-3.11.1-py3-none-any.whl", hash = "sha256:ce77d14ac07f77bc2b757834a5c129321f3f705c474593deed5ab209079a52c9", size = 20446, upload-time = "2026-05-16T08:18:32.051Z" }, -] - -[[package]] -name = "aiohappyeyeballs" -version = "2.7.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/f4/eec0465c2f67b2664688d0240b3212d5196fd89e741df67ddb81f8d35658/aiohappyeyeballs-2.7.1.tar.gz", hash = "sha256:065665c041c42a5938ed220bdcd7230f22527fbec085e1853d2402c8a3615d9d", size = 24757, upload-time = "2026-07-01T17:11:55.501Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/43/1947f06babed6b3f1d7f38b0c767f52df66bfb2bc10b468c4a7de9eceff2/aiohappyeyeballs-2.7.1-py3-none-any.whl", hash = "sha256:9243213661e29250eb41368e5daa826fc017156c3b8a11440826b2e3ed376472", size = 15038, upload-time = "2026-07-01T17:11:54.055Z" }, -] - -[[package]] -name = "aiohttp" -version = "3.14.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "aiohappyeyeballs" }, - { name = "aiosignal" }, - { name = "attrs" }, - { name = "frozenlist" }, - { name = "multidict" }, - { name = "propcache" }, - { name = "yarl" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/d9/22ce5786ac0c1653ae8b6c23bded02c1686d11f0dbb45b31ce128e0df985/aiohttp-3.14.3.tar.gz", hash = "sha256:9491196535a88924a60afd5b5f434b5b203b6cc616250878dbdb223a8f7844bc", size = 7971213, upload-time = "2026-07-23T01:57:27.037Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/be/5afd201cc0ab139029aadb75392efe85a293403d9dd3a3226161c21ce00c/aiohttp-3.14.3-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:2e9878ae68e4a5f1c0abe4dd497dbc3d51946f5837b56759e2a02e78fa90ef86", size = 506269, upload-time = "2026-07-23T01:54:49.075Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/09/dec8189d62b45ade009f6792a2264b942a90cb88aeaf181239933cd72c3c/aiohttp-3.14.3-cp313-cp313-android_21_x86_64.whl", hash = "sha256:f3d2669fe7dec7fc359ecdb5984b29b50d85d5d00f8c1cb61de4f4a24ee42627", size = 515166, upload-time = "2026-07-23T01:54:51.894Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/24/2854869d29ed8a8b19d74f9ec6629515f7e04d02dd329d9d179201e58e47/aiohttp-3.14.3-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:cc7cb243a68167172f48c1fd43cee91ec4b1d40cefd190edd43369d1a6bc9c82", size = 486263, upload-time = "2026-07-23T01:54:54.223Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/dd/57187c8be2a35aea65eaee3bd2c3dcbbcf0204f5106c89637e3610380cd1/aiohttp-3.14.3-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:78253b573e6ffab5028924fc98bc281aae05445969982a10864bc360dea2016c", size = 492299, upload-time = "2026-07-23T01:54:56.236Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b9/11/06ae6ed8f0d414edf4068861e233d8fe23ee699bfd4b3ceb8663db948a62/aiohttp-3.14.3-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7041d52c3a7fa20c9e8c182b534704abb19502c8bdcbde7ab23bfda6f642394f", size = 502235, upload-time = "2026-07-23T01:54:58.377Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/a3/559639c34a345d2cf7c52dff6838119f2eaf29eb508227b5b83f573af813/aiohttp-3.14.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ac74facc01463f138b0da5580329cfcc82818dea5656e83ddcd11268fc12ff80", size = 750883, upload-time = "2026-07-23T01:55:00.65Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/cd/41e131f13afd1e7b0172a9d9eda085ef90eb8439f41f0d279db81ed3ae60/aiohttp-3.14.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d6218d92e450824e9b4881f44e8c09f1853b490f9a64130801024a4793b1b3b0", size = 508473, upload-time = "2026-07-23T01:55:02.945Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/6b/e7f13410d391c6e55b4c007a8de024355389d7d459e3d64c42b2d33617e5/aiohttp-3.14.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:11fb37ef075669eee52ab1928fbf6e1741fada40409fa309ebde9607a962aebf", size = 509190, upload-time = "2026-07-23T01:55:05.173Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/97/21/6464573e53d69672cc1eada3e5c5cb2d2efa82701e8305a0f2047a576967/aiohttp-3.14.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55bdcc472aafe2de4a253045cc128007a64f1e0264fb675791e132ea5edaa3bd", size = 1761478, upload-time = "2026-07-23T01:55:07.383Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/81/d217043a4c17fbce360905e3b2bdd20139ebc9a2de836d035d179c4da006/aiohttp-3.14.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c39846c3aad97a8530c89d7a3869a8f8e9e3762c6ac0504481e5c80948f7e807", size = 1735092, upload-time = "2026-07-23T01:55:09.803Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/66/e13a02d0eeb1a9a502402a977abb4e4abff9fe4051c26f80558c57a7c975/aiohttp-3.14.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5895ef58c4620afe02fa16044f023dc4dafec08158f9d08874a46a7dbc0341b8", size = 1800546, upload-time = "2026-07-23T01:55:12.012Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/5e/57d42fca1d18cb5acc1cad945d017fabc5d6ae71d8a08ad66be8dc3ee544/aiohttp-3.14.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa9467a8113aa69d3d7c55a70ef0b7c636010a40993f3df9d9d0d73b3eb7ef24", size = 1895250, upload-time = "2026-07-23T01:55:14.357Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/1c/7da8d08e74d56f00070822f9638ff3f1c563f8ad87d1efa996c87bfc8644/aiohttp-3.14.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7d2deec16eeedf55f2c7cf75b521ea3856a5177e123844f8fd0f114ce252cb5", size = 1789289, upload-time = "2026-07-23T01:55:16.668Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/0f/cf16bcf56896981c1a0319f5d5db9337994b5165730c48a8fa07e9b34be6/aiohttp-3.14.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dd54d0e8717de95939766febac482ac0474d8ac3b048115f9f2b1d23a16e7db4", size = 1586706, upload-time = "2026-07-23T01:55:18.913Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/6f/76eac12a7f2480e1e304f842efdb07db33256b0d9165b866b6ef0806c202/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df82f3787c940c94986b34222d59c9e38843fba85139f36e85255a82ad5355a9", size = 1724652, upload-time = "2026-07-23T01:55:21.296Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/39/b6/19c8c592baeeb94b75f966547d40c02ac7590902306ec5863d5c027cf506/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:42a67efc36300d052fb4508a53e8b6901b9284b599ae63945c377569c5fcc1e1", size = 1756239, upload-time = "2026-07-23T01:55:23.705Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/c9/4e9383150296f97f873b680c4de8fb2cd88608fb9f48c79edcb111611abc/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7a75aa63cbf9b21cfaf60dc2657e19df2c2867d91707d653fee171ffeedd1371", size = 1769161, upload-time = "2026-07-23T01:55:26.082Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/aa/1e/147bdc6cc5de5f3ab011be8bf5d6e786633249f22c20bae06f85e45f5387/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e92eb8acc45eb6a9f4935071a77edf5b85cc6f8dfad5cd99e97653c26593cdde", size = 1578759, upload-time = "2026-07-23T01:55:28.846Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/31/78388a9d6040ece2e11df62ea229a822cf5e52d238374b220ae9975b2623/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b014a6ed7cf912e787149fdc529166d3ceabac23f26efeea3158c9aba2354e7e", size = 1792025, upload-time = "2026-07-23T01:55:31.457Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/51/a3d29fdf2c25d796746af8ad6fe56a45d6256c38b0a8a2ed752e1160b3a2/aiohttp-3.14.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3d4f72af88ac2474bb5bca640030320e3d38a0163a1d7533500e87be458eef71", size = 1768477, upload-time = "2026-07-23T01:55:33.87Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/29/a6/442e18b5afeade534d877a2dc3c3e392aff8d49787890b0cf84790410267/aiohttp-3.14.3-cp313-cp313-win32.whl", hash = "sha256:5f08ec777f35ee70720233b8b9811d3bb5d728137f30ac91b7457709c3261ac0", size = 451069, upload-time = "2026-07-23T01:55:36.121Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/69/3d876ac02659f271cf7f6769f14a8e3de5b6e888ed8b5a7e998086a4cec8/aiohttp-3.14.3-cp313-cp313-win_amd64.whl", hash = "sha256:dff9461ec275f22135650d5ba4b4931a11f3958df7dfbb8db630000d4dee0883", size = 476518, upload-time = "2026-07-23T01:55:38.303Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/0e/50d6e6471cd31edce8b282bdec59375a3a69124d8a989a0b1313355cae52/aiohttp-3.14.3-cp313-cp313-win_arm64.whl", hash = "sha256:ddcac3c6b382e81f1dd0499199d4136b877beb4cb5ef770bbbfba56c4b8f55d2", size = 447676, upload-time = "2026-07-23T01:55:40.451Z" }, -] - -[[package]] -name = "aioimaplib" -version = "2.0.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/da/a454c47fb8522e607425e15bf1f49ccfdb3d75f4071f40b63ebd49573495/aioimaplib-2.0.1.tar.gz", hash = "sha256:5a494c3b75f220977048f5eb2c7ba9c0570a3148aaf38bee844e37e4d7af8648", size = 35555, upload-time = "2025-01-16T10:38:23.14Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/52/48aaa287fb3c4c995edcb602370b10d182dc5c48371df7cb3a404356733f/aioimaplib-2.0.1-py3-none-any.whl", hash = "sha256:727e00c35cf25106bd34611dddd6e2ddf91a5f1a7e72d9269f3ce62486b31e14", size = 34729, upload-time = "2025-01-16T10:38:20.427Z" }, -] - -[[package]] -name = "aioitertools" -version = "0.13.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/3c/53c4a17a05fb9ea2313ee1777ff53f5e001aefd5cc85aa2f4c2d982e1e38/aioitertools-0.13.0.tar.gz", hash = "sha256:620bd241acc0bbb9ec819f1ab215866871b4bbd1f73836a55f799200ee86950c", size = 19322, upload-time = "2025-11-06T22:17:07.609Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/a1/510b0a7fadc6f43a6ce50152e69dbd86415240835868bb0bd9b5b88b1e06/aioitertools-0.13.0-py3-none-any.whl", hash = "sha256:0be0292b856f08dfac90e31f4739432f4cb6d7520ab9eb73e143f4f2fa5259be", size = 24182, upload-time = "2025-11-06T22:17:06.502Z" }, -] - -[[package]] -name = "aiosignal" -version = "1.4.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "frozenlist" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, -] - -[[package]] -name = "aiosqlite" -version = "0.22.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/8a/64761f4005f17809769d23e518d915db74e6310474e733e3593cfc854ef1/aiosqlite-0.22.1.tar.gz", hash = "sha256:043e0bd78d32888c0a9ca90fc788b38796843360c855a7262a532813133a0650", size = 14821, upload-time = "2025-12-23T19:25:43.997Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/b7/e3bf5133d697a08128598c8d0abc5e16377b51465a33756de24fa7dee953/aiosqlite-0.22.1-py3-none-any.whl", hash = "sha256:21c002eb13823fad740196c5a2e9d8e62f6243bd9e7e4a1f87fb5e44ecb4fceb", size = 17405, upload-time = "2025-12-23T19:25:42.139Z" }, -] - -[[package]] -name = "alembic" -version = "1.18.5" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "mako" }, - { name = "sqlalchemy" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/cc/ac0bed8e562e7407fe55c3ba85a4dce86e6dbd8730887bd1e406a6c5c18a/alembic-1.18.5.tar.gz", hash = "sha256:1554982221dd17e9a749b53902407578eb305e453f71999e8c7f0a48389fff8e", size = 2060480, upload-time = "2026-06-25T15:20:54.888Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/78/5fe6dc3a3a5b2f5a2a4faef8bfe336d5fa049a38884ab3172e0098160c01/alembic-1.18.5-py3-none-any.whl", hash = "sha256:06d8ba9d04558022f5395e9317de03d270f3dced49cee01f89fe7a13c26f14bc", size = 264664, upload-time = "2026-06-25T15:20:56.673Z" }, -] - -[[package]] -name = "altgraph" -version = "0.17.5" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/f8/97fdf103f38fed6792a1601dbc16cc8aac56e7459a9fff08c812d8ae177a/altgraph-0.17.5.tar.gz", hash = "sha256:c87b395dd12fabde9c99573a9749d67da8d29ef9de0125c7f536699b4a9bc9e7", size = 48428, upload-time = "2025-11-21T20:35:50.583Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/ba/000a1996d4308bc65120167c21241a3b205464a2e0b58deda26ae8ac21d1/altgraph-0.17.5-py2.py3-none-any.whl", hash = "sha256:f3a22400bce1b0c701683820ac4f3b159cd301acab067c51c653e06961600597", size = 21228, upload-time = "2025-11-21T20:35:49.444Z" }, -] - -[[package]] -name = "annotated-doc" -version = "0.0.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, -] - -[[package]] -name = "annotated-types" -version = "0.8.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893, upload-time = "2026-07-23T20:16:13.995Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", size = 13427, upload-time = "2026-07-23T20:16:12.938Z" }, -] - -[[package]] -name = "anthropic" -version = "0.119.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "docstring-parser" }, - { name = "httpx" }, - { name = "jiter" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/c5/f1d53b7d27b25a7f491d39c5cd9d39805be2d115d7f7431a8bf22f286afe/anthropic-0.119.0.tar.gz", hash = "sha256:40a81b094ae2a0056a77771257943b19bd46edce1326e22f85c2794492097f0a", size = 999050, upload-time = "2026-07-23T17:34:40.233Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/2e/5e90df53b474e856a3ae065c0df77e62bf58cb2df8819ec850d08b82518a/anthropic-0.119.0-py3-none-any.whl", hash = "sha256:2b39107077489d19d7c66000e9d9263293d431550fcf6b543ead785c6ac85962", size = 1012756, upload-time = "2026-07-23T17:34:41.896Z" }, -] - -[[package]] -name = "anybadge" -version = "1.16.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/08/ddad0d5398d0961d506b0489e737a06e29a963eff0f2f0a2bb2cfb36dd1f/anybadge-1.16.0.tar.gz", hash = "sha256:f4e95eca834482f9932f9020ac2fe04a5ca863728b446324a8d35b1e67faab71", size = 34616, upload-time = "2025-01-11T23:03:27.966Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/7d/01b2ac2fec808dea667b8678938156c3910219f2c45ee2e0b01e72786d72/anybadge-1.16.0-py3-none-any.whl", hash = "sha256:bc9ef2e20d875ee09237a15250a17b6fd7e67276f083d32a297963cdec179918", size = 28412, upload-time = "2025-01-11T23:03:24.857Z" }, -] - -[[package]] -name = "anyenv" -version = "2.0.15" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "aioitertools" }, - { name = "anyio" }, - { name = "appdirs" }, - { name = "universal-pathlib" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/79/470d6fc8b16172292fd27d9c5ed112fc5efd0fa6c6636c9828071c21743f/anyenv-2.0.15.tar.gz", hash = "sha256:e55d27982a42099034d1ea424f943255d61b9dcc4e073dd1b574993c4d09acae", size = 97848, upload-time = "2026-01-12T14:27:58.99Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/32/d7fbc87a89fe8f1e2ab871a8cc02839e900ac440c118d2101e12e322d5eb/anyenv-2.0.15-py3-none-any.whl", hash = "sha256:eba488219d9865b0ea2bdd120f6e41c0ab33619185d8ba20a5fa28148d3c030f", size = 161016, upload-time = "2026-01-12T14:28:01.283Z" }, -] - -[package.optional-dependencies] -httpx = [ - { name = "hishel", extra = ["async"] }, - { name = "httpx" }, + +[package.optional-dependencies] +httpx = [ + { name = "hishel", extra = ["async"] }, + { name = "httpx" }, ] [[package]] name = "anyio" version = "4.14.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813 }, ] [[package]] name = "anysqlite" version = "0.0.5" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/4b/cd5d66b9f87e773bc71344a368b9472987e33514e6627e28342b9c3e7c43/anysqlite-0.0.5.tar.gz", hash = "sha256:9dfcf87baf6b93426ad1d9118088c41dbf24ef01b445eea4a5d486bac2755cce" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/4b/cd5d66b9f87e773bc71344a368b9472987e33514e6627e28342b9c3e7c43/anysqlite-0.0.5.tar.gz", hash = "sha256:9dfcf87baf6b93426ad1d9118088c41dbf24ef01b445eea4a5d486bac2755cce", size = 3432 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/31/349eae2bc9d9331dd8951684cf94528d91efaa71129dc30822ac111dfc66/anysqlite-0.0.5-py3-none-any.whl", hash = "sha256:cb345dc4f76f6b37f768d7a0b3e9cf5c700dfcb7a6356af8ab46a11f666edbe7" }, + { url = "https://files.pythonhosted.org/packages/0b/31/349eae2bc9d9331dd8951684cf94528d91efaa71129dc30822ac111dfc66/anysqlite-0.0.5-py3-none-any.whl", hash = "sha256:cb345dc4f76f6b37f768d7a0b3e9cf5c700dfcb7a6356af8ab46a11f666edbe7", size = 3907 }, ] [[package]] name = "anyvoice" version = "0.0.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "schemez" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/6d/b875a56c88b83b2707f02b4afc38c77e2fc3acba3519c64a114681e9edca/anyvoice-0.0.2.tar.gz", hash = "sha256:0a45e8d20b2e26e115c86ce3b8b64f37702d44bfd7ef3f02b518452d25797e35", size = 11072, upload-time = "2025-12-24T15:48:03.869Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6d/b875a56c88b83b2707f02b4afc38c77e2fc3acba3519c64a114681e9edca/anyvoice-0.0.2.tar.gz", hash = "sha256:0a45e8d20b2e26e115c86ce3b8b64f37702d44bfd7ef3f02b518452d25797e35", size = 11072 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8e/7e/9d782e979af721ea066123a83ae6aa391f050c98bb59a2f3696b90560dd1/anyvoice-0.0.2-py3-none-any.whl", hash = "sha256:d2fb884c3d755f115a74a850ce0f7e1098cb71d6d663049cc31322792f5dc3e7", size = 12813, upload-time = "2025-12-24T15:48:02.203Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7e/9d782e979af721ea066123a83ae6aa391f050c98bb59a2f3696b90560dd1/anyvoice-0.0.2-py3-none-any.whl", hash = "sha256:d2fb884c3d755f115a74a850ce0f7e1098cb71d6d663049cc31322792f5dc3e7", size = 12813 }, ] [package.optional-dependencies] @@ -568,16 +271,16 @@ tts-edge = [ [[package]] name = "appdirs" version = "1.4.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470, upload-time = "2020-05-11T07:59:51.037Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566, upload-time = "2020-05-11T07:59:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 }, ] [[package]] name = "apprise" version = "1.12.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "click" }, @@ -587,182 +290,182 @@ dependencies = [ { name = "requests-oauthlib" }, { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/f7/95a52cda9355f32c5db9ef77bac18e85977472d29c555fafd825cf60c309/apprise-1.12.0.tar.gz", hash = "sha256:ffe9860d99cbde05fd156c610d4bcb49d953200c4ed3cb2db001ed50722fc142", size = 2477874, upload-time = "2026-07-04T16:15:36.67Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/f7/95a52cda9355f32c5db9ef77bac18e85977472d29c555fafd825cf60c309/apprise-1.12.0.tar.gz", hash = "sha256:ffe9860d99cbde05fd156c610d4bcb49d953200c4ed3cb2db001ed50722fc142", size = 2477874 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/e9/acfea54abdd66a059ff82995d3703eca3a27df3dc1bdc6afaf8a30a854fe/apprise-1.12.0-py3-none-any.whl", hash = "sha256:28edabfec5a9d5dbcd9aa28bdfd8928ecb68764e40214b6e648eab6d974b5a93", size = 1797824, upload-time = "2026-07-04T16:15:34.228Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e9/acfea54abdd66a059ff82995d3703eca3a27df3dc1bdc6afaf8a30a854fe/apprise-1.12.0-py3-none-any.whl", hash = "sha256:28edabfec5a9d5dbcd9aa28bdfd8928ecb68764e40214b6e648eab6d974b5a93", size = 1797824 }, ] [[package]] name = "argcomplete" version = "3.7.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/c0/c8e94135e66fabf89a120d9b4b123fe6993506beca6c1938a74c24cfa5fd/argcomplete-3.7.0.tar.gz", hash = "sha256:afde224f753f874807b1dc1414e883ab8fe0cda9c04807b6047dcb8e1ac23913", size = 73284, upload-time = "2026-06-30T22:28:22.249Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/c0/c8e94135e66fabf89a120d9b4b123fe6993506beca6c1938a74c24cfa5fd/argcomplete-3.7.0.tar.gz", hash = "sha256:afde224f753f874807b1dc1414e883ab8fe0cda9c04807b6047dcb8e1ac23913", size = 73284 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/f6/5b8ec087cd9cfa9449491ec83f76fb6b7006b4dff57d2ba8aaab330fe8e4/argcomplete-3.7.0-py3-none-any.whl", hash = "sha256:d8f0f22d2a8a7caa383be1e22b6caf1ecaf0ebd10d8f83cc125e36540c95830c", size = 42575, upload-time = "2026-06-30T22:28:20.547Z" }, + { url = "https://files.pythonhosted.org/packages/12/f6/5b8ec087cd9cfa9449491ec83f76fb6b7006b4dff57d2ba8aaab330fe8e4/argcomplete-3.7.0-py3-none-any.whl", hash = "sha256:d8f0f22d2a8a7caa383be1e22b6caf1ecaf0ebd10d8f83cc125e36540c95830c", size = 42575 }, ] [[package]] name = "asgiref" version = "3.12.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/26/3b59f2bdae5f640389becb1f673cded775287f5fc4f816309d9ca9a3f93d/asgiref-3.12.1.tar.gz", hash = "sha256:59dcb51c272ad209d59bed5708a64a333083e86017d7fcdd67498eeab7784340", size = 42378, upload-time = "2026-07-14T09:56:18.087Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/26/3b59f2bdae5f640389becb1f673cded775287f5fc4f816309d9ca9a3f93d/asgiref-3.12.1.tar.gz", hash = "sha256:59dcb51c272ad209d59bed5708a64a333083e86017d7fcdd67498eeab7784340", size = 42378 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/1b/54f4ad77cd8a584fa70746c47df988e002cf1ee1eba43364d46f87803647/asgiref-3.12.1-py3-none-any.whl", hash = "sha256:fe386d1c2bff7259ea95929266d12a8cf9a8b5a1c2598402967d8792e7a7c094", size = 25478, upload-time = "2026-07-14T09:56:16.926Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1b/54f4ad77cd8a584fa70746c47df988e002cf1ee1eba43364d46f87803647/asgiref-3.12.1-py3-none-any.whl", hash = "sha256:fe386d1c2bff7259ea95929266d12a8cf9a8b5a1c2598402967d8792e7a7c094", size = 25478 }, ] [[package]] name = "ast-grep-py" version = "0.45.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bf/01/675c994c5309f59f0a3a1a1f8e00beb5a40bc51c45aeffafb27b00d51743/ast_grep_py-0.45.0.tar.gz", hash = "sha256:f96ec0175c296a04b2119ef4ff526aa14573db2a2dd35d24b22175390b2cbab9", size = 155313, upload-time = "2026-07-23T16:20:59.22Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/01/675c994c5309f59f0a3a1a1f8e00beb5a40bc51c45aeffafb27b00d51743/ast_grep_py-0.45.0.tar.gz", hash = "sha256:f96ec0175c296a04b2119ef4ff526aa14573db2a2dd35d24b22175390b2cbab9", size = 155313 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/30/15ac9b3eb165b7b4223beaf35814cb5791482360c08708bafcdf572c8a05/ast_grep_py-0.45.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:4fdba29578f1b34d9186d6a446a2c687e683cb409df6bbf5d7d60b8dcdc7abee", size = 5358555, upload-time = "2026-07-23T16:20:39.165Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/34/be/da3954eaf57e57451747b5f5581acdd96bc16d49d57d09748fdf895e3259/ast_grep_py-0.45.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b04d1bd7f0144e9ab23a1eeab6b271288a59938d2864e3afeb4ed4dd74fddfe0", size = 5530668, upload-time = "2026-07-23T16:20:40.677Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8d/d1/d06a16325268bb66565497b4dc2f6b69670ba5ea5825826331e6cc724cc5/ast_grep_py-0.45.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:8237ee9049afc02cb40f090928db283a1f0843dee93c41f747ec978571e514c5", size = 5346125, upload-time = "2026-07-23T16:20:42.45Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/b7/64d9b9ff8b950890a86ea94b8a669e73fd14318f958ec50a19a72ed85ed0/ast_grep_py-0.45.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:dfda851a6be563a86518c93bb8be0bdc5a400ba262ea56fd2a2d9619c70b3f81", size = 5458633, upload-time = "2026-07-23T16:20:43.977Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/c0/02157953adc01798d73210bccb0f1102a9817137f23b74df3f0c725ff210/ast_grep_py-0.45.0-cp313-cp313-win32.whl", hash = "sha256:d6f1cdadd015a9b0806403fcb44c921ae40bb615fe96ce8e28b0957b6139efb2", size = 5070101, upload-time = "2026-07-23T16:20:45.654Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/4f/9673e3a7b7dcc12e1118e813a01a6b380ab6c7d05e81175fbcfc91465cde/ast_grep_py-0.45.0-cp313-cp313-win_amd64.whl", hash = "sha256:0df945e6c112b6d21860c0d074f780dad6a25c72cb1988c40eb66b7ed701272b", size = 5206071, upload-time = "2026-07-23T16:20:47.181Z" }, + { url = "https://files.pythonhosted.org/packages/f1/30/15ac9b3eb165b7b4223beaf35814cb5791482360c08708bafcdf572c8a05/ast_grep_py-0.45.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:4fdba29578f1b34d9186d6a446a2c687e683cb409df6bbf5d7d60b8dcdc7abee", size = 5358555 }, + { url = "https://files.pythonhosted.org/packages/34/be/da3954eaf57e57451747b5f5581acdd96bc16d49d57d09748fdf895e3259/ast_grep_py-0.45.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b04d1bd7f0144e9ab23a1eeab6b271288a59938d2864e3afeb4ed4dd74fddfe0", size = 5530668 }, + { url = "https://files.pythonhosted.org/packages/8d/d1/d06a16325268bb66565497b4dc2f6b69670ba5ea5825826331e6cc724cc5/ast_grep_py-0.45.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:8237ee9049afc02cb40f090928db283a1f0843dee93c41f747ec978571e514c5", size = 5346125 }, + { url = "https://files.pythonhosted.org/packages/7b/b7/64d9b9ff8b950890a86ea94b8a669e73fd14318f958ec50a19a72ed85ed0/ast_grep_py-0.45.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:dfda851a6be563a86518c93bb8be0bdc5a400ba262ea56fd2a2d9619c70b3f81", size = 5458633 }, + { url = "https://files.pythonhosted.org/packages/8c/c0/02157953adc01798d73210bccb0f1102a9817137f23b74df3f0c725ff210/ast_grep_py-0.45.0-cp313-cp313-win32.whl", hash = "sha256:d6f1cdadd015a9b0806403fcb44c921ae40bb615fe96ce8e28b0957b6139efb2", size = 5070101 }, + { url = "https://files.pythonhosted.org/packages/2b/4f/9673e3a7b7dcc12e1118e813a01a6b380ab6c7d05e81175fbcfc91465cde/ast_grep_py-0.45.0-cp313-cp313-win_amd64.whl", hash = "sha256:0df945e6c112b6d21860c0d074f780dad6a25c72cb1988c40eb66b7ed701272b", size = 5206071 }, ] [[package]] name = "ast-serialize" version = "0.6.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/ad/0d70a3a2d6e01968d985415259e8ec7ad3f777903f9b1c1f3c8c44642c60/ast_serialize-0.6.0.tar.gz", hash = "sha256:aadd3ffcf4858c9726bf3515f7b199c7eadbe504f96028e4a87172c0da65a8fe", size = 61489, upload-time = "2026-06-30T20:02:55.555Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/52/19/ac8348ae8711c9b5ae834634f635780cab62a0f5e6f988882e048b89c2ae/ast_serialize-0.6.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:093cb8bb91b720d8523580498d031791bb1bbaa048599c3d21085d380e11a596", size = 1185367, upload-time = "2026-06-30T20:02:30.427Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/f6/ec7ec652c51db77c2f61d8573338e13e4704303265ccc658cb4031d9f354/ast_serialize-0.6.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:e61580a69faf47e3689795367ed211f2a10fd741478cc0f36a0f128793360aad", size = 1178657, upload-time = "2026-06-30T20:02:31.964Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/02/613a7534a41d0122f37d1e0c64aa8ac78bfb831f8c92f6db057a311abb3c/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305802f2ce2a7c4e87835078ea85c58b586ddda8095b92fe2ead9364ae19c80a", size = 1238620, upload-time = "2026-06-30T20:02:33.664Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/21/087957bba486242afc52f49b2d9e21c9dad00289356cf9efe67084015a9d/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7b8b8f0c42f752ea00b2b7d7c090b3f80d9c1c5c75cadf16423790a0cc74081", size = 1236075, upload-time = "2026-06-30T20:02:34.936Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/04/78128bbb170071c2c72a210a181f1c00e11cc1cec60a8beef747b07f9201/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd5b91b9e6f2356ace3a556963b0cd783b395fbbb0bb17b4defc283415466e77", size = 1441348, upload-time = "2026-06-30T20:02:36.245Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/64/62fb99d6faf199b4c3e5b08a07136e9a0d7664bb249c6de3670e5b63e9b6/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d6ef91590258ada18909b9caea344dac4de2013906b035473cd674a43f4b790", size = 1258580, upload-time = "2026-06-30T20:02:37.53Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/87/b4d6c38e0ccd5e85dc54cecdf933a152c60b28fe5d993a6d8a72fa6d5896/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcbed41e9386059fc0261d602445ede0976c2ecec2939688bcbcb9ed0b6f28b7", size = 1261693, upload-time = "2026-06-30T20:02:39.123Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/4b/3676ca2191f39bafb75f93f99b2f429ec464586158fece2165f3572805dc/ast_serialize-0.6.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:cdc4e6f930b9090c2f92c9036ad12ffb8e6e44d4a5ba06f1458a05d60f203f7b", size = 1252517, upload-time = "2026-06-30T20:02:40.511Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/58/494ef8c4b4acb2f4a265ac934caf45f792a08fe27d6b853de35ad991941a/ast_serialize-0.6.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:897ac47b5637be41c0c07061c8a912fafa967ef1dc73fa115e4bfa70882a093b", size = 1304843, upload-time = "2026-06-30T20:02:41.961Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/f2/13736d920ab3d49bbee80ef1a277dd7b7aaf3b3545efd9d2a8114fe05525/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c4af9a1386166e40ed01464991806f89038a2d89782576c7774876fa77034e32", size = 1413698, upload-time = "2026-06-30T20:02:44.179Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a8/5a/e046f3899e2acba4677d7427b76431443a1aa1a0e583dfb05b55b69d55cf/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c901adbd750029b9ac4ad3d6aa56853e0ad4875119fbf52b7b8298afc223828b", size = 1512209, upload-time = "2026-06-30T20:02:45.584Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cc/c7/e42aaca7bb2d22a7c06d5a8c7930086c5a334e93d716e6fa5e6647a4515f/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3ae22a366b752ab4496191525b78b097b5b72d531752e3c1dd7e383a8f2c8a1a", size = 1508464, upload-time = "2026-06-30T20:02:46.942Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/93/5524a3dc6c3f593de3228ed9cbef73afa047625b7000ec21b7f58e6eb4d4/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4ed29121da8b3fdc291002801a1de0f76248fa07dce89157a5f277842cf6126e", size = 1457164, upload-time = "2026-06-30T20:02:48.294Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4f/c0/36a6ffb4d653cf621427b4c4928671f53ad800c453474de2b82564a44ad9/ast_serialize-0.6.0-cp39-abi3-pyemscripten_2026_0_wasm32.whl", hash = "sha256:b1dac4e09d341c1300ba69cdcbe62867b32a8c75d90db9bf4d083bec3b039f0b", size = 863014, upload-time = "2026-06-30T20:02:49.742Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/09/c7/7d5ad8b49e1278e1c2a1e0274bd7850560b3f09313aa00c13bc8d5544792/ast_serialize-0.6.0-cp39-abi3-win32.whl", hash = "sha256:82c312a7844d2fdeb4d5c48bd3d215bf940dafd4704e1a9bcf252a99010a99b1", size = 1063165, upload-time = "2026-06-30T20:02:50.98Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/ae/6710c14ecb276031cf10249f6adf5a59e2d3fdb3b5183bd59f70524067ee/ast_serialize-0.6.0-cp39-abi3-win_amd64.whl", hash = "sha256:113b58346f9ceb664352032770caca817d4a3c86f611c6088e6ef65ddaa70f0e", size = 1101444, upload-time = "2026-06-30T20:02:52.554Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/40/c53deb2cd0c9b0fb636d24d9f40924cf2e65028e6b20b10cd5c1eeb2c730/ast_serialize-0.6.0-cp39-abi3-win_arm64.whl", hash = "sha256:ccd132fe8db56f61fe743b1f644d01b8d65b83248a8da506f3132bda86d6ed5e", size = 1072965, upload-time = "2026-06-30T20:02:54.097Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/ad/0d70a3a2d6e01968d985415259e8ec7ad3f777903f9b1c1f3c8c44642c60/ast_serialize-0.6.0.tar.gz", hash = "sha256:aadd3ffcf4858c9726bf3515f7b199c7eadbe504f96028e4a87172c0da65a8fe", size = 61489 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/19/ac8348ae8711c9b5ae834634f635780cab62a0f5e6f988882e048b89c2ae/ast_serialize-0.6.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:093cb8bb91b720d8523580498d031791bb1bbaa048599c3d21085d380e11a596", size = 1185367 }, + { url = "https://files.pythonhosted.org/packages/c1/f6/ec7ec652c51db77c2f61d8573338e13e4704303265ccc658cb4031d9f354/ast_serialize-0.6.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:e61580a69faf47e3689795367ed211f2a10fd741478cc0f36a0f128793360aad", size = 1178657 }, + { url = "https://files.pythonhosted.org/packages/6f/02/613a7534a41d0122f37d1e0c64aa8ac78bfb831f8c92f6db057a311abb3c/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305802f2ce2a7c4e87835078ea85c58b586ddda8095b92fe2ead9364ae19c80a", size = 1238620 }, + { url = "https://files.pythonhosted.org/packages/4d/21/087957bba486242afc52f49b2d9e21c9dad00289356cf9efe67084015a9d/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7b8b8f0c42f752ea00b2b7d7c090b3f80d9c1c5c75cadf16423790a0cc74081", size = 1236075 }, + { url = "https://files.pythonhosted.org/packages/82/04/78128bbb170071c2c72a210a181f1c00e11cc1cec60a8beef747b07f9201/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd5b91b9e6f2356ace3a556963b0cd783b395fbbb0bb17b4defc283415466e77", size = 1441348 }, + { url = "https://files.pythonhosted.org/packages/64/64/62fb99d6faf199b4c3e5b08a07136e9a0d7664bb249c6de3670e5b63e9b6/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d6ef91590258ada18909b9caea344dac4de2013906b035473cd674a43f4b790", size = 1258580 }, + { url = "https://files.pythonhosted.org/packages/ca/87/b4d6c38e0ccd5e85dc54cecdf933a152c60b28fe5d993a6d8a72fa6d5896/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcbed41e9386059fc0261d602445ede0976c2ecec2939688bcbcb9ed0b6f28b7", size = 1261693 }, + { url = "https://files.pythonhosted.org/packages/0e/4b/3676ca2191f39bafb75f93f99b2f429ec464586158fece2165f3572805dc/ast_serialize-0.6.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:cdc4e6f930b9090c2f92c9036ad12ffb8e6e44d4a5ba06f1458a05d60f203f7b", size = 1252517 }, + { url = "https://files.pythonhosted.org/packages/f3/58/494ef8c4b4acb2f4a265ac934caf45f792a08fe27d6b853de35ad991941a/ast_serialize-0.6.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:897ac47b5637be41c0c07061c8a912fafa967ef1dc73fa115e4bfa70882a093b", size = 1304843 }, + { url = "https://files.pythonhosted.org/packages/b1/f2/13736d920ab3d49bbee80ef1a277dd7b7aaf3b3545efd9d2a8114fe05525/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c4af9a1386166e40ed01464991806f89038a2d89782576c7774876fa77034e32", size = 1413698 }, + { url = "https://files.pythonhosted.org/packages/a8/5a/e046f3899e2acba4677d7427b76431443a1aa1a0e583dfb05b55b69d55cf/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c901adbd750029b9ac4ad3d6aa56853e0ad4875119fbf52b7b8298afc223828b", size = 1512209 }, + { url = "https://files.pythonhosted.org/packages/cc/c7/e42aaca7bb2d22a7c06d5a8c7930086c5a334e93d716e6fa5e6647a4515f/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3ae22a366b752ab4496191525b78b097b5b72d531752e3c1dd7e383a8f2c8a1a", size = 1508464 }, + { url = "https://files.pythonhosted.org/packages/95/93/5524a3dc6c3f593de3228ed9cbef73afa047625b7000ec21b7f58e6eb4d4/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4ed29121da8b3fdc291002801a1de0f76248fa07dce89157a5f277842cf6126e", size = 1457164 }, + { url = "https://files.pythonhosted.org/packages/4f/c0/36a6ffb4d653cf621427b4c4928671f53ad800c453474de2b82564a44ad9/ast_serialize-0.6.0-cp39-abi3-pyemscripten_2026_0_wasm32.whl", hash = "sha256:b1dac4e09d341c1300ba69cdcbe62867b32a8c75d90db9bf4d083bec3b039f0b", size = 863014 }, + { url = "https://files.pythonhosted.org/packages/09/c7/7d5ad8b49e1278e1c2a1e0274bd7850560b3f09313aa00c13bc8d5544792/ast_serialize-0.6.0-cp39-abi3-win32.whl", hash = "sha256:82c312a7844d2fdeb4d5c48bd3d215bf940dafd4704e1a9bcf252a99010a99b1", size = 1063165 }, + { url = "https://files.pythonhosted.org/packages/47/ae/6710c14ecb276031cf10249f6adf5a59e2d3fdb3b5183bd59f70524067ee/ast_serialize-0.6.0-cp39-abi3-win_amd64.whl", hash = "sha256:113b58346f9ceb664352032770caca817d4a3c86f611c6088e6ef65ddaa70f0e", size = 1101444 }, + { url = "https://files.pythonhosted.org/packages/66/40/c53deb2cd0c9b0fb636d24d9f40924cf2e65028e6b20b10cd5c1eeb2c730/ast_serialize-0.6.0-cp39-abi3-win_arm64.whl", hash = "sha256:ccd132fe8db56f61fe743b1f644d01b8d65b83248a8da506f3132bda86d6ed5e", size = 1072965 }, ] [[package]] name = "asttokens" version = "2.4.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284, upload-time = "2023-10-26T10:03:05.06Z" } +sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", size = 27764, upload-time = "2023-10-26T10:03:01.789Z" }, + { url = "https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", size = 27764 }, ] [[package]] name = "attrs" version = "26.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/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" }, + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548 }, ] [[package]] name = "authlib" version = "1.7.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "joserfc" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/36/98/7d93f30d029643c0275dbc0bd6d5a6f670661ee6c9a94d93af7ab4887600/authlib-1.7.2.tar.gz", hash = "sha256:2cea25fefcd4e7173bdf1372c0afc265c8034b23a8cd5dcb6a9164b826c64231", size = 176511, upload-time = "2026-05-06T08:10:23.116Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/98/7d93f30d029643c0275dbc0bd6d5a6f670661ee6c9a94d93af7ab4887600/authlib-1.7.2.tar.gz", hash = "sha256:2cea25fefcd4e7173bdf1372c0afc265c8034b23a8cd5dcb6a9164b826c64231", size = 176511 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/95/adcb68e20c34162e9135f370d6e31737719c2b6f94bc953fe7ed1f10fe21/authlib-1.7.2-py2.py3-none-any.whl", hash = "sha256:3e1faedc9d87e7d56a164eca3ccb6ace0d61b94abe83e92242f8dc8bba9b4a9f", size = 259548, upload-time = "2026-05-06T08:10:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/fb/95/adcb68e20c34162e9135f370d6e31737719c2b6f94bc953fe7ed1f10fe21/authlib-1.7.2-py2.py3-none-any.whl", hash = "sha256:3e1faedc9d87e7d56a164eca3ccb6ace0d61b94abe83e92242f8dc8bba9b4a9f", size = 259548 }, ] [[package]] name = "autoevals" version = "0.3.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "chevron" }, { name = "jsonschema" }, { name = "polyleven" }, { name = "pyyaml" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/bd/cbb2d2d53e991341fa63355248ed32870e2e60686fe11c066613f0df3a3c/autoevals-0.3.0.tar.gz", hash = "sha256:8def35d33146f80f09d24fa11d446c44d0be9471cce2836de437d82e88c6538a", size = 66952, upload-time = "2026-06-09T17:29:51.944Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/bd/cbb2d2d53e991341fa63355248ed32870e2e60686fe11c066613f0df3a3c/autoevals-0.3.0.tar.gz", hash = "sha256:8def35d33146f80f09d24fa11d446c44d0be9471cce2836de437d82e88c6538a", size = 66952 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/7d/142140e894c67bd69c9dbde15b2e929b4495647b5907e73e87f28d0b82ed/autoevals-0.3.0-py3-none-any.whl", hash = "sha256:c2292ab059d4617ae706658c5df51969eb8c6435a65fc930c61abb918ac2eb2d", size = 73778, upload-time = "2026-06-09T17:29:50.278Z" }, + { url = "https://files.pythonhosted.org/packages/99/7d/142140e894c67bd69c9dbde15b2e929b4495647b5907e73e87f28d0b82ed/autoevals-0.3.0-py3-none-any.whl", hash = "sha256:c2292ab059d4617ae706658c5df51969eb8c6435a65fc930c61abb918ac2eb2d", size = 73778 }, ] [[package]] name = "babel" version = "2.18.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845 }, ] [[package]] name = "backoff" version = "2.2.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001, upload-time = "2022-10-05T19:19:32.061Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148, upload-time = "2022-10-05T19:19:30.546Z" }, + { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148 }, ] [[package]] name = "backrefs" version = "7.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5e/a7/a7dd63622beef68cc0d3c3c36d472e143dd95443d5ebf14cd1a5b4dfbf11/backrefs-7.0.tar.gz", hash = "sha256:4989bb9e1e99eb23647c7160ed51fb21d0b41b5d200f2d3017da41e023097e82", size = 7012453, upload-time = "2026-04-28T16:28:04.215Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/a7dd63622beef68cc0d3c3c36d472e143dd95443d5ebf14cd1a5b4dfbf11/backrefs-7.0.tar.gz", hash = "sha256:4989bb9e1e99eb23647c7160ed51fb21d0b41b5d200f2d3017da41e023097e82", size = 7012453 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/39/39a31d7eae729ea14ed10c3ccef79371197177b9355a86cb3525709e8502/backrefs-7.0-py310-none-any.whl", hash = "sha256:b57cd227ea556b0aed3dc9b8da4628db4eabc0402c6d7fcfc69283a93955f7e9", size = 380824, upload-time = "2026-04-28T16:27:55.647Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/b5/9302644225ba7dfa934a2ff2b9c7bb85701313a90dddb3dfaf693fa5bae2/backrefs-7.0-py311-none-any.whl", hash = "sha256:a0fa7360c63509e9e077e174ef4e6d3c21c8db94189b9d957289ae6d794b9475", size = 392626, upload-time = "2026-04-28T16:27:57.42Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/36/da/87912ddec6e06feffbaa3d7aa18fc6352bee2e8f1fee185d7d1690f8f4e8/backrefs-7.0-py312-none-any.whl", hash = "sha256:ca42ce6a49ace3d75684dfa9937f3373902a63284ecb385ce36d15e5dcb41c12", size = 398537, upload-time = "2026-04-28T16:27:58.913Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/bb/90ba423612b6aa0adccc6b1874bcd4a9b44b660c0c16f346611e00f64ac3/backrefs-7.0-py313-none-any.whl", hash = "sha256:f2c52955d631b9e1ac4cd56209f0a3a946d592b98e7790e77699339ae01c102a", size = 400491, upload-time = "2026-04-28T16:28:00.928Z" }, + { url = "https://files.pythonhosted.org/packages/d4/39/39a31d7eae729ea14ed10c3ccef79371197177b9355a86cb3525709e8502/backrefs-7.0-py310-none-any.whl", hash = "sha256:b57cd227ea556b0aed3dc9b8da4628db4eabc0402c6d7fcfc69283a93955f7e9", size = 380824 }, + { url = "https://files.pythonhosted.org/packages/c9/b5/9302644225ba7dfa934a2ff2b9c7bb85701313a90dddb3dfaf693fa5bae2/backrefs-7.0-py311-none-any.whl", hash = "sha256:a0fa7360c63509e9e077e174ef4e6d3c21c8db94189b9d957289ae6d794b9475", size = 392626 }, + { url = "https://files.pythonhosted.org/packages/36/da/87912ddec6e06feffbaa3d7aa18fc6352bee2e8f1fee185d7d1690f8f4e8/backrefs-7.0-py312-none-any.whl", hash = "sha256:ca42ce6a49ace3d75684dfa9937f3373902a63284ecb385ce36d15e5dcb41c12", size = 398537 }, + { url = "https://files.pythonhosted.org/packages/00/bb/90ba423612b6aa0adccc6b1874bcd4a9b44b660c0c16f346611e00f64ac3/backrefs-7.0-py313-none-any.whl", hash = "sha256:f2c52955d631b9e1ac4cd56209f0a3a946d592b98e7790e77699339ae01c102a", size = 400491 }, ] [[package]] name = "bashlex" version = "0.18" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/60/aae0bb54f9af5e0128ba90eb83d8d0d506ee8f0475c4fdda3deeda20b1d2/bashlex-0.18.tar.gz", hash = "sha256:5bb03a01c6d5676338c36fd1028009c8ad07e7d61d8a1ce3f513b7fff52796ee", size = 68742, upload-time = "2023-01-18T15:21:26.402Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/60/aae0bb54f9af5e0128ba90eb83d8d0d506ee8f0475c4fdda3deeda20b1d2/bashlex-0.18.tar.gz", hash = "sha256:5bb03a01c6d5676338c36fd1028009c8ad07e7d61d8a1ce3f513b7fff52796ee", size = 68742 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f4/be/6985abb1011fda8a523cfe21ed9629e397d6e06fb5bae99750402b25c95b/bashlex-0.18-py2.py3-none-any.whl", hash = "sha256:91d73a23a3e51711919c1c899083890cdecffc91d8c088942725ac13e9dcfffa", size = 69539, upload-time = "2023-01-18T15:21:24.167Z" }, + { url = "https://files.pythonhosted.org/packages/f4/be/6985abb1011fda8a523cfe21ed9629e397d6e06fb5bae99750402b25c95b/bashlex-0.18-py2.py3-none-any.whl", hash = "sha256:91d73a23a3e51711919c1c899083890cdecffc91d8c088942725ac13e9dcfffa", size = 69539 }, ] [[package]] name = "beartype" version = "0.22.9" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/94/1009e248bbfbab11397abca7193bea6626806be9a327d399810d523a07cb/beartype-0.22.9.tar.gz", hash = "sha256:8f82b54aa723a2848a56008d18875f91c1db02c32ef6a62319a002e3e25a975f", size = 1608866, upload-time = "2025-12-13T06:50:30.72Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/94/1009e248bbfbab11397abca7193bea6626806be9a327d399810d523a07cb/beartype-0.22.9.tar.gz", hash = "sha256:8f82b54aa723a2848a56008d18875f91c1db02c32ef6a62319a002e3e25a975f", size = 1608866 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl", hash = "sha256:d16c9bbc61ea14637596c5f6fbff2ee99cbe3573e46a716401734ef50c3060c2", size = 1333658, upload-time = "2025-12-13T06:50:28.266Z" }, + { url = "https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl", hash = "sha256:d16c9bbc61ea14637596c5f6fbff2ee99cbe3573e46a716401734ef50c3060c2", size = 1333658 }, ] [[package]] name = "beautifulsoup4" version = "4.15.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/65/318323f98dbee45d42dff61d8f047181bc6f2268a9068cfad035a46be5af/beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7", size = 632571, upload-time = "2026-06-07T16:44:20.453Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/65/318323f98dbee45d42dff61d8f047181bc6f2268a9068cfad035a46be5af/beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7", size = 632571 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl", hash = "sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9", size = 109924, upload-time = "2026-06-07T16:44:21.566Z" }, + { url = "https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl", hash = "sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9", size = 109924 }, ] [[package]] name = "black" version = "26.5.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "mypy-extensions" }, @@ -771,20 +474,20 @@ dependencies = [ { name = "platformdirs" }, { name = "pytokens" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439, upload-time = "2026-05-18T16:53:36.107Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/5c/c384363980e11e25ca6b93205949bb331fbf35f4e0dbec376dfa6326cec8/black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3", size = 2009020, upload-time = "2026-05-18T17:05:28.132Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335, upload-time = "2026-05-18T17:05:31.266Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614, upload-time = "2026-05-18T17:05:32.718Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/ad/b4e0d9365ba8ac34f6bbab62a4b1b2dd5d618fac3fa1b8db968c844201b5/black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a", size = 1488925, upload-time = "2026-05-18T17:05:34.259Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/4b/652b859bf5df88a751c30451b09338f7fd26a77d1271c666992f836b7711/black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52", size = 1289883, upload-time = "2026-05-18T17:05:36.019Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693, upload-time = "2026-05-18T16:53:33.964Z" }, + { url = "https://files.pythonhosted.org/packages/3f/5c/c384363980e11e25ca6b93205949bb331fbf35f4e0dbec376dfa6326cec8/black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3", size = 2009020 }, + { url = "https://files.pythonhosted.org/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335 }, + { url = "https://files.pythonhosted.org/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614 }, + { url = "https://files.pythonhosted.org/packages/49/ad/b4e0d9365ba8ac34f6bbab62a4b1b2dd5d618fac3fa1b8db968c844201b5/black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a", size = 1488925 }, + { url = "https://files.pythonhosted.org/packages/a1/4b/652b859bf5df88a751c30451b09338f7fd26a77d1271c666992f836b7711/black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52", size = 1289883 }, + { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693 }, ] [[package]] name = "braintrust" version = "0.30.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "chevron" }, { name = "exceptiongroup" }, @@ -798,168 +501,168 @@ dependencies = [ { name = "typing-extensions" }, { name = "wrapt" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/26/775bb8a476d7921dfb86fa3e2740e2cd48c1b22602a09369fef413868e9a/braintrust-0.30.1.tar.gz", hash = "sha256:c8f43c2db18ad21a816307011964b0fd0b6f8e59c8a16092fd65bb50480d97b6", size = 694843, upload-time = "2026-07-21T18:46:49.045Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/26/775bb8a476d7921dfb86fa3e2740e2cd48c1b22602a09369fef413868e9a/braintrust-0.30.1.tar.gz", hash = "sha256:c8f43c2db18ad21a816307011964b0fd0b6f8e59c8a16092fd65bb50480d97b6", size = 694843 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/ba/850abbf73a38eacda46ced4267736f9ac5e826927b9908c67693f6b514ce/braintrust-0.30.1-py3-none-any.whl", hash = "sha256:7f5e6491f95bc047ecd121ad9dfb75d9f4ee56a5c20d851cf6d9be297fa0acd2", size = 808827, upload-time = "2026-07-21T18:46:47.21Z" }, + { url = "https://files.pythonhosted.org/packages/69/ba/850abbf73a38eacda46ced4267736f9ac5e826927b9908c67693f6b514ce/braintrust-0.30.1-py3-none-any.whl", hash = "sha256:7f5e6491f95bc047ecd121ad9dfb75d9f4ee56a5c20d851cf6d9be297fa0acd2", size = 808827 }, ] [[package]] name = "brave-search-python-client" version = "0.4.27" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic-settings" }, { name = "tenacity" }, { name = "typer" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1d/56/bbd47494ebf93742a4ccb40d758a93d0cc1bc0a9513f9106ac9b6f0fa7a2/brave_search_python_client-0.4.27.tar.gz", hash = "sha256:3b8803dd8d4bac8110de2c5ba3014610e6bb36da7ea19ad9ce62b5f1deb38d5a", size = 124413, upload-time = "2025-04-27T17:04:17.641Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/56/bbd47494ebf93742a4ccb40d758a93d0cc1bc0a9513f9106ac9b6f0fa7a2/brave_search_python_client-0.4.27.tar.gz", hash = "sha256:3b8803dd8d4bac8110de2c5ba3014610e6bb36da7ea19ad9ce62b5f1deb38d5a", size = 124413 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/d3/ae16180d52456d8fedcb288e4e4927dd806ce0a43d8ec9b9388ea6c6b072/brave_search_python_client-0.4.27-py3-none-any.whl", hash = "sha256:5b7b7a93f46a825517f81b42dc6c0c6ddcabee4a0fe44ce92b9ceae6a37699ec", size = 128788, upload-time = "2025-04-27T17:04:15.772Z" }, + { url = "https://files.pythonhosted.org/packages/98/d3/ae16180d52456d8fedcb288e4e4927dd806ce0a43d8ec9b9388ea6c6b072/brave_search_python_client-0.4.27-py3-none-any.whl", hash = "sha256:5b7b7a93f46a825517f81b42dc6c0c6ddcabee4a0fe44ce92b9ceae6a37699ec", size = 128788 }, ] [[package]] name = "brotli" version = "1.2.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/16/c92ca344d646e71a43b8bb353f0a6490d7f6e06210f8554c8f874e454285/brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a", size = 7388632, upload-time = "2025-11-05T18:39:42.86Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/16/c92ca344d646e71a43b8bb353f0a6490d7f6e06210f8554c8f874e454285/brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a", size = 7388632 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/d4/4ad5432ac98c73096159d9ce7ffeb82d151c2ac84adcc6168e476bb54674/brotli-1.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9e5825ba2c9998375530504578fd4d5d1059d09621a02065d1b6bfc41a8e05ab", size = 861523, upload-time = "2025-11-05T18:38:34.67Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/9f/9cc5bd03ee68a85dc4bc89114f7067c056a3c14b3d95f171918c088bf88d/brotli-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0cf8c3b8ba93d496b2fae778039e2f5ecc7cff99df84df337ca31d8f2252896c", size = 444289, upload-time = "2025-11-05T18:38:35.6Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/b6/fe84227c56a865d16a6614e2c4722864b380cb14b13f3e6bef441e73a85a/brotli-1.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8565e3cdc1808b1a34714b553b262c5de5fbda202285782173ec137fd13709f", size = 1528076, upload-time = "2025-11-05T18:38:36.639Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/de/de4ae0aaca06c790371cf6e7ee93a024f6b4bb0568727da8c3de112e726c/brotli-1.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:26e8d3ecb0ee458a9804f47f21b74845cc823fd1bb19f02272be70774f56e2a6", size = 1626880, upload-time = "2025-11-05T18:38:37.623Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/16/a1b22cbea436642e071adcaf8d4b350a2ad02f5e0ad0da879a1be16188a0/brotli-1.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67a91c5187e1eec76a61625c77a6c8c785650f5b576ca732bd33ef58b0dff49c", size = 1419737, upload-time = "2025-11-05T18:38:38.729Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/46/63/c968a97cbb3bdbf7f974ef5a6ab467a2879b82afbc5ffb65b8acbb744f95/brotli-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ecdb3b6dc36e6d6e14d3a1bdc6c1057c8cbf80db04031d566eb6080ce283a48", size = 1484440, upload-time = "2025-11-05T18:38:39.916Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/9d/102c67ea5c9fc171f423e8399e585dabea29b5bc79b05572891e70013cdd/brotli-1.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3e1b35d56856f3ed326b140d3c6d9db91740f22e14b06e840fe4bb1923439a18", size = 1593313, upload-time = "2025-11-05T18:38:41.24Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/4a/9526d14fa6b87bc827ba1755a8440e214ff90de03095cacd78a64abe2b7d/brotli-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54a50a9dad16b32136b2241ddea9e4df159b41247b2ce6aac0b3276a66a8f1e5", size = 1487945, upload-time = "2025-11-05T18:38:42.277Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/e8/3fe1ffed70cbef83c5236166acaed7bb9c766509b157854c80e2f766b38c/brotli-1.2.0-cp313-cp313-win32.whl", hash = "sha256:1b1d6a4efedd53671c793be6dd760fcf2107da3a52331ad9ea429edf0902f27a", size = 334368, upload-time = "2025-11-05T18:38:43.345Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/91/e739587be970a113b37b821eae8097aac5a48e5f0eca438c22e4c7dd8648/brotli-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:b63daa43d82f0cdabf98dee215b375b4058cce72871fd07934f179885aad16e8", size = 369116, upload-time = "2025-11-05T18:38:44.609Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d4/4ad5432ac98c73096159d9ce7ffeb82d151c2ac84adcc6168e476bb54674/brotli-1.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9e5825ba2c9998375530504578fd4d5d1059d09621a02065d1b6bfc41a8e05ab", size = 861523 }, + { url = "https://files.pythonhosted.org/packages/91/9f/9cc5bd03ee68a85dc4bc89114f7067c056a3c14b3d95f171918c088bf88d/brotli-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0cf8c3b8ba93d496b2fae778039e2f5ecc7cff99df84df337ca31d8f2252896c", size = 444289 }, + { url = "https://files.pythonhosted.org/packages/2e/b6/fe84227c56a865d16a6614e2c4722864b380cb14b13f3e6bef441e73a85a/brotli-1.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8565e3cdc1808b1a34714b553b262c5de5fbda202285782173ec137fd13709f", size = 1528076 }, + { url = "https://files.pythonhosted.org/packages/55/de/de4ae0aaca06c790371cf6e7ee93a024f6b4bb0568727da8c3de112e726c/brotli-1.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:26e8d3ecb0ee458a9804f47f21b74845cc823fd1bb19f02272be70774f56e2a6", size = 1626880 }, + { url = "https://files.pythonhosted.org/packages/5f/16/a1b22cbea436642e071adcaf8d4b350a2ad02f5e0ad0da879a1be16188a0/brotli-1.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67a91c5187e1eec76a61625c77a6c8c785650f5b576ca732bd33ef58b0dff49c", size = 1419737 }, + { url = "https://files.pythonhosted.org/packages/46/63/c968a97cbb3bdbf7f974ef5a6ab467a2879b82afbc5ffb65b8acbb744f95/brotli-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ecdb3b6dc36e6d6e14d3a1bdc6c1057c8cbf80db04031d566eb6080ce283a48", size = 1484440 }, + { url = "https://files.pythonhosted.org/packages/06/9d/102c67ea5c9fc171f423e8399e585dabea29b5bc79b05572891e70013cdd/brotli-1.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3e1b35d56856f3ed326b140d3c6d9db91740f22e14b06e840fe4bb1923439a18", size = 1593313 }, + { url = "https://files.pythonhosted.org/packages/9e/4a/9526d14fa6b87bc827ba1755a8440e214ff90de03095cacd78a64abe2b7d/brotli-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54a50a9dad16b32136b2241ddea9e4df159b41247b2ce6aac0b3276a66a8f1e5", size = 1487945 }, + { url = "https://files.pythonhosted.org/packages/5b/e8/3fe1ffed70cbef83c5236166acaed7bb9c766509b157854c80e2f766b38c/brotli-1.2.0-cp313-cp313-win32.whl", hash = "sha256:1b1d6a4efedd53671c793be6dd760fcf2107da3a52331ad9ea429edf0902f27a", size = 334368 }, + { url = "https://files.pythonhosted.org/packages/ff/91/e739587be970a113b37b821eae8097aac5a48e5f0eca438c22e4c7dd8648/brotli-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:b63daa43d82f0cdabf98dee215b375b4058cce72871fd07934f179885aad16e8", size = 369116 }, ] [[package]] name = "build" version = "1.5.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "os_name == 'nt'" }, { name = "packaging" }, { name = "pyproject-hooks" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, + { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018 }, ] [[package]] name = "burner-redis" version = "0.1.7" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/52/89/54706febafc135095b2a9d797cfbd4eed2ab1ad7819808b99b587020471b/burner_redis-0.1.7.tar.gz", hash = "sha256:7474ff092669fd11ef765411572cdafcc3d89b8054aef4ca0617be6d6be4c680", size = 638644, upload-time = "2026-05-08T15:01:42.961Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/89/54706febafc135095b2a9d797cfbd4eed2ab1ad7819808b99b587020471b/burner_redis-0.1.7.tar.gz", hash = "sha256:7474ff092669fd11ef765411572cdafcc3d89b8054aef4ca0617be6d6be4c680", size = 638644 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/5d/198bd1d22e504b3034353430703afbdb3efe6e25cb90bf52d896e1d266a7/burner_redis-0.1.7-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f80c866996e0455d584eb3c0f3b067e411c632fb0519eab454e0968edf01e62c", size = 1288888, upload-time = "2026-05-08T15:01:26.103Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/4e/ce5c91b884ac37fcd380756402536f8810964014097950900517ce8bd30c/burner_redis-0.1.7-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:a3d9569a376b690fb5876d454e4904443332dc3ad5c0057e149fc2ad220bf599", size = 1234282, upload-time = "2026-05-08T15:01:28.286Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/c0/31c25cc88143eac2dddcc394151a0db627923d44c94376a83768552c9f13/burner_redis-0.1.7-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20eba1917e3bca9eea5957d5700ff8defcb5a209e57a7841d005549aa0151f44", size = 1337341, upload-time = "2026-05-08T15:01:30.397Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/32/95cfa1833316ca2b6b2e58150a4900bc1ad256043cdd36198f1887618ccc/burner_redis-0.1.7-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39111467059b8a28f15ea061d2414ec25c3e57c65759983f90f4d358e7d6a72d", size = 1366800, upload-time = "2026-05-08T15:01:32.891Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/34/ad/93c3916f053f89b7b5760da5bf855cd78b7885d480f9cfcc64f3732c1dc2/burner_redis-0.1.7-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9b5adfe99aeb8407f468078f3769b2a63e9168fea12f7709df5d2a3b152706e4", size = 1538160, upload-time = "2026-05-08T15:01:34.667Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/b9/19bae42cb124932d71168bc8e5bcb1da33aa62b908e5e632b3d298d7cb15/burner_redis-0.1.7-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:591a9d20685f9d6d22bf0c863b50b12dfcf328b06111b3f62c33cd3185d48ce0", size = 1591491, upload-time = "2026-05-08T15:01:36.708Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f5/30/207f47f406619a5b564355d2946c3171f84231a28b800709b5645b06a5ae/burner_redis-0.1.7-cp310-abi3-win_amd64.whl", hash = "sha256:f6cf4ac666766b32fd63940aad0c120847905fd3102c17e5b6b305f91a21d079", size = 1117564, upload-time = "2026-05-08T15:01:39.221Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/6f/e9beaf46c5e9fd10dfcdb889ebf7d3aa85142c650c0ab17ab284194f58e1/burner_redis-0.1.7-cp310-abi3-win_arm64.whl", hash = "sha256:458f88feeddfb40a586cc3fcbd8e9384bbdfd2a4512a695af4900e06052570d4", size = 1040407, upload-time = "2026-05-08T15:01:41.235Z" }, + { url = "https://files.pythonhosted.org/packages/6c/5d/198bd1d22e504b3034353430703afbdb3efe6e25cb90bf52d896e1d266a7/burner_redis-0.1.7-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f80c866996e0455d584eb3c0f3b067e411c632fb0519eab454e0968edf01e62c", size = 1288888 }, + { url = "https://files.pythonhosted.org/packages/2f/4e/ce5c91b884ac37fcd380756402536f8810964014097950900517ce8bd30c/burner_redis-0.1.7-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:a3d9569a376b690fb5876d454e4904443332dc3ad5c0057e149fc2ad220bf599", size = 1234282 }, + { url = "https://files.pythonhosted.org/packages/6f/c0/31c25cc88143eac2dddcc394151a0db627923d44c94376a83768552c9f13/burner_redis-0.1.7-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20eba1917e3bca9eea5957d5700ff8defcb5a209e57a7841d005549aa0151f44", size = 1337341 }, + { url = "https://files.pythonhosted.org/packages/e1/32/95cfa1833316ca2b6b2e58150a4900bc1ad256043cdd36198f1887618ccc/burner_redis-0.1.7-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39111467059b8a28f15ea061d2414ec25c3e57c65759983f90f4d358e7d6a72d", size = 1366800 }, + { url = "https://files.pythonhosted.org/packages/34/ad/93c3916f053f89b7b5760da5bf855cd78b7885d480f9cfcc64f3732c1dc2/burner_redis-0.1.7-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9b5adfe99aeb8407f468078f3769b2a63e9168fea12f7709df5d2a3b152706e4", size = 1538160 }, + { url = "https://files.pythonhosted.org/packages/5c/b9/19bae42cb124932d71168bc8e5bcb1da33aa62b908e5e632b3d298d7cb15/burner_redis-0.1.7-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:591a9d20685f9d6d22bf0c863b50b12dfcf328b06111b3f62c33cd3185d48ce0", size = 1591491 }, + { url = "https://files.pythonhosted.org/packages/f5/30/207f47f406619a5b564355d2946c3171f84231a28b800709b5645b06a5ae/burner_redis-0.1.7-cp310-abi3-win_amd64.whl", hash = "sha256:f6cf4ac666766b32fd63940aad0c120847905fd3102c17e5b6b305f91a21d079", size = 1117564 }, + { url = "https://files.pythonhosted.org/packages/76/6f/e9beaf46c5e9fd10dfcdb889ebf7d3aa85142c650c0ab17ab284194f58e1/burner_redis-0.1.7-cp310-abi3-win_arm64.whl", hash = "sha256:458f88feeddfb40a586cc3fcbd8e9384bbdfd2a4512a695af4900e06052570d4", size = 1040407 }, ] [[package]] name = "cachetools" version = "5.5.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380, upload-time = "2025-02-20T21:01:19.524Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload-time = "2025-02-20T21:01:16.647Z" }, + { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080 }, ] [[package]] name = "caio" version = "0.9.25" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/88/b8527e1b00c1811db339a1df8bd1ae49d146fcea9d6a5c40e3a80aaeb38d/caio-0.9.25.tar.gz", hash = "sha256:16498e7f81d1d0f5a4c0ad3f2540e65fe25691376e0a5bd367f558067113ed10", size = 26781, upload-time = "2025-12-26T15:21:36.501Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/88/b8527e1b00c1811db339a1df8bd1ae49d146fcea9d6a5c40e3a80aaeb38d/caio-0.9.25.tar.gz", hash = "sha256:16498e7f81d1d0f5a4c0ad3f2540e65fe25691376e0a5bd367f558067113ed10", size = 26781 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/57/5e6ff127e6f62c9f15d989560435c642144aa4210882f9494204bc892305/caio-0.9.25-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d6c2a3411af97762a2b03840c3cec2f7f728921ff8adda53d7ea2315a8563451", size = 36979, upload-time = "2025-12-26T15:21:35.484Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/9f/f21af50e72117eb528c422d4276cbac11fb941b1b812b182e0a9c70d19c5/caio-0.9.25-cp313-cp313-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0998210a4d5cd5cb565b32ccfe4e53d67303f868a76f212e002a8554692870e6", size = 81900, upload-time = "2025-12-26T15:22:21.919Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9c/12/c39ae2a4037cb10ad5eb3578eb4d5f8c1a2575c62bba675f3406b7ef0824/caio-0.9.25-cp313-cp313-manylinux_2_34_aarch64.whl", hash = "sha256:1a177d4777141b96f175fe2c37a3d96dec7911ed9ad5f02bac38aaa1c936611f", size = 81523, upload-time = "2026-03-04T22:08:25.187Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/59/f8f2e950eb4f1a5a3883e198dca514b9d475415cb6cd7b78b9213a0dd45a/caio-0.9.25-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:9ed3cfb28c0e99fec5e208c934e5c157d0866aa9c32aa4dc5e9b6034af6286b7", size = 80243, upload-time = "2026-03-04T22:08:26.449Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/93/1f76c8d1bafe3b0614e06b2195784a3765bbf7b0a067661af9e2dd47fc33/caio-0.9.25-py3-none-any.whl", hash = "sha256:06c0bb02d6b929119b1cfbe1ca403c768b2013a369e2db46bfa2a5761cf82e40", size = 19087, upload-time = "2025-12-26T15:22:00.221Z" }, + { url = "https://files.pythonhosted.org/packages/31/57/5e6ff127e6f62c9f15d989560435c642144aa4210882f9494204bc892305/caio-0.9.25-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d6c2a3411af97762a2b03840c3cec2f7f728921ff8adda53d7ea2315a8563451", size = 36979 }, + { url = "https://files.pythonhosted.org/packages/a3/9f/f21af50e72117eb528c422d4276cbac11fb941b1b812b182e0a9c70d19c5/caio-0.9.25-cp313-cp313-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0998210a4d5cd5cb565b32ccfe4e53d67303f868a76f212e002a8554692870e6", size = 81900 }, + { url = "https://files.pythonhosted.org/packages/9c/12/c39ae2a4037cb10ad5eb3578eb4d5f8c1a2575c62bba675f3406b7ef0824/caio-0.9.25-cp313-cp313-manylinux_2_34_aarch64.whl", hash = "sha256:1a177d4777141b96f175fe2c37a3d96dec7911ed9ad5f02bac38aaa1c936611f", size = 81523 }, + { url = "https://files.pythonhosted.org/packages/22/59/f8f2e950eb4f1a5a3883e198dca514b9d475415cb6cd7b78b9213a0dd45a/caio-0.9.25-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:9ed3cfb28c0e99fec5e208c934e5c157d0866aa9c32aa4dc5e9b6034af6286b7", size = 80243 }, + { url = "https://files.pythonhosted.org/packages/86/93/1f76c8d1bafe3b0614e06b2195784a3765bbf7b0a067661af9e2dd47fc33/caio-0.9.25-py3-none-any.whl", hash = "sha256:06c0bb02d6b929119b1cfbe1ca403c768b2013a369e2db46bfa2a5761cf82e40", size = 19087 }, ] [[package]] name = "centrifuge-python" version = "0.4.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, { name = "websockets" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/5e/d04f0af3d9a74e93c4916d2656156ecc9930f4f5a09e1d2bb061ee817853/centrifuge_python-0.4.4.tar.gz", hash = "sha256:e18e33af9e984825b01ec85c96436e5c701703cc36c8c8f6d8bf00052a720e83", size = 44121, upload-time = "2026-04-18T15:19:39.657Z" } +sdist = { url = "https://files.pythonhosted.org/packages/71/5e/d04f0af3d9a74e93c4916d2656156ecc9930f4f5a09e1d2bb061ee817853/centrifuge_python-0.4.4.tar.gz", hash = "sha256:e18e33af9e984825b01ec85c96436e5c701703cc36c8c8f6d8bf00052a720e83", size = 44121 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c4/f5/a5bfa538d31aa006dd501b16523df37e5faa56765cf0bb755a87cc741398/centrifuge_python-0.4.4-py3-none-any.whl", hash = "sha256:6d30ce617354401e6e7496ddb47d86e5538ee83dbc4a3b314dfec2e6fb68660e", size = 26442, upload-time = "2026-04-18T15:19:38.644Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f5/a5bfa538d31aa006dd501b16523df37e5faa56765cf0bb755a87cc741398/centrifuge_python-0.4.4-py3-none-any.whl", hash = "sha256:6d30ce617354401e6e7496ddb47d86e5538ee83dbc4a3b314dfec2e6fb68660e", size = 26442 }, ] [[package]] name = "certifi" version = "2026.7.22" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983 }, ] [[package]] name = "cffi" version = "2.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/88/a996879e2eeccb815f6e3a5967b12a308257412acec882039d386bd2aa7b/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda", size = 194331, upload-time = "2026-07-06T21:33:03.697Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/85/7ae00d5c8dd6266f4e944c3db630f3c5c9a98b61d469c714d848b1d8138a/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b", size = 196966, upload-time = "2026-07-06T21:33:05.353Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/e9/45c3a76ad8d43ad9261f4c95436da61128d3ca545d72b9612c0ab5be0b1c/cffi-2.1.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:15faec4adfff450819f3aee0e2e02c812de6edb88203aa58807955db2003472a", size = 184795, upload-time = "2026-07-06T21:33:06.699Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/84/4c/82f132cb4418ee6d953d982b19191e87e2a6372c8a4ce36e50b69d6ade4a/cffi-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:716ff8ec22f20b4d988b12884086bcef0fc99737043e503f7a3935a6be99b1ea", size = 184746, upload-time = "2026-07-06T21:33:08.071Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/1c/4ed5a0e5bdca6cbc275556de3328dd1b76fd0c11cc13c88fe66d1d8715f2/cffi-2.1.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db", size = 214747, upload-time = "2026-07-06T21:33:09.671Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/a6/e879bb68cc23a2bc9ba8f4b7d8019f0c2694bad2ab6c4a3701d429439f58/cffi-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f", size = 222392, upload-time = "2026-07-06T21:33:10.896Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/f6/01890cfd63c08f8eb96a8319b0443690197d240a8bd6346048cf7bde9190/cffi-2.1.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d", size = 210285, upload-time = "2026-07-06T21:33:12.251Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/cf/2b684132056f438567b61e19d690dd31cd0921ace051e0a458be6074369e/cffi-2.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0", size = 208801, upload-time = "2026-07-06T21:33:13.617Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/08/f2e7d62c460faae0926f2d6e423694aa409ced3bc1fe2927a0a6e5f05416/cffi-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224", size = 221808, upload-time = "2026-07-06T21:33:15.466Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/38/37/04f54b8e63a02f3d908332c9effbf8c366167c6f733ed8a3d4f79b7e2a1e/cffi-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c", size = 225241, upload-time = "2026-07-06T21:33:16.869Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/d6/c72eecca433cd3e681c65ed313ab4835d9d4a379704d0f628a6a05f51c2e/cffi-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a", size = 223588, upload-time = "2026-07-06T21:33:18.239Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/4b/e706f67279140f92939da3475ad610df18bfd52d50f14953a8e5fede71d5/cffi-2.1.0-cp313-cp313-win32.whl", hash = "sha256:db3eb7d46527159a878ec3460e9d40615bc25ba337d477db681aea6e4f05c5d2", size = 175248, upload-time = "2026-07-06T21:33:19.799Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/47/59eb7975cb0e4ef0afa764ea945b29a5bb4537a9f771cb7d6c8a5dd74c95/cffi-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8e74a6135550c4748af665b1b1118b6aab33b1fc6a16f9aff630af107c3b4512", size = 185717, upload-time = "2026-07-06T21:33:21.47Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/af/34fee85c48f8d94efc8597bc09470c9dd274c145f1c12e0fbc6ab6d38d74/cffi-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:2282cd5e38aa8accd03e99d1256af8411c84cdbee6a89d841b563fdbd1f3e50f", size = 180114, upload-time = "2026-07-06T21:33:22.515Z" }, + { url = "https://files.pythonhosted.org/packages/96/88/a996879e2eeccb815f6e3a5967b12a308257412acec882039d386bd2aa7b/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda", size = 194331 }, + { url = "https://files.pythonhosted.org/packages/58/85/7ae00d5c8dd6266f4e944c3db630f3c5c9a98b61d469c714d848b1d8138a/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b", size = 196966 }, + { url = "https://files.pythonhosted.org/packages/8c/e9/45c3a76ad8d43ad9261f4c95436da61128d3ca545d72b9612c0ab5be0b1c/cffi-2.1.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:15faec4adfff450819f3aee0e2e02c812de6edb88203aa58807955db2003472a", size = 184795 }, + { url = "https://files.pythonhosted.org/packages/84/4c/82f132cb4418ee6d953d982b19191e87e2a6372c8a4ce36e50b69d6ade4a/cffi-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:716ff8ec22f20b4d988b12884086bcef0fc99737043e503f7a3935a6be99b1ea", size = 184746 }, + { url = "https://files.pythonhosted.org/packages/a0/1c/4ed5a0e5bdca6cbc275556de3328dd1b76fd0c11cc13c88fe66d1d8715f2/cffi-2.1.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db", size = 214747 }, + { url = "https://files.pythonhosted.org/packages/3a/a6/e879bb68cc23a2bc9ba8f4b7d8019f0c2694bad2ab6c4a3701d429439f58/cffi-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f", size = 222392 }, + { url = "https://files.pythonhosted.org/packages/88/f6/01890cfd63c08f8eb96a8319b0443690197d240a8bd6346048cf7bde9190/cffi-2.1.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d", size = 210285 }, + { url = "https://files.pythonhosted.org/packages/a6/cf/2b684132056f438567b61e19d690dd31cd0921ace051e0a458be6074369e/cffi-2.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0", size = 208801 }, + { url = "https://files.pythonhosted.org/packages/6f/08/f2e7d62c460faae0926f2d6e423694aa409ced3bc1fe2927a0a6e5f05416/cffi-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224", size = 221808 }, + { url = "https://files.pythonhosted.org/packages/38/37/04f54b8e63a02f3d908332c9effbf8c366167c6f733ed8a3d4f79b7e2a1e/cffi-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c", size = 225241 }, + { url = "https://files.pythonhosted.org/packages/a9/d6/c72eecca433cd3e681c65ed313ab4835d9d4a379704d0f628a6a05f51c2e/cffi-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a", size = 223588 }, + { url = "https://files.pythonhosted.org/packages/c6/4b/e706f67279140f92939da3475ad610df18bfd52d50f14953a8e5fede71d5/cffi-2.1.0-cp313-cp313-win32.whl", hash = "sha256:db3eb7d46527159a878ec3460e9d40615bc25ba337d477db681aea6e4f05c5d2", size = 175248 }, + { url = "https://files.pythonhosted.org/packages/5a/47/59eb7975cb0e4ef0afa764ea945b29a5bb4537a9f771cb7d6c8a5dd74c95/cffi-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8e74a6135550c4748af665b1b1118b6aab33b1fc6a16f9aff630af107c3b4512", size = 185717 }, + { url = "https://files.pythonhosted.org/packages/5a/af/34fee85c48f8d94efc8597bc09470c9dd274c145f1c12e0fbc6ab6d38d74/cffi-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:2282cd5e38aa8accd03e99d1256af8411c84cdbee6a89d841b563fdbd1f3e50f", size = 180114 }, ] [[package]] name = "charset-normalizer" version = "3.4.9" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/06/97ec2aeae780b31d742b6352218b43841a6871e2564578ca522dce4a45c3/charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614", size = 317688, upload-time = "2026-07-07T14:33:35.408Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698", size = 214982, upload-time = "2026-07-07T14:33:36.996Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b", size = 236460, upload-time = "2026-07-07T14:33:38.536Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9", size = 232003, upload-time = "2026-07-07T14:33:40.059Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33", size = 223149, upload-time = "2026-07-07T14:33:41.631Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63", size = 207901, upload-time = "2026-07-07T14:33:43.209Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0", size = 219176, upload-time = "2026-07-07T14:33:44.725Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe", size = 217356, upload-time = "2026-07-07T14:33:46.192Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35", size = 209614, upload-time = "2026-07-07T14:33:47.705Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8", size = 224991, upload-time = "2026-07-07T14:33:49.238Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/a3/53ddae3db108a088156aa8ddfafd411ebbc1340f48c5573f697b27f69a39/charset_normalizer-3.4.9-cp313-cp313-win32.whl", hash = "sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9", size = 150622, upload-time = "2026-07-07T14:33:50.711Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/ef/6953a77c7cf2c2ff9998e6f575ab3e380119f100223381565a4f94c1f836/charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115", size = 161947, upload-time = "2026-07-07T14:33:52.197Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6e/fb/d560d1d1555debbfe7849d9cac6145c1b537709d79576bf22557ed803b82/charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012", size = 152594, upload-time = "2026-07-07T14:33:53.486Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/06/97ec2aeae780b31d742b6352218b43841a6871e2564578ca522dce4a45c3/charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614", size = 317688 }, + { url = "https://files.pythonhosted.org/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698", size = 214982 }, + { url = "https://files.pythonhosted.org/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b", size = 236460 }, + { url = "https://files.pythonhosted.org/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9", size = 232003 }, + { url = "https://files.pythonhosted.org/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33", size = 223149 }, + { url = "https://files.pythonhosted.org/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63", size = 207901 }, + { url = "https://files.pythonhosted.org/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0", size = 219176 }, + { url = "https://files.pythonhosted.org/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe", size = 217356 }, + { url = "https://files.pythonhosted.org/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35", size = 209614 }, + { url = "https://files.pythonhosted.org/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8", size = 224991 }, + { url = "https://files.pythonhosted.org/packages/d0/a3/53ddae3db108a088156aa8ddfafd411ebbc1340f48c5573f697b27f69a39/charset_normalizer-3.4.9-cp313-cp313-win32.whl", hash = "sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9", size = 150622 }, + { url = "https://files.pythonhosted.org/packages/e8/ef/6953a77c7cf2c2ff9998e6f575ab3e380119f100223381565a4f94c1f836/charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115", size = 161947 }, + { url = "https://files.pythonhosted.org/packages/6e/fb/d560d1d1555debbfe7849d9cac6145c1b537709d79576bf22557ed803b82/charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012", size = 152594 }, + { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538 }, ] [[package]] name = "check-jsonschema" version = "0.37.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "jsonschema" }, @@ -967,76 +670,76 @@ dependencies = [ { name = "requests" }, { name = "ruamel-yaml" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/dd/27b7f575586505c3d71b66b1fd60076feeba1ba7ffd1303fbf5a70cedad6/check_jsonschema-0.37.4.tar.gz", hash = "sha256:f933521f14cbeaaf113270751185b01379f453ac9ce9fb01d6190ce1352ccaa6", size = 428594, upload-time = "2026-06-29T21:10:23.726Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/dd/27b7f575586505c3d71b66b1fd60076feeba1ba7ffd1303fbf5a70cedad6/check_jsonschema-0.37.4.tar.gz", hash = "sha256:f933521f14cbeaaf113270751185b01379f453ac9ce9fb01d6190ce1352ccaa6", size = 428594 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/82/6a929238ec352eadd4f4ce6e1be98c575fa8cbebe45b7c519f8016ad2860/check_jsonschema-0.37.4-py3-none-any.whl", hash = "sha256:e4d1647992674d6b1ed2ca46eee6697760d17a5cc0c167ba09c5b503b883d041", size = 412508, upload-time = "2026-06-29T21:10:22.041Z" }, + { url = "https://files.pythonhosted.org/packages/92/82/6a929238ec352eadd4f4ce6e1be98c575fa8cbebe45b7c519f8016ad2860/check_jsonschema-0.37.4-py3-none-any.whl", hash = "sha256:e4d1647992674d6b1ed2ca46eee6697760d17a5cc0c167ba09c5b503b883d041", size = 412508 }, ] [[package]] name = "chevron" version = "0.14.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/15/1f/ca74b65b19798895d63a6e92874162f44233467c9e7c1ed8afd19016ebe9/chevron-0.14.0.tar.gz", hash = "sha256:87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf", size = 11440, upload-time = "2021-01-02T22:47:59.233Z" } +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 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/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" }, + { url = "https://files.pythonhosted.org/packages/52/93/342cc62a70ab727e093ed98e02a725d85b746345f05d2b5e5034649f4ec8/chevron-0.14.0-py3-none-any.whl", hash = "sha256:fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443", size = 11595 }, ] [[package]] name = "click" version = "8.4.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243 }, ] [[package]] name = "clinspector" version = "1.0.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyenv", extra = ["httpx"] }, { name = "schemez" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/da/5523bbfb94a8f961b7ee998fcbdf3efdeea14225c848f35e520383d35369/clinspector-1.0.1.tar.gz", hash = "sha256:2854ea75c8b70c4a1c5273dcb9d44497e8a29c0d4d9dcb7299e551ac20e0c99a", size = 23099, upload-time = "2025-11-09T11:22:31.128Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/da/5523bbfb94a8f961b7ee998fcbdf3efdeea14225c848f35e520383d35369/clinspector-1.0.1.tar.gz", hash = "sha256:2854ea75c8b70c4a1c5273dcb9d44497e8a29c0d4d9dcb7299e551ac20e0c99a", size = 23099 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/06/c8508a6a7b8dfa1600c57e2227194ffc0877958b1bf97bc0e2985b360c7c/clinspector-1.0.1-py3-none-any.whl", hash = "sha256:67616bbbb6e5c7a50a5e7760c0a6022ca31f612910aab21770296513e4a98492", size = 33078, upload-time = "2025-11-09T11:22:29.707Z" }, + { url = "https://files.pythonhosted.org/packages/0e/06/c8508a6a7b8dfa1600c57e2227194ffc0877958b1bf97bc0e2985b360c7c/clinspector-1.0.1-py3-none-any.whl", hash = "sha256:67616bbbb6e5c7a50a5e7760c0a6022ca31f612910aab21770296513e4a98492", size = 33078 }, ] [[package]] name = "cloudpickle" version = "3.1.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, + { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228 }, ] [[package]] name = "coloraide" version = "8.10" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/36/b2/ff53a8c7921197177a4011cc1079b2229678280afd7a8f652c6b46944af8/coloraide-8.10.tar.gz", hash = "sha256:0120503a297181d7236c378297b6ad98b0da4e11bd99fd2500778b8485557a9e", size = 22407815, upload-time = "2026-06-26T01:39:07.708Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/b2/ff53a8c7921197177a4011cc1079b2229678280afd7a8f652c6b46944af8/coloraide-8.10.tar.gz", hash = "sha256:0120503a297181d7236c378297b6ad98b0da4e11bd99fd2500778b8485557a9e", size = 22407815 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/a7/94b95381ebcf3954cd726db7bc4e53cd414a830849ad47db870b2469627f/coloraide-8.10-py3-none-any.whl", hash = "sha256:8a55379769807ce50a1a5b3e973620708fd40b2552a016b89b7fa70e60dd58cc", size = 361350, upload-time = "2026-06-26T01:39:05.522Z" }, + { url = "https://files.pythonhosted.org/packages/1e/a7/94b95381ebcf3954cd726db7bc4e53cd414a830849ad47db870b2469627f/coloraide-8.10-py3-none-any.whl", hash = "sha256:8a55379769807ce50a1a5b3e973620708fd40b2552a016b89b7fa70e60dd58cc", size = 361350 }, ] [[package]] name = "colorama" version = "0.4.6" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] [[package]] name = "composio" version = "0.18.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "composio-client" }, { name = "json-schema-to-pydantic" }, @@ -1045,15 +748,15 @@ dependencies = [ { name = "pysher" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/80/0071e855e9b8e06d2a5f4d87b9f5a65e2a7b3573b72e707256c4b6ee4fc3/composio-0.18.0.tar.gz", hash = "sha256:d8277412eabbb29e357025f1611d59dbb8f410ded5a1bed9a3a8fad09c630366", size = 239594, upload-time = "2026-07-15T20:40:09.609Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/80/0071e855e9b8e06d2a5f4d87b9f5a65e2a7b3573b72e707256c4b6ee4fc3/composio-0.18.0.tar.gz", hash = "sha256:d8277412eabbb29e357025f1611d59dbb8f410ded5a1bed9a3a8fad09c630366", size = 239594 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/8f/0f08f2698cfcdc03d53d8e4810256fbe16e4731c41b70b1fdbb9897f13f8/composio-0.18.0-py3-none-any.whl", hash = "sha256:8cf09b5f9494ae8b3f14103bab2a820a744e9007b0ed2cf9c36f575f9b63a522", size = 155940, upload-time = "2026-07-15T20:39:56.498Z" }, + { url = "https://files.pythonhosted.org/packages/42/8f/0f08f2698cfcdc03d53d8e4810256fbe16e4731c41b70b1fdbb9897f13f8/composio-0.18.0-py3-none-any.whl", hash = "sha256:8cf09b5f9494ae8b3f14103bab2a820a744e9007b0ed2cf9c36f575f9b63a522", size = 155940 }, ] [[package]] name = "composio-client" version = "1.42.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "distro" }, @@ -1062,137 +765,137 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/d3/c47df669397e672172ff31090d186ff36e2158d33cc6c07cf5ec7dd05c39/composio_client-1.42.0.tar.gz", hash = "sha256:74f4635befaa4761e0ca83ed68ff63b0a62312ebea08cf0a2088a47cfe9d5154", size = 246045, upload-time = "2026-06-30T18:14:22.206Z" } +sdist = { url = "https://files.pythonhosted.org/packages/12/d3/c47df669397e672172ff31090d186ff36e2158d33cc6c07cf5ec7dd05c39/composio_client-1.42.0.tar.gz", hash = "sha256:74f4635befaa4761e0ca83ed68ff63b0a62312ebea08cf0a2088a47cfe9d5154", size = 246045 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/b5/f43e74632a91ae6516b713f7d2918391c98276967aa332bd8360457ec940/composio_client-1.42.0-py3-none-any.whl", hash = "sha256:4edfe2b3753fbf63fe2739a4f6705ffc8d4313f7fc98192efb12bac7990600a5", size = 277044, upload-time = "2026-06-30T18:14:20.857Z" }, + { url = "https://files.pythonhosted.org/packages/fe/b5/f43e74632a91ae6516b713f7d2918391c98276967aa332bd8360457ec940/composio_client-1.42.0-py3-none-any.whl", hash = "sha256:4edfe2b3753fbf63fe2739a4f6705ffc8d4313f7fc98192efb12bac7990600a5", size = 277044 }, ] [[package]] name = "copykitten" version = "2.0.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/72/57a5dee794b29c940f6bc429ff731c3d0b9f7af0aad94bd88bafbc3db07f/copykitten-2.0.0.tar.gz", hash = "sha256:bda13d614ffb38147d4fce5217d4f2397967514f5ea09fb8d5c5cf5d16028e58", size = 19712, upload-time = "2025-09-21T02:48:24.848Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/72/57a5dee794b29c940f6bc429ff731c3d0b9f7af0aad94bd88bafbc3db07f/copykitten-2.0.0.tar.gz", hash = "sha256:bda13d614ffb38147d4fce5217d4f2397967514f5ea09fb8d5c5cf5d16028e58", size = 19712 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/24/2ff5084b1fe4825d47246de8f81fa738245ca6d6645b31dfc686bcbed51e/copykitten-2.0.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:191c202d19962fa5dbed5296d83bfa844b36609e30f0fb19cf1706b136f170e8", size = 381118, upload-time = "2025-09-21T02:48:17.65Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/aa/51d0d24435846eb8c41a5f68874a2a39d367e22c58eb3a955455b1e0c7bf/copykitten-2.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:1fb3118f5b3d9bc70442ae62f5d0b5fdd22243f2b4f2811e0680cbb4dfca112a", size = 359839, upload-time = "2025-09-21T02:48:19.422Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3e/3c/ba4ce92ffe21c695d1492fe495032eb2356a5ade4a497d238f7efd277cea/copykitten-2.0.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6be53c8c45bb85bda1679ea2d890e24303096d2a9d9a1022e159b7cfd350b2c0", size = 453897, upload-time = "2025-09-21T02:48:21.055Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/59/5800f845f87f5841f467082698ccbe40e7eb000b1e069bdf24134c91c14c/copykitten-2.0.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b799e46da487e3380248065e5684d39e9f8f0f53b1124edba5e4fd2dc5a273", size = 502975, upload-time = "2025-09-21T02:48:22.428Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/45/22e1d8ffecadcfb0f57ba5189b6c2a7850621ad2045cbdf23a4d7f1f1849/copykitten-2.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:00d09e79fe8031dbdfaefd843d60e48f2b63e6ea9a823d25e07a17469f25017e", size = 267324, upload-time = "2025-09-21T02:48:23.512Z" }, + { url = "https://files.pythonhosted.org/packages/3f/24/2ff5084b1fe4825d47246de8f81fa738245ca6d6645b31dfc686bcbed51e/copykitten-2.0.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:191c202d19962fa5dbed5296d83bfa844b36609e30f0fb19cf1706b136f170e8", size = 381118 }, + { url = "https://files.pythonhosted.org/packages/b5/aa/51d0d24435846eb8c41a5f68874a2a39d367e22c58eb3a955455b1e0c7bf/copykitten-2.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:1fb3118f5b3d9bc70442ae62f5d0b5fdd22243f2b4f2811e0680cbb4dfca112a", size = 359839 }, + { url = "https://files.pythonhosted.org/packages/3e/3c/ba4ce92ffe21c695d1492fe495032eb2356a5ade4a497d238f7efd277cea/copykitten-2.0.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6be53c8c45bb85bda1679ea2d890e24303096d2a9d9a1022e159b7cfd350b2c0", size = 453897 }, + { url = "https://files.pythonhosted.org/packages/98/59/5800f845f87f5841f467082698ccbe40e7eb000b1e069bdf24134c91c14c/copykitten-2.0.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b799e46da487e3380248065e5684d39e9f8f0f53b1124edba5e4fd2dc5a273", size = 502975 }, + { url = "https://files.pythonhosted.org/packages/60/45/22e1d8ffecadcfb0f57ba5189b6c2a7850621ad2045cbdf23a4d7f1f1849/copykitten-2.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:00d09e79fe8031dbdfaefd843d60e48f2b63e6ea9a823d25e07a17469f25017e", size = 267324 }, ] [[package]] name = "coverage" version = "7.15.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/d0/55fe630f4cf94e3fcba868240fad8c8cdd1f764e2a932f8926347e6ec4cd/coverage-7.15.2.tar.gz", hash = "sha256:3df60dc267f0a2ca23cb7a9ab1109c62b9335ffbf519fcfe167157c28c09b81d", size = 927741, upload-time = "2026-07-15T18:56:19.558Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/d5/f8c838e6b7282976f7c918884b792df7a0c42c5bba5d99c60ad2d221d56d/coverage-7.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1121caa19159a38b5463eaae4b1e1fde81e525b15ecc5e000cd5b1a108f743a8", size = 221606, upload-time = "2026-07-15T18:54:45.448Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bf/37/97c926376364f66298cc44893b89cdf17b8bc406376497c4061ae4b8a8ff/coverage-7.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a300c6934e0989c327b9e8a1e110329da4641149f872bbe9f70168be66da76c1", size = 221982, upload-time = "2026-07-15T18:54:47.341Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/30/a36050a6e83c2135ee0776f452ca3948224befc6d7f26acecc082d0c106a/coverage-7.15.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2617f8799d268fabdeef42a7e89ac3a23e1deee9025427db2df970f99a89a578", size = 252972, upload-time = "2026-07-15T18:54:49.2Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/d3/06b5f1daf95f0f15ab05bd75f26ba5f3c8b33d0bb72f3aaa3cf41d1bad3a/coverage-7.15.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7dc2950a2992cd676d35c20ae63522836deeb034f08874699d14068710af3dc1", size = 255569, upload-time = "2026-07-15T18:54:51.098Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/1c/9afb3f8de2b8d36960391c48559a2e3ff96594b58099f115921549ea8d0d/coverage-7.15.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e36686f7a442185db2400b3df171aac520869faf9deb59df687d28659eda2a6", size = 256806, upload-time = "2026-07-15T18:54:53.145Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/d8/b989f96061a5e32d82fddd1b1b9ff48a7c8f8ae7606f0e80fd9de54b1e33/coverage-7.15.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7d29ca7bd67af6e12e74632d65f026eabc1364da5c254494cd914446a28a3ef7", size = 258936, upload-time = "2026-07-15T18:54:55.015Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/fa/f99771f5110457c7b511c1935ca49ddf288218eaa84322e028b9334146ae/coverage-7.15.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:db9c8438057e5b0f6a22a0af99c0c1d26b57fbbdbd1be5861ddb8f897fcc3a2d", size = 253178, upload-time = "2026-07-15T18:54:57.527Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/96/c098a6044d119c751ceede7be91035fa8310170ec24a6523aff72f0a5793/coverage-7.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:63022c4c8dec1d0342f05c3ede99842fe3d007689acc45e86f123a1746e4a026", size = 254934, upload-time = "2026-07-15T18:54:59.41Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/a2/1457b3a7a50c8d77500103b97a046db863e2f59a1cf6d2f814595f349885/coverage-7.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6c0be82b4d4aa5b2704e08518e2252f3e3d110164bcca826816801052e48a7aa", size = 252898, upload-time = "2026-07-15T18:55:01.338Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/0e/76958874c471ecfcdde0d2b2747bb2c61bdbf34a40636f4ce9db9923e643/coverage-7.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4510fb9cdf6bb02dfa6af0be4a534b8102d086e22e4a33f8836df663da3d660d", size = 257056, upload-time = "2026-07-15T18:55:03.243Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/7c/3d7c4e3bf58baa40327dc7edc2272b17cf02299366d52763db1b0ca1556a/coverage-7.15.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:42ec3d989421b174a2ab607c1539f24127ad362757b7f1c0c0d7a2993f7eb37b", size = 252718, upload-time = "2026-07-15T18:55:05.029Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c8/b8/1cecffed9ce14fb25be9ba42d37b6bb61485c9a3ddd43cd3dde36b6087d8/coverage-7.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8f91bce78e32343af184c3b7fa28fcf5a9e2641f4b6623d392038f804939188", size = 254490, upload-time = "2026-07-15T18:55:06.889Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/2c/42984561bc7f4c045dca67516a0c50ee5ef8d84352dbeb5559dc86c4823e/coverage-7.15.2-cp313-cp313-win32.whl", hash = "sha256:434e68d531858205895eb0d74b73d20b84260de426387d53c422a5acda2cf050", size = 223647, upload-time = "2026-07-15T18:55:08.941Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/41/9f/39c7c9245efc583beddf89a87683574e663ed93637f3afb6cd7b88405676/coverage-7.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:26c3b04a6377fd7c09800921fa934e3a17c0020439cd59df73e73ae1d4b6a78c", size = 224190, upload-time = "2026-07-15T18:55:10.789Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/de/3a2883cf8a213659280ef4b403059e17a9acaeb7fc7fd4105e1226ff2e6d/coverage-7.15.2-cp313-cp313-win_arm64.whl", hash = "sha256:3ed010aa1b69cda8e827aabfca9866216c980e2dca82ab9a78c5f83689964c8b", size = 223583, upload-time = "2026-07-15T18:55:12.678Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/82/32e3bd191d498e64f6f911ad55d14006a0861e54869d2d32452326399e65/coverage-7.15.2-py3-none-any.whl", hash = "sha256:eb6bcae8d1a9d305351ecb108232441d11c5cfe9de840a04388ba5d2db8d735c", size = 213375, upload-time = "2026-07-15T18:56:17.305Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/d0/55fe630f4cf94e3fcba868240fad8c8cdd1f764e2a932f8926347e6ec4cd/coverage-7.15.2.tar.gz", hash = "sha256:3df60dc267f0a2ca23cb7a9ab1109c62b9335ffbf519fcfe167157c28c09b81d", size = 927741 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/d5/f8c838e6b7282976f7c918884b792df7a0c42c5bba5d99c60ad2d221d56d/coverage-7.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1121caa19159a38b5463eaae4b1e1fde81e525b15ecc5e000cd5b1a108f743a8", size = 221606 }, + { url = "https://files.pythonhosted.org/packages/bf/37/97c926376364f66298cc44893b89cdf17b8bc406376497c4061ae4b8a8ff/coverage-7.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a300c6934e0989c327b9e8a1e110329da4641149f872bbe9f70168be66da76c1", size = 221982 }, + { url = "https://files.pythonhosted.org/packages/b7/30/a36050a6e83c2135ee0776f452ca3948224befc6d7f26acecc082d0c106a/coverage-7.15.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2617f8799d268fabdeef42a7e89ac3a23e1deee9025427db2df970f99a89a578", size = 252972 }, + { url = "https://files.pythonhosted.org/packages/31/d3/06b5f1daf95f0f15ab05bd75f26ba5f3c8b33d0bb72f3aaa3cf41d1bad3a/coverage-7.15.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7dc2950a2992cd676d35c20ae63522836deeb034f08874699d14068710af3dc1", size = 255569 }, + { url = "https://files.pythonhosted.org/packages/81/1c/9afb3f8de2b8d36960391c48559a2e3ff96594b58099f115921549ea8d0d/coverage-7.15.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e36686f7a442185db2400b3df171aac520869faf9deb59df687d28659eda2a6", size = 256806 }, + { url = "https://files.pythonhosted.org/packages/64/d8/b989f96061a5e32d82fddd1b1b9ff48a7c8f8ae7606f0e80fd9de54b1e33/coverage-7.15.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7d29ca7bd67af6e12e74632d65f026eabc1364da5c254494cd914446a28a3ef7", size = 258936 }, + { url = "https://files.pythonhosted.org/packages/b8/fa/f99771f5110457c7b511c1935ca49ddf288218eaa84322e028b9334146ae/coverage-7.15.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:db9c8438057e5b0f6a22a0af99c0c1d26b57fbbdbd1be5861ddb8f897fcc3a2d", size = 253178 }, + { url = "https://files.pythonhosted.org/packages/f6/96/c098a6044d119c751ceede7be91035fa8310170ec24a6523aff72f0a5793/coverage-7.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:63022c4c8dec1d0342f05c3ede99842fe3d007689acc45e86f123a1746e4a026", size = 254934 }, + { url = "https://files.pythonhosted.org/packages/b2/a2/1457b3a7a50c8d77500103b97a046db863e2f59a1cf6d2f814595f349885/coverage-7.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6c0be82b4d4aa5b2704e08518e2252f3e3d110164bcca826816801052e48a7aa", size = 252898 }, + { url = "https://files.pythonhosted.org/packages/6c/0e/76958874c471ecfcdde0d2b2747bb2c61bdbf34a40636f4ce9db9923e643/coverage-7.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4510fb9cdf6bb02dfa6af0be4a534b8102d086e22e4a33f8836df663da3d660d", size = 257056 }, + { url = "https://files.pythonhosted.org/packages/7c/7c/3d7c4e3bf58baa40327dc7edc2272b17cf02299366d52763db1b0ca1556a/coverage-7.15.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:42ec3d989421b174a2ab607c1539f24127ad362757b7f1c0c0d7a2993f7eb37b", size = 252718 }, + { url = "https://files.pythonhosted.org/packages/c8/b8/1cecffed9ce14fb25be9ba42d37b6bb61485c9a3ddd43cd3dde36b6087d8/coverage-7.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8f91bce78e32343af184c3b7fa28fcf5a9e2641f4b6623d392038f804939188", size = 254490 }, + { url = "https://files.pythonhosted.org/packages/6c/2c/42984561bc7f4c045dca67516a0c50ee5ef8d84352dbeb5559dc86c4823e/coverage-7.15.2-cp313-cp313-win32.whl", hash = "sha256:434e68d531858205895eb0d74b73d20b84260de426387d53c422a5acda2cf050", size = 223647 }, + { url = "https://files.pythonhosted.org/packages/41/9f/39c7c9245efc583beddf89a87683574e663ed93637f3afb6cd7b88405676/coverage-7.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:26c3b04a6377fd7c09800921fa934e3a17c0020439cd59df73e73ae1d4b6a78c", size = 224190 }, + { url = "https://files.pythonhosted.org/packages/c7/de/3a2883cf8a213659280ef4b403059e17a9acaeb7fc7fd4105e1226ff2e6d/coverage-7.15.2-cp313-cp313-win_arm64.whl", hash = "sha256:3ed010aa1b69cda8e827aabfca9866216c980e2dca82ab9a78c5f83689964c8b", size = 223583 }, + { url = "https://files.pythonhosted.org/packages/ec/82/32e3bd191d498e64f6f911ad55d14006a0861e54869d2d32452326399e65/coverage-7.15.2-py3-none-any.whl", hash = "sha256:eb6bcae8d1a9d305351ecb108232441d11c5cfe9de840a04388ba5d2db8d735c", size = 213375 }, ] [[package]] name = "croniter" version = "6.2.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/57/2e2a65aee2a70483cb28e2b7e15a072d00a523207593b44400d4717bb100/croniter-6.2.4.tar.gz", hash = "sha256:fc124f751b1b04805c2a04b061898b436b45ab2320b045e1e052ea895de65189", size = 166267, upload-time = "2026-07-10T09:52:59.955Z" } +sdist = { url = "https://files.pythonhosted.org/packages/37/57/2e2a65aee2a70483cb28e2b7e15a072d00a523207593b44400d4717bb100/croniter-6.2.4.tar.gz", hash = "sha256:fc124f751b1b04805c2a04b061898b436b45ab2320b045e1e052ea895de65189", size = 166267 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/ba/d678e5bd329646ca51d3c92addbc77804e86d21f4b6b6a027218e6abb010/croniter-6.2.4-py3-none-any.whl", hash = "sha256:8ef3d544107a5c05a150a2d78f8bf5a8eb9c5c4d93405a736b824109574e3f4d", size = 46677, upload-time = "2026-07-10T09:52:58.425Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ba/d678e5bd329646ca51d3c92addbc77804e86d21f4b6b6a027218e6abb010/croniter-6.2.4-py3-none-any.whl", hash = "sha256:8ef3d544107a5c05a150a2d78f8bf5a8eb9c5c4d93405a736b824109574e3f4d", size = 46677 }, ] [[package]] name = "cronsim" version = "2.7" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/1a/02f105147f7f2e06ed4f734ff5a6439590bb275a53dd91fc73df6312298a/cronsim-2.7-py3-none-any.whl", hash = "sha256:1e1431fa08c51dc7f72e67e571c7c7a09af26420169b607badd4ca9677ffad1e", size = 14213, upload-time = "2025-10-21T16:38:20.431Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1a/02f105147f7f2e06ed4f734ff5a6439590bb275a53dd91fc73df6312298a/cronsim-2.7-py3-none-any.whl", hash = "sha256:1e1431fa08c51dc7f72e67e571c7c7a09af26420169b607badd4ca9677ffad1e", size = 14213 }, ] [[package]] name = "cryptography" version = "49.0.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db", size = 4032100, upload-time = "2026-06-12T20:02:32.143Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", size = 4692978, upload-time = "2026-06-12T20:01:21.305Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", size = 4716422, upload-time = "2026-06-12T20:01:48.566Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", size = 4700503, upload-time = "2026-06-12T20:02:47.091Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/99/a2c95cf8293f07491e9e27c20cc4dcd18176d944e674679adeb1d0173fd6/cryptography-49.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b", size = 5309779, upload-time = "2026-06-12T20:02:08.987Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", size = 4749683, upload-time = "2026-06-12T20:02:03.335Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", size = 4337874, upload-time = "2026-06-12T20:02:54.323Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", size = 4700283, upload-time = "2026-06-12T20:01:34.822Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c4/b6/d7696e4e890d6ae1469935164c9e5215c557671cb78d6e3f458ccceaa632/cryptography-49.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68", size = 5265844, upload-time = "2026-06-12T20:01:24.09Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", size = 4749290, upload-time = "2026-06-12T20:01:30.848Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", size = 4834612, upload-time = "2026-06-12T20:01:29.246Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", size = 4980804, upload-time = "2026-06-12T20:01:42.853Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/09/f42b1d190c5ba75f72062a387f8030d1d75f6ab035788f1d9c4b01de6525/cryptography-49.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e", size = 3810026, upload-time = "2026-06-12T20:02:39.262Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/2a/5bb823f5bedcf80718cea7fbc95ec5515cca3769633c4b01a32be7f30e7c/cryptography-49.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a", size = 4025947, upload-time = "2026-06-12T20:01:25.745Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", size = 4692429, upload-time = "2026-06-12T20:01:53.628Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", size = 4700968, upload-time = "2026-06-12T20:02:45.383Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", size = 4697758, upload-time = "2026-06-12T20:01:41.13Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/01/186c825898477d77e2324d5360fefe622ff1d8d1963ec0554e2cada8ec77/cryptography-49.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64", size = 5298863, upload-time = "2026-06-12T20:02:24.579Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", size = 4735983, upload-time = "2026-06-12T20:01:50.14Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", size = 4334173, upload-time = "2026-06-12T20:01:44.743Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", size = 4697298, upload-time = "2026-06-12T20:02:20.918Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/d0/a5fcd3515f0bae49a7b6d0413cc1bdccdcc1fc0047037a0d480642cdc5d6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8", size = 5254338, upload-time = "2026-06-12T20:02:22.737Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", size = 4735650, upload-time = "2026-06-12T20:02:41.389Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", size = 4834820, upload-time = "2026-06-12T20:01:51.847Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", size = 4967968, upload-time = "2026-06-12T20:02:12.524Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/e6/f60198ea8d9dfa15fff9ed4ca02ce362f6eadd9ba757dcc50634c4257b63/cryptography-49.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001", size = 3785547, upload-time = "2026-06-12T20:02:26.847Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db", size = 4032100 }, + { url = "https://files.pythonhosted.org/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", size = 4692978 }, + { url = "https://files.pythonhosted.org/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", size = 4716422 }, + { url = "https://files.pythonhosted.org/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", size = 4700503 }, + { url = "https://files.pythonhosted.org/packages/62/99/a2c95cf8293f07491e9e27c20cc4dcd18176d944e674679adeb1d0173fd6/cryptography-49.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b", size = 5309779 }, + { url = "https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", size = 4749683 }, + { url = "https://files.pythonhosted.org/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", size = 4337874 }, + { url = "https://files.pythonhosted.org/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", size = 4700283 }, + { url = "https://files.pythonhosted.org/packages/c4/b6/d7696e4e890d6ae1469935164c9e5215c557671cb78d6e3f458ccceaa632/cryptography-49.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68", size = 5265844 }, + { url = "https://files.pythonhosted.org/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", size = 4749290 }, + { url = "https://files.pythonhosted.org/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", size = 4834612 }, + { url = "https://files.pythonhosted.org/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", size = 4980804 }, + { url = "https://files.pythonhosted.org/packages/1f/09/f42b1d190c5ba75f72062a387f8030d1d75f6ab035788f1d9c4b01de6525/cryptography-49.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e", size = 3810026 }, + { url = "https://files.pythonhosted.org/packages/19/2a/5bb823f5bedcf80718cea7fbc95ec5515cca3769633c4b01a32be7f30e7c/cryptography-49.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a", size = 4025947 }, + { url = "https://files.pythonhosted.org/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", size = 4692429 }, + { url = "https://files.pythonhosted.org/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", size = 4700968 }, + { url = "https://files.pythonhosted.org/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", size = 4697758 }, + { url = "https://files.pythonhosted.org/packages/24/01/186c825898477d77e2324d5360fefe622ff1d8d1963ec0554e2cada8ec77/cryptography-49.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64", size = 5298863 }, + { url = "https://files.pythonhosted.org/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", size = 4735983 }, + { url = "https://files.pythonhosted.org/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", size = 4334173 }, + { url = "https://files.pythonhosted.org/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", size = 4697298 }, + { url = "https://files.pythonhosted.org/packages/67/d0/a5fcd3515f0bae49a7b6d0413cc1bdccdcc1fc0047037a0d480642cdc5d6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8", size = 5254338 }, + { url = "https://files.pythonhosted.org/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", size = 4735650 }, + { url = "https://files.pythonhosted.org/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", size = 4834820 }, + { url = "https://files.pythonhosted.org/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", size = 4967968 }, + { url = "https://files.pythonhosted.org/packages/c2/e6/f60198ea8d9dfa15fff9ed4ca02ce362f6eadd9ba757dcc50634c4257b63/cryptography-49.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001", size = 3785547 }, ] [[package]] name = "cyclopts" version = "4.22.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "docstring-parser" }, { name = "rich" }, { name = "rich-rst" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/47/32d992e829f63aedea5b93360db23c8882c9bbbde094bcf0fff899ea8a3b/cyclopts-4.22.1.tar.gz", hash = "sha256:49cd3779da7113a96ac5c23b151aa61ac9ae1b4b1fe813594d207ca843c97892", size = 193551, upload-time = "2026-07-20T17:38:59.38Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/47/32d992e829f63aedea5b93360db23c8882c9bbbde094bcf0fff899ea8a3b/cyclopts-4.22.1.tar.gz", hash = "sha256:49cd3779da7113a96ac5c23b151aa61ac9ae1b4b1fe813594d207ca843c97892", size = 193551 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/89/f2710638cd2f824cb976777e63ef6ed1e83fc56888cf5c9f5a053490b7be/cyclopts-4.22.1-py3-none-any.whl", hash = "sha256:9b614e231075aee9849c0bfd78f7611ab7adf417f16af5b9e42b9ed6e18c17d1", size = 232953, upload-time = "2026-07-20T17:38:58.078Z" }, + { url = "https://files.pythonhosted.org/packages/9a/89/f2710638cd2f824cb976777e63ef6ed1e83fc56888cf5c9f5a053490b7be/cyclopts-4.22.1-py3-none-any.whl", hash = "sha256:9b614e231075aee9849c0bfd78f7611ab7adf417f16af5b9e42b9ed6e18c17d1", size = 232953 }, ] [[package]] name = "dataclasses-json" version = "0.6.7" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "marshmallow" }, { name = "typing-inspect" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227, upload-time = "2024-06-09T16:20:19.103Z" } +sdist = { url = "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686, upload-time = "2024-06-09T16:20:16.715Z" }, + { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686 }, ] [[package]] name = "datamodel-code-generator" version = "0.70.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "argcomplete" }, { name = "black", marker = "sys_platform != 'emscripten'" }, @@ -1203,9 +906,9 @@ dependencies = [ { name = "pydantic" }, { name = "pyyaml" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/da/3f34411e9ef4d99fb774a506fabdf2c99f229612545fa213a9fab3d89661/datamodel_code_generator-0.70.0.tar.gz", hash = "sha256:eac611f052ede1dca4b37325d070d631a988a5936c69626a3de54e28472954c6", size = 1635415, upload-time = "2026-07-23T03:45:26.397Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/da/3f34411e9ef4d99fb774a506fabdf2c99f229612545fa213a9fab3d89661/datamodel_code_generator-0.70.0.tar.gz", hash = "sha256:eac611f052ede1dca4b37325d070d631a988a5936c69626a3de54e28472954c6", size = 1635415 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/ae/6a7da5c5b8e0e7667233e3ba0dd400131aa1cb688a1714a15fa989e36f59/datamodel_code_generator-0.70.0-py3-none-any.whl", hash = "sha256:4c3357328cf9998e9b1a6d4ad7ae4296f008563f9298aaa4e325b07418fafa40", size = 440877, upload-time = "2026-07-23T03:45:24.39Z" }, + { url = "https://files.pythonhosted.org/packages/01/ae/6a7da5c5b8e0e7667233e3ba0dd400131aa1cb688a1714a15fa989e36f59/datamodel_code_generator-0.70.0-py3-none-any.whl", hash = "sha256:4c3357328cf9998e9b1a6d4ad7ae4296f008563f9298aaa4e325b07418fafa40", size = 440877 }, ] [package.optional-dependencies] @@ -1216,87 +919,87 @@ ruff = [ [[package]] name = "deepmerge" version = "2.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/78/6e9e20106224083cfb817d2d3c26e80e72258d617b616721a169b87081e0/deepmerge-2.1.0.tar.gz", hash = "sha256:07ca7a7b8935df596c512fa8161877c0487ac61f691c07766e7d71d2b23bdd2f", size = 21449, upload-time = "2026-06-22T05:46:07.669Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/78/6e9e20106224083cfb817d2d3c26e80e72258d617b616721a169b87081e0/deepmerge-2.1.0.tar.gz", hash = "sha256:07ca7a7b8935df596c512fa8161877c0487ac61f691c07766e7d71d2b23bdd2f", size = 21449 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/25/2a75b47cb057b1e164c604fb81ab690a6cdb5e2260ce651194eae90f64a3/deepmerge-2.1.0-py3-none-any.whl", hash = "sha256:8f148339a91d680a75ecb74ade235d9e759a93df373a0b04e9d31c8666cfeb75", size = 14345, upload-time = "2026-06-22T05:46:06.742Z" }, + { url = "https://files.pythonhosted.org/packages/51/25/2a75b47cb057b1e164c604fb81ab690a6cdb5e2260ce651194eae90f64a3/deepmerge-2.1.0-py3-none-any.whl", hash = "sha256:8f148339a91d680a75ecb74ade235d9e759a93df373a0b04e9d31c8666cfeb75", size = 14345 }, ] [[package]] name = "defusedxml" version = "0.7.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" }, + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, ] [[package]] name = "deprecation" version = "2.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/d3/8ae2869247df154b64c1884d7346d412fed0c49df84db635aab2d1c40e62/deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff", size = 173788, upload-time = "2020-04-20T14:23:38.738Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/d3/8ae2869247df154b64c1884d7346d412fed0c49df84db635aab2d1c40e62/deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff", size = 173788 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a", size = 11178, upload-time = "2020-04-20T14:23:36.581Z" }, + { url = "https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a", size = 11178 }, ] [[package]] name = "devtools" version = "0.12.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asttokens" }, { name = "executing" }, { name = "pygments" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/84/75/b78198620640d394bc435c17bb49db18419afdd6cfa3ed8bcfe14034ec80/devtools-0.12.2.tar.gz", hash = "sha256:efceab184cb35e3a11fa8e602cc4fadacaa2e859e920fc6f87bf130b69885507" } +sdist = { url = "https://files.pythonhosted.org/packages/84/75/b78198620640d394bc435c17bb49db18419afdd6cfa3ed8bcfe14034ec80/devtools-0.12.2.tar.gz", hash = "sha256:efceab184cb35e3a11fa8e602cc4fadacaa2e859e920fc6f87bf130b69885507", size = 75005 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/ae/afb1487556e2dc827a17097aac8158a25b433a345386f0e249f6d2694ccb/devtools-0.12.2-py3-none-any.whl", hash = "sha256:c366e3de1df4cdd635f1ad8cbcd3af01a384d7abda71900e68d43b04eb6aaca7" }, + { url = "https://files.pythonhosted.org/packages/d1/ae/afb1487556e2dc827a17097aac8158a25b433a345386f0e249f6d2694ccb/devtools-0.12.2-py3-none-any.whl", hash = "sha256:c366e3de1df4cdd635f1ad8cbcd3af01a384d7abda71900e68d43b04eb6aaca7", size = 19411 }, ] [[package]] name = "dirty-equals" version = "0.11" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/1d/c5913ac9d6615515a00f4bdc71356d302437cb74ff2e9aaccd3c14493b78/dirty_equals-0.11.tar.gz", hash = "sha256:f4ac74ee88f2d11e2fa0f65eb30ee4f07105c5f86f4dc92b09eb1138775027c3", size = 128067, upload-time = "2025-11-17T01:51:24.451Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/1d/c5913ac9d6615515a00f4bdc71356d302437cb74ff2e9aaccd3c14493b78/dirty_equals-0.11.tar.gz", hash = "sha256:f4ac74ee88f2d11e2fa0f65eb30ee4f07105c5f86f4dc92b09eb1138775027c3", size = 128067 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bb/8d/dbff05239043271dbeace563a7686212a3dd517864a35623fe4d4a64ca19/dirty_equals-0.11-py3-none-any.whl", hash = "sha256:b1d7093273fc2f9be12f443a8ead954ef6daaf6746fd42ef3a5616433ee85286", size = 28051, upload-time = "2025-11-17T01:51:22.849Z" }, + { url = "https://files.pythonhosted.org/packages/bb/8d/dbff05239043271dbeace563a7686212a3dd517864a35623fe4d4a64ca19/dirty_equals-0.11-py3-none-any.whl", hash = "sha256:b1d7093273fc2f9be12f443a8ead954ef6daaf6746fd42ef3a5616433ee85286", size = 28051 }, ] [[package]] name = "diskcache" version = "5.6.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19" }, + { url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550 }, ] [[package]] name = "distro" version = "1.9.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, ] [[package]] name = "dnspython" version = "2.8.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, + { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094 }, ] [[package]] name = "docler" version = "2.1.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyenv" }, { name = "mkdown" }, @@ -1307,78 +1010,78 @@ dependencies = [ { name = "schemez" }, { name = "upathtools" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d5/fa/9d0da5814fae67fc890613f1dcf00fca0b1aea4fbf430502a1f76a20e2fa/docler-2.1.1.tar.gz", hash = "sha256:e231309e648924e8218475e37838ea1b917799d3cb5dfa7c10e7d31851fb7354", size = 1406248, upload-time = "2026-01-04T03:40:00.131Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/fa/9d0da5814fae67fc890613f1dcf00fca0b1aea4fbf430502a1f76a20e2fa/docler-2.1.1.tar.gz", hash = "sha256:e231309e648924e8218475e37838ea1b917799d3cb5dfa7c10e7d31851fb7354", size = 1406248 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/44/64/f5901aa7e2029944de35b243164c0f01a45c06355d004a3b17cb0484de4b/docler-2.1.1-py3-none-any.whl", hash = "sha256:446d2476530017465519cb4d2da7d836a7b2cf531032bd16a3867549aef737ae", size = 1444038, upload-time = "2026-01-04T03:40:04.19Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/f5901aa7e2029944de35b243164c0f01a45c06355d004a3b17cb0484de4b/docler-2.1.1-py3-none-any.whl", hash = "sha256:446d2476530017465519cb4d2da7d836a7b2cf531032bd16a3867549aef737ae", size = 1444038 }, ] [[package]] name = "docstring-parser" version = "0.18.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/4d/f332313098c1de1b2d2ff91cf2674415cc7cddab2ca1b01ae29774bd5fdf/docstring_parser-0.18.0.tar.gz", hash = "sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015", size = 29341, upload-time = "2026-04-14T04:09:19.867Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/4d/f332313098c1de1b2d2ff91cf2674415cc7cddab2ca1b01ae29774bd5fdf/docstring_parser-0.18.0.tar.gz", hash = "sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015", size = 29341 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a7/5f/ed01f9a3cdffbd5a008556fc7b2a08ddb1cc6ace7effa7340604b1d16699/docstring_parser-0.18.0-py3-none-any.whl", hash = "sha256:b3fcbed555c47d8479be0796ef7e19c2670d428d72e96da63f3a40122860374b", size = 22484, upload-time = "2026-04-14T04:09:18.638Z" }, + { url = "https://files.pythonhosted.org/packages/a7/5f/ed01f9a3cdffbd5a008556fc7b2a08ddb1cc6ace7effa7340604b1d16699/docstring_parser-0.18.0-py3-none-any.whl", hash = "sha256:b3fcbed555c47d8479be0796ef7e19c2670d428d72e96da63f3a40122860374b", size = 22484 }, ] [[package]] name = "edge-tts" version = "7.2.8" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, { name = "certifi" }, { name = "tabulate" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/60/afbf548b43c78355e03926c6b1fff7500303a2da4d84db9e1324119e21ae/edge_tts-7.2.8.tar.gz", hash = "sha256:fcf185a0d527a0d2d003f9d5841facc1d5e0e7b3b88d5df9c32990402c6b8cd0", size = 27875, upload-time = "2026-03-22T19:57:50.962Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/60/afbf548b43c78355e03926c6b1fff7500303a2da4d84db9e1324119e21ae/edge_tts-7.2.8.tar.gz", hash = "sha256:fcf185a0d527a0d2d003f9d5841facc1d5e0e7b3b88d5df9c32990402c6b8cd0", size = 27875 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/2b/a8cb687b92a2690d2ad171f0c2fd1c8f18690363cca7618bab2bbe4cdf2b/edge_tts-7.2.8-py3-none-any.whl", hash = "sha256:361fe48ce7ef613adbe30f664e3765dd71029c6cb57427279eff8ad6df2eb211", size = 31026, upload-time = "2026-03-22T19:57:49.672Z" }, + { url = "https://files.pythonhosted.org/packages/8c/2b/a8cb687b92a2690d2ad171f0c2fd1c8f18690363cca7618bab2bbe4cdf2b/edge_tts-7.2.8-py3-none-any.whl", hash = "sha256:361fe48ce7ef613adbe30f664e3765dd71029c6cb57427279eff8ad6df2eb211", size = 31026 }, ] [[package]] name = "email-validator" version = "2.3.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dnspython" }, { name = "idna" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" }, + { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604 }, ] [[package]] name = "epregistry" version = "2.0.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/c2/fa050adee0743de7bc55d923d938398dcc22c76a13161b5c4fd350f71eda/epregistry-2.0.3.tar.gz", hash = "sha256:c0e54fd2dcb9eadb61837b5ad6729a7567dbc98b98bbd4e00628ad7caf49c216", size = 11829, upload-time = "2025-11-29T01:04:41.244Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/c2/fa050adee0743de7bc55d923d938398dcc22c76a13161b5c4fd350f71eda/epregistry-2.0.3.tar.gz", hash = "sha256:c0e54fd2dcb9eadb61837b5ad6729a7567dbc98b98bbd4e00628ad7caf49c216", size = 11829 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/29/2d/f8dcdfa47df719e0c5efba6f6212b09d0fe5fb247a6f26649e17311f9838/epregistry-2.0.3-py3-none-any.whl", hash = "sha256:9dfbc47787558c72d3f54290a7586b8b2202309eec2bedddad95c50170ef876b", size = 11773, upload-time = "2025-11-29T01:04:40.129Z" }, + { url = "https://files.pythonhosted.org/packages/29/2d/f8dcdfa47df719e0c5efba6f6212b09d0fe5fb247a6f26649e17311f9838/epregistry-2.0.3-py3-none-any.whl", hash = "sha256:9dfbc47787558c72d3f54290a7586b8b2202309eec2bedddad95c50170ef876b", size = 11773 }, ] [[package]] name = "eval-type-backport" version = "0.4.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/15/273a4baf8248d6d76220723c3caf039d283774b31a7c46ba686120145b76/eval_type_backport-0.4.0.tar.gz", hash = "sha256:8397d25e6524c2e67b9576bb0636be27dea2192017711220c534ec2de921e9b0", size = 10260, upload-time = "2026-06-02T13:22:06.059Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/15/273a4baf8248d6d76220723c3caf039d283774b31a7c46ba686120145b76/eval_type_backport-0.4.0.tar.gz", hash = "sha256:8397d25e6524c2e67b9576bb0636be27dea2192017711220c534ec2de921e9b0", size = 10260 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/a7/bb99bf5e6f78736ddb53480f2c3ff3702ffe2196a7c5e1661c03081d398e/eval_type_backport-0.4.0-py3-none-any.whl", hash = "sha256:ad5e2a8db71b6696a56eafb938b0f5a337d3217f256b8e158b469422b4772b20", size = 6432, upload-time = "2026-06-02T13:22:04.827Z" }, + { url = "https://files.pythonhosted.org/packages/50/a7/bb99bf5e6f78736ddb53480f2c3ff3702ffe2196a7c5e1661c03081d398e/eval_type_backport-0.4.0-py3-none-any.whl", hash = "sha256:ad5e2a8db71b6696a56eafb938b0f5a337d3217f256b8e158b469422b4772b20", size = 6432 }, ] [[package]] name = "evented" version = "1.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyenv" }, { name = "pydantic" }, { name = "schemez" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/bb/8eb332b5cff32f01e6d719186dec43f94cc3cf44bb9043ffe567febc731f/evented-1.1.0.tar.gz", hash = "sha256:7cab246065417fcac8a5531c4a96ac7467ebe9f6eecddc2047e986cfb265a1ca", size = 16248, upload-time = "2026-01-04T07:12:23.393Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/bb/8eb332b5cff32f01e6d719186dec43f94cc3cf44bb9043ffe567febc731f/evented-1.1.0.tar.gz", hash = "sha256:7cab246065417fcac8a5531c4a96ac7467ebe9f6eecddc2047e986cfb265a1ca", size = 16248 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/86/4246272170071672ddcb30b415edf32a71391b6eae93ba0365761eab0678/evented-1.1.0-py3-none-any.whl", hash = "sha256:ed8e0a30c54b24029851b2b8508cb7e4353b04bb919bf2db19dbaa57c5a06bed", size = 19801, upload-time = "2026-01-04T07:12:24.585Z" }, + { url = "https://files.pythonhosted.org/packages/a3/86/4246272170071672ddcb30b415edf32a71391b6eae93ba0365761eab0678/evented-1.1.0-py3-none-any.whl", hash = "sha256:ed8e0a30c54b24029851b2b8508cb7e4353b04bb919bf2db19dbaa57c5a06bed", size = 19801 }, ] [package.optional-dependencies] @@ -1392,7 +1095,7 @@ all = [ [[package]] name = "exa-py" version = "2.16.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpcore" }, { name = "httpx" }, @@ -1402,71 +1105,71 @@ dependencies = [ { name = "requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/a3/dabad8d3dbdb50d2ad49f426cc3e1fb47a0d0fd6ba10fbb27219c9bef684/exa_py-2.16.0.tar.gz", hash = "sha256:dce0db698720b1b7b39b58a1a17ad65fcc5969ee47f810cff5bcc836aeb0f777", size = 63530, upload-time = "2026-07-02T01:04:38.797Z" } +sdist = { url = "https://files.pythonhosted.org/packages/68/a3/dabad8d3dbdb50d2ad49f426cc3e1fb47a0d0fd6ba10fbb27219c9bef684/exa_py-2.16.0.tar.gz", hash = "sha256:dce0db698720b1b7b39b58a1a17ad65fcc5969ee47f810cff5bcc836aeb0f777", size = 63530 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/c8/69d100ed12f8493ab8b9d03bf20cd0080a3a60dec4abadb1782cc4f91969/exa_py-2.16.0-py3-none-any.whl", hash = "sha256:cf726f801d6e4be25f38275a6318b536445a92077450a11cb3d7e493ea77ecc2", size = 86866, upload-time = "2026-07-02T01:04:37.451Z" }, + { url = "https://files.pythonhosted.org/packages/3c/c8/69d100ed12f8493ab8b9d03bf20cd0080a3a60dec4abadb1782cc4f91969/exa_py-2.16.0-py3-none-any.whl", hash = "sha256:cf726f801d6e4be25f38275a6318b536445a92077450a11cb3d7e493ea77ecc2", size = 86866 }, ] [[package]] name = "exceptiongroup" version = "1.3.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/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" }, + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740 }, ] [[package]] name = "execnet" version = "2.1.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622, upload-time = "2025-11-12T09:56:37.75Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708, upload-time = "2025-11-12T09:56:36.333Z" }, + { url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708 }, ] [[package]] name = "executing" version = "2.2.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317 }, ] [[package]] name = "extism" version = "1.1.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "extism-sys" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cc/c6/573488066680ef80ba6a46ab5e0df42aa4beafac51d2c3cc140a062531af/extism-1.1.1.tar.gz", hash = "sha256:067bf4ebd89ba85681508a77eb7f213ab13d2dbd6e71dabdac5d9622c61ee1d1", size = 11589, upload-time = "2026-03-26T22:03:42.955Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/573488066680ef80ba6a46ab5e0df42aa4beafac51d2c3cc140a062531af/extism-1.1.1.tar.gz", hash = "sha256:067bf4ebd89ba85681508a77eb7f213ab13d2dbd6e71dabdac5d9622c61ee1d1", size = 11589 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/ac/f730be96df64fd3c85b0c24f16993181f72b72dfba3099ad86d49a55e7c0/extism-1.1.1-py3-none-any.whl", hash = "sha256:157692d7dc79cde6b1c9759eaf765f04b34b28e1f3a4a84507294c06081c8e5b", size = 11210, upload-time = "2026-03-26T22:03:42.092Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ac/f730be96df64fd3c85b0c24f16993181f72b72dfba3099ad86d49a55e7c0/extism-1.1.1-py3-none-any.whl", hash = "sha256:157692d7dc79cde6b1c9759eaf765f04b34b28e1f3a4a84507294c06081c8e5b", size = 11210 }, ] [[package]] name = "extism-sys" version = "1.12.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/30/06f1cbe28c3eb486dffc87b9d4e3d5522a8656fac86c9c05cc102f74732b/extism_sys-1.12.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f0225b2b2969bda66b0acab5ad13489e80b1b03b2fa7ad7be06dab57a381968d", size = 7597910, upload-time = "2025-07-14T18:53:50.102Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/1e/37a0c9422105909dd3932eac955c15122b9797ae305d6da3046b7036a9e3/extism_sys-1.12.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:242f021d12feee10bf67cc9a08c078d9b5e1da5c7a74f1f2eef61c10da36fccd", size = 7120898, upload-time = "2025-07-14T18:53:51.489Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/1f/50d6a4d22e8be5e50d379aee27cde1564c726ca42f3194d1b970a079f239/extism_sys-1.12.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db850dc58081b48d0d50a8c7395806cbe764b82c50a971c0be00519bf336200b", size = 8355066, upload-time = "2025-07-14T18:53:52.825Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/7a/88fad64e8ae9bce4d2d26495e14600100145ecc3e3218fe9766b5e70d31f/extism_sys-1.12.0-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:687a1b1f1c009383aa466fe12b35ddda54d84c1775fc583e256a946e2bd17561", size = 7912809, upload-time = "2025-07-14T18:53:54.733Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/f6/50ff821a6ff825f89cc4ccccfcff46ac3755b474edfb1651fcd767196586/extism_sys-1.12.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:24f15d958db96bd17cd8a98dee9c172d0bd71094ff71cf9de193645a80d30269", size = 8087657, upload-time = "2025-07-14T18:53:56.065Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bd/81/d32e279cd464292f5a51ee68d47f643012d937664259f03d5639630867ca/extism_sys-1.12.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9be0c414e08414d4ce5356a185b4f05cff780352feb6755b75a75455e84c3d0f", size = 8523720, upload-time = "2025-07-14T18:53:57.356Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/54/4c/aeaeb544f667693690bf48101f6a11d1c87784c7622af6f7aa5427602fe5/extism_sys-1.12.0-py3-none-win_amd64.whl", hash = "sha256:be2ddf0120117ac495e8686f5bc80ab64a5ffe0b55b8fa2b77ee23b5ea0b3836", size = 6588019, upload-time = "2025-07-14T18:53:59.149Z" }, + { url = "https://files.pythonhosted.org/packages/01/30/06f1cbe28c3eb486dffc87b9d4e3d5522a8656fac86c9c05cc102f74732b/extism_sys-1.12.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f0225b2b2969bda66b0acab5ad13489e80b1b03b2fa7ad7be06dab57a381968d", size = 7597910 }, + { url = "https://files.pythonhosted.org/packages/04/1e/37a0c9422105909dd3932eac955c15122b9797ae305d6da3046b7036a9e3/extism_sys-1.12.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:242f021d12feee10bf67cc9a08c078d9b5e1da5c7a74f1f2eef61c10da36fccd", size = 7120898 }, + { url = "https://files.pythonhosted.org/packages/42/1f/50d6a4d22e8be5e50d379aee27cde1564c726ca42f3194d1b970a079f239/extism_sys-1.12.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db850dc58081b48d0d50a8c7395806cbe764b82c50a971c0be00519bf336200b", size = 8355066 }, + { url = "https://files.pythonhosted.org/packages/d9/7a/88fad64e8ae9bce4d2d26495e14600100145ecc3e3218fe9766b5e70d31f/extism_sys-1.12.0-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:687a1b1f1c009383aa466fe12b35ddda54d84c1775fc583e256a946e2bd17561", size = 7912809 }, + { url = "https://files.pythonhosted.org/packages/79/f6/50ff821a6ff825f89cc4ccccfcff46ac3755b474edfb1651fcd767196586/extism_sys-1.12.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:24f15d958db96bd17cd8a98dee9c172d0bd71094ff71cf9de193645a80d30269", size = 8087657 }, + { url = "https://files.pythonhosted.org/packages/bd/81/d32e279cd464292f5a51ee68d47f643012d937664259f03d5639630867ca/extism_sys-1.12.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9be0c414e08414d4ce5356a185b4f05cff780352feb6755b75a75455e84c3d0f", size = 8523720 }, + { url = "https://files.pythonhosted.org/packages/54/4c/aeaeb544f667693690bf48101f6a11d1c87784c7622af6f7aa5427602fe5/extism_sys-1.12.0-py3-none-win_amd64.whl", hash = "sha256:be2ddf0120117ac495e8686f5bc80ab64a5ffe0b55b8fa2b77ee23b5ea0b3836", size = 6588019 }, ] [[package]] name = "exxec" version = "0.4.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyenv" }, { name = "ptyprocess" }, @@ -1474,29 +1177,29 @@ dependencies = [ { name = "schemez" }, { name = "upathtools" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/e3/4704f37bcfc30c07baf401254340ac48be6be80c439eff039813d6dc227e/exxec-0.4.1.tar.gz", hash = "sha256:12abc6324d421bdecf337193b324230b241eaab8a3d0e477e0e077315bb4264f", size = 94422, upload-time = "2026-04-25T02:28:55.746Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/e3/4704f37bcfc30c07baf401254340ac48be6be80c439eff039813d6dc227e/exxec-0.4.1.tar.gz", hash = "sha256:12abc6324d421bdecf337193b324230b241eaab8a3d0e477e0e077315bb4264f", size = 94422 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/34/c66b5a28616e17ded711fee9d596bda9f5cece41001973a0d1319a61c333/exxec-0.4.1-py3-none-any.whl", hash = "sha256:623215b41a63da4ef77e4b03c5a07626abae602ebd0657740002e79748598984", size = 133988, upload-time = "2026-04-25T02:29:01.106Z" }, + { url = "https://files.pythonhosted.org/packages/d3/34/c66b5a28616e17ded711fee9d596bda9f5cece41001973a0d1319a61c333/exxec-0.4.1-py3-none-any.whl", hash = "sha256:623215b41a63da4ef77e4b03c5a07626abae602ebd0657740002e79748598984", size = 133988 }, ] [[package]] name = "fasta2a" version = "0.6.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "pydantic" }, { name = "starlette" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/28/35949997804129537becf17d0635b8b2b67036589a4da851e44a053857fc/fasta2a-0.6.1.tar.gz", hash = "sha256:e97b92771ad338166b1516dcbb687c9f3f8392a5cd5820542ec4b75ff5219a48", size = 1453473, upload-time = "2026-05-15T20:51:22.059Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/28/35949997804129537becf17d0635b8b2b67036589a4da851e44a053857fc/fasta2a-0.6.1.tar.gz", hash = "sha256:e97b92771ad338166b1516dcbb687c9f3f8392a5cd5820542ec4b75ff5219a48", size = 1453473 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/21/4d7e00c10bb4ec33a196efc55190ae086e97f5f487945bdfceb94df3e8d8/fasta2a-0.6.1-py3-none-any.whl", hash = "sha256:1b5369ee1b62405eebafa6d71c57c9e40a1a3f0dcbae5ec3aa6ee450361028dd", size = 28888, upload-time = "2026-05-15T20:51:20.222Z" }, + { url = "https://files.pythonhosted.org/packages/21/21/4d7e00c10bb4ec33a196efc55190ae086e97f5f487945bdfceb94df3e8d8/fasta2a-0.6.1-py3-none-any.whl", hash = "sha256:1b5369ee1b62405eebafa6d71c57c9e40a1a3f0dcbae5ec3aa6ee450361028dd", size = 28888 }, ] [[package]] name = "fastapi" version = "0.139.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, { name = "pydantic" }, @@ -1504,15 +1207,15 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/95/d3f0ae10836324a2eab98a52b61210ac609f08200bf4bb0dc8132d32f78a/fastapi-0.139.2.tar.gz", hash = "sha256:333145a6891e9b5b3cfceb69baf817e8240cde4d4588ae5a10bf56ffacb6255e", size = 423428, upload-time = "2026-07-16T15:06:17.912Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/95/d3f0ae10836324a2eab98a52b61210ac609f08200bf4bb0dc8132d32f78a/fastapi-0.139.2.tar.gz", hash = "sha256:333145a6891e9b5b3cfceb69baf817e8240cde4d4588ae5a10bf56ffacb6255e", size = 423428 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/c7/cb03251d9dfb177246a9809a76f189d21df32dbd4a845951881d11323b7f/fastapi-0.139.2-py3-none-any.whl", hash = "sha256:b9ad015a835173d59865e2f5d8296fbc2b317bf56a2ba1a5bfbdd03de2fd4b1c", size = 130234, upload-time = "2026-07-16T15:06:19.557Z" }, + { url = "https://files.pythonhosted.org/packages/5f/c7/cb03251d9dfb177246a9809a76f189d21df32dbd4a845951881d11323b7f/fastapi-0.139.2-py3-none-any.whl", hash = "sha256:b9ad015a835173d59865e2f5d8296fbc2b317bf56a2ba1a5bfbdd03de2fd4b1c", size = 130234 }, ] [[package]] name = "fastembed" version = "0.8.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, { name = "loguru" }, @@ -1525,27 +1228,27 @@ dependencies = [ { name = "tokenizers" }, { name = "tqdm" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/25/58865e36b6e8a9a0d0ff905b5601aa30db97956327c0df42ec4ed6accc21/fastembed-0.8.0.tar.gz", hash = "sha256:75966edfa8b006ee78514c726bd7f6a50721dadc89305279052be9db72fd53e8", size = 75115, upload-time = "2026-03-23T16:34:41.699Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/25/58865e36b6e8a9a0d0ff905b5601aa30db97956327c0df42ec4ed6accc21/fastembed-0.8.0.tar.gz", hash = "sha256:75966edfa8b006ee78514c726bd7f6a50721dadc89305279052be9db72fd53e8", size = 75115 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/e8/26b7d78bb8972498c467ca34cb12ee2e60d26ba5eae6d8443189a1af37a5/fastembed-0.8.0-py3-none-any.whl", hash = "sha256:40bee672657574a1009e35ec50030a55f2b426842cb011845379817641bbbbd0", size = 116572, upload-time = "2026-03-23T16:34:40.69Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e8/26b7d78bb8972498c467ca34cb12ee2e60d26ba5eae6d8443189a1af37a5/fastembed-0.8.0-py3-none-any.whl", hash = "sha256:40bee672657574a1009e35ec50030a55f2b426842cb011845379817641bbbbd0", size = 116572 }, ] [[package]] name = "fastmcp" version = "3.4.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fastmcp-slim", extra = ["client", "server"] }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9c/f7/5188565d1b93ad611cbd80bf473e7ad669d1f3b689c4bedcd304e1ec3472/fastmcp-3.4.4.tar.gz", hash = "sha256:378202e26ec15b23819d9a1c0d1b0ebda096bc712720532010a0b82a45c2b1df", size = 28796458, upload-time = "2026-07-09T00:32:41.352Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/f7/5188565d1b93ad611cbd80bf473e7ad669d1f3b689c4bedcd304e1ec3472/fastmcp-3.4.4.tar.gz", hash = "sha256:378202e26ec15b23819d9a1c0d1b0ebda096bc712720532010a0b82a45c2b1df", size = 28796458 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/67/3cef84ba38a23dca1e1e776bfda8a35ab3c7a6c94a8ca81d0715de6dd3c5/fastmcp-3.4.4-py3-none-any.whl", hash = "sha256:f86f208713212260068cf55c32936839eee856fefc7808e18a032f31eb0f718e", size = 8019, upload-time = "2026-07-09T00:32:39.411Z" }, + { url = "https://files.pythonhosted.org/packages/5f/67/3cef84ba38a23dca1e1e776bfda8a35ab3c7a6c94a8ca81d0715de6dd3c5/fastmcp-3.4.4-py3-none-any.whl", hash = "sha256:f86f208713212260068cf55c32936839eee856fefc7808e18a032f31eb0f718e", size = 8019 }, ] [[package]] name = "fastmcp-slim" version = "3.4.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "platformdirs" }, { name = "pydantic", extra = ["email"] }, @@ -1554,9 +1257,9 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/79/f35661c6a1d76dfbe17a079f912d96fffcfdd40fad5a9144bb9e7dfb1fdf/fastmcp_slim-3.4.4.tar.gz", hash = "sha256:dcaa3e0be2127d7eacdce592c2ef0039204923dc0ec396454615cb4a3275b078", size = 590203, upload-time = "2026-07-09T00:32:20.531Z" } +sdist = { url = "https://files.pythonhosted.org/packages/45/79/f35661c6a1d76dfbe17a079f912d96fffcfdd40fad5a9144bb9e7dfb1fdf/fastmcp_slim-3.4.4.tar.gz", hash = "sha256:dcaa3e0be2127d7eacdce592c2ef0039204923dc0ec396454615cb4a3275b078", size = 590203 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/91/321e0b2e9ed70d0628b17ddaec76fc7b09f3e1d5d290f70bf101a2890142/fastmcp_slim-3.4.4-py3-none-any.whl", hash = "sha256:9d3a6327b9ee835188eb7323fc3b5d4cd061631b48da8ece56794bb538972505", size = 765158, upload-time = "2026-07-09T00:32:19.11Z" }, + { url = "https://files.pythonhosted.org/packages/16/91/321e0b2e9ed70d0628b17ddaec76fc7b09f3e1d5d290f70bf101a2890142/fastmcp_slim-3.4.4-py3-none-any.whl", hash = "sha256:9d3a6327b9ee835188eb7323fc3b5d4cd061631b48da8ece56794bb538972505", size = 765158 }, ] [package.optional-dependencies] @@ -1596,179 +1299,179 @@ server = [ [[package]] name = "fieldz" version = "0.2.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/46/7a8d1db959eabd5d3e52bd3c000a8b132184b7651cbd5481c4cbf31ff65d/fieldz-0.2.0.tar.gz", hash = "sha256:e11215188cad5c5371113d2b7707155960efd0d48500b6bf675648bc3f6fc8d6", size = 18222, upload-time = "2026-02-24T19:26:02.251Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/46/7a8d1db959eabd5d3e52bd3c000a8b132184b7651cbd5481c4cbf31ff65d/fieldz-0.2.0.tar.gz", hash = "sha256:e11215188cad5c5371113d2b7707155960efd0d48500b6bf675648bc3f6fc8d6", size = 18222 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/9d/9034acaf3d80e85deb3d49876cb734479327b9cf89a918815ef67cb6b36c/fieldz-0.2.0-py3-none-any.whl", hash = "sha256:43b5be702816df39f55d08ae392eaabe58d3c69d2e4b61a853252cb2da41931f", size = 17946, upload-time = "2026-02-24T19:26:00.931Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9d/9034acaf3d80e85deb3d49876cb734479327b9cf89a918815ef67cb6b36c/fieldz-0.2.0-py3-none-any.whl", hash = "sha256:43b5be702816df39f55d08ae392eaabe58d3c69d2e4b61a853252cb2da41931f", size = 17946 }, ] [[package]] name = "filelock" version = "3.32.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/80/8232b582c4b318b817cf1274ba74976b07b34d35ef439b3eb948f98645a1/filelock-3.32.0.tar.gz", hash = "sha256:7be2ad23a14607ccc71808e68fe30848aeace7058ace17852f68e2a68e310402", size = 213757, upload-time = "2026-07-21T13:17:42.898Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/80/8232b582c4b318b817cf1274ba74976b07b34d35ef439b3eb948f98645a1/filelock-3.32.0.tar.gz", hash = "sha256:7be2ad23a14607ccc71808e68fe30848aeace7058ace17852f68e2a68e310402", size = 213757 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/79/b4c714bef36bc4ec2beeae1e0c124f0223888cd8c6feb1cdc56038116920/filelock-3.32.0-py3-none-any.whl", hash = "sha256:d396bea984af47333ef05e50eae7eff88c84256de6112aea0ec48a233c064fe3", size = 97732, upload-time = "2026-07-21T13:17:41.55Z" }, + { url = "https://files.pythonhosted.org/packages/06/79/b4c714bef36bc4ec2beeae1e0c124f0223888cd8c6feb1cdc56038116920/filelock-3.32.0-py3-none-any.whl", hash = "sha256:d396bea984af47333ef05e50eae7eff88c84256de6112aea0ec48a233c064fe3", size = 97732 }, ] [[package]] name = "flatbuffers" version = "25.12.19" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl", hash = "sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4", size = 26661, upload-time = "2025-12-19T23:16:13.622Z" }, + { url = "https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl", hash = "sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4", size = 26661 }, ] [[package]] name = "frozenlist" version = "1.8.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717 }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651 }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417 }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391 }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048 }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549 }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833 }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363 }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314 }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365 }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763 }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110 }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717 }, + { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628 }, + { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882 }, + { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676 }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235 }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742 }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725 }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506 }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161 }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676 }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638 }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067 }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101 }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901 }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395 }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659 }, + { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492 }, + { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034 }, + { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749 }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409 }, ] [[package]] name = "fsspec" version = "2026.6.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/a1/ae4e3e5003468d6391d2c77b6fa1cd73bd5d13511d81c642d7b28ac90ed4/fsspec-2026.6.0.tar.gz", hash = "sha256:f5bac145310fe30e16e1471bd6840b2d990d609e872251d7e674241822abf01a", size = 313646, upload-time = "2026-06-16T01:57:28.105Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/10/a1/ae4e3e5003468d6391d2c77b6fa1cd73bd5d13511d81c642d7b28ac90ed4/fsspec-2026.6.0.tar.gz", hash = "sha256:f5bac145310fe30e16e1471bd6840b2d990d609e872251d7e674241822abf01a", size = 313646 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/22/4222d7ddf3da30f363edaa98e329c2bce6c65497c9cb2810931c8b2c0fbc/fsspec-2026.6.0-py3-none-any.whl", hash = "sha256:02e0b71817df9b2169dc30a16832045764def1191b43dcff5bb85bdee212d2a1", size = 203949, upload-time = "2026-06-16T01:57:26.358Z" }, + { url = "https://files.pythonhosted.org/packages/e5/22/4222d7ddf3da30f363edaa98e329c2bce6c65497c9cb2810931c8b2c0fbc/fsspec-2026.6.0-py3-none-any.whl", hash = "sha256:02e0b71817df9b2169dc30a16832045764def1191b43dcff5bb85bdee212d2a1", size = 203949 }, ] [[package]] name = "genai-prices" version = "0.0.72" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx2" }, { name = "pydantic" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/c8/2549fa8ceaaf0bd61114cf392250a107be657233723bc4e65cb91dba934f/genai_prices-0.0.72.tar.gz", hash = "sha256:a7e481d0ea85922fcf48df6864f2491fc81a4f03dcf0ecbd9aa8c2c6d9fcdbe8", size = 82753, upload-time = "2026-07-22T21:11:03.997Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/c8/2549fa8ceaaf0bd61114cf392250a107be657233723bc4e65cb91dba934f/genai_prices-0.0.72.tar.gz", hash = "sha256:a7e481d0ea85922fcf48df6864f2491fc81a4f03dcf0ecbd9aa8c2c6d9fcdbe8", size = 82753 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/2e/1e2c31666f7e4e2d0327a80f1c920fd8764ccd27672c4bc389d79219ece6/genai_prices-0.0.72-py3-none-any.whl", hash = "sha256:21281d8df34d9bfbb736e0763a60ceda02226938cd47379ae437a44fcf8ba23d", size = 85238, upload-time = "2026-07-22T21:11:02.911Z" }, + { url = "https://files.pythonhosted.org/packages/22/2e/1e2c31666f7e4e2d0327a80f1c920fd8764ccd27672c4bc389d79219ece6/genai_prices-0.0.72-py3-none-any.whl", hash = "sha256:21281d8df34d9bfbb736e0763a60ceda02226938cd47379ae437a44fcf8ba23d", size = 85238 }, ] [[package]] name = "genson" version = "1.4.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/53/de162dc8e03fccd9ebe59d17c7812378fe8bd2b604f6b1b94d00165140ac/genson-1.4.0.tar.gz", hash = "sha256:bc7f1c1bae87a21ca44d81149aec95a3f4468d676de9b8b08caa064f3c50b3da", size = 47908, upload-time = "2026-07-06T08:21:50.331Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/53/de162dc8e03fccd9ebe59d17c7812378fe8bd2b604f6b1b94d00165140ac/genson-1.4.0.tar.gz", hash = "sha256:bc7f1c1bae87a21ca44d81149aec95a3f4468d676de9b8b08caa064f3c50b3da", size = 47908 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/02/767f744ab6d4cb7761e5008acc3d534b7a0481af62563d52e391fbcb2140/genson-1.4.0-py3-none-any.whl", hash = "sha256:03bc71bbe52defde70660cc4dcd1ea1097997da5a1cbb90a9dbd3acc7c9e1b65", size = 24484, upload-time = "2026-07-06T08:21:49.046Z" }, + { url = "https://files.pythonhosted.org/packages/16/02/767f744ab6d4cb7761e5008acc3d534b7a0481af62563d52e391fbcb2140/genson-1.4.0-py3-none-any.whl", hash = "sha256:03bc71bbe52defde70660cc4dcd1ea1097997da5a1cbb90a9dbd3acc7c9e1b65", size = 24484 }, ] [[package]] name = "ghp-import" version = "2.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034 }, ] [[package]] name = "git-changelog" version = "2.9.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, { name = "packaging" }, { name = "platformdirs" }, { name = "semver" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/7f/17e58ec656fd79d4a3b02517923e24a93b28fe2e4518568aedb4ce038fb9/git_changelog-2.9.4.tar.gz", hash = "sha256:06a38a0d174a069b760430ec41493bf53307be13f16b0e48ce379be1646ea9a0", size = 92601, upload-time = "2026-04-29T14:01:39.575Z" } +sdist = { url = "https://files.pythonhosted.org/packages/01/7f/17e58ec656fd79d4a3b02517923e24a93b28fe2e4518568aedb4ce038fb9/git_changelog-2.9.4.tar.gz", hash = "sha256:06a38a0d174a069b760430ec41493bf53307be13f16b0e48ce379be1646ea9a0", size = 92601 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/a6/fb6713ce5c128078492b5ce691bd27b8a7c6f2ad84aca99d3b847ab1721d/git_changelog-2.9.4-py3-none-any.whl", hash = "sha256:c19a099640518fbbc545cb240250cf8129e55e668d8374ba8061ea5456da204b", size = 40604, upload-time = "2026-04-29T14:01:38.195Z" }, + { url = "https://files.pythonhosted.org/packages/ec/a6/fb6713ce5c128078492b5ce691bd27b8a7c6f2ad84aca99d3b847ab1721d/git_changelog-2.9.4-py3-none-any.whl", hash = "sha256:c19a099640518fbbc545cb240250cf8129e55e668d8374ba8061ea5456da204b", size = 40604 }, ] [[package]] name = "gitdb" version = "4.0.12" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "smmap" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, ] [[package]] name = "githarbor" version = "1.0.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "universal-pathlib" }, { name = "upathtools" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/00/fffef32d9dd820616d346964c9cabb91fa3fc404483e3575c3a62f3137b8/githarbor-1.0.2.tar.gz", hash = "sha256:6df681fa04d8e951f8b1af508a44362d48cf88440037714b07be7fa589a6018e", size = 66500, upload-time = "2025-12-10T11:47:05.767Z" } +sdist = { url = "https://files.pythonhosted.org/packages/16/00/fffef32d9dd820616d346964c9cabb91fa3fc404483e3575c3a62f3137b8/githarbor-1.0.2.tar.gz", hash = "sha256:6df681fa04d8e951f8b1af508a44362d48cf88440037714b07be7fa589a6018e", size = 66500 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bb/70/d546991d92c686dd3ee594497b52721f6750f5233abad5133b021fbab35e/githarbor-1.0.2-py3-none-any.whl", hash = "sha256:5c1ec1eb78d028a3f68188cec1e32ca5f6ffae4a90749a81513172afcfb3394e", size = 91646, upload-time = "2025-12-10T11:47:07.481Z" }, + { url = "https://files.pythonhosted.org/packages/bb/70/d546991d92c686dd3ee594497b52721f6750f5233abad5133b021fbab35e/githarbor-1.0.2-py3-none-any.whl", hash = "sha256:5c1ec1eb78d028a3f68188cec1e32ca5f6ffae4a90749a81513172afcfb3394e", size = 91646 }, ] [[package]] name = "gitpython" version = "3.1.55" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/ab/ba0d29f2fa2277ed6256b2ac09003494045355f3a10bf32f351761287870/gitpython-3.1.55.tar.gz", hash = "sha256:781e3b1624dad81b24e9524bf0297b69786a0706db2cbceec1e2b05c38e5152f", size = 225071, upload-time = "2026-07-23T02:52:43.246Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/ab/ba0d29f2fa2277ed6256b2ac09003494045355f3a10bf32f351761287870/gitpython-3.1.55.tar.gz", hash = "sha256:781e3b1624dad81b24e9524bf0297b69786a0706db2cbceec1e2b05c38e5152f", size = 225071 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/20/6a/d3b8208d2f8aac66abe8ccc1c23fa2c89464ec42cc71a601e95d05902428/gitpython-3.1.55-py3-none-any.whl", hash = "sha256:7c9ec1e69c158c081632ab35c41471e302c96db2ae42165036a5d2403378812e", size = 216590, upload-time = "2026-07-23T02:52:41.932Z" }, + { url = "https://files.pythonhosted.org/packages/20/6a/d3b8208d2f8aac66abe8ccc1c23fa2c89464ec42cc71a601e95d05902428/gitpython-3.1.55-py3-none-any.whl", hash = "sha256:7c9ec1e69c158c081632ab35c41471e302c96db2ae42165036a5d2403378812e", size = 216590 }, ] [[package]] name = "google-auth" version = "2.56.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "pyasn1-modules" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/33/dbc946a407401b975f0719658f18e664ece2109f79ffd1ff3bf226c205f4/google_auth-2.56.2.tar.gz", hash = "sha256:e28f103ca8091fb7012b99c44243d7366c29863713b8e34a220c3322b7a07051", size = 365820, upload-time = "2026-07-21T21:53:28.188Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/33/dbc946a407401b975f0719658f18e664ece2109f79ffd1ff3bf226c205f4/google_auth-2.56.2.tar.gz", hash = "sha256:e28f103ca8091fb7012b99c44243d7366c29863713b8e34a220c3322b7a07051", size = 365820 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/63/50636aae68c9bf17c891c7eb18b49baa9bd6b31d2a97b8de4813a9fc8d1c/google_auth-2.56.2-py3-none-any.whl", hash = "sha256:c8270ea95b2697b74e3d8438ae9c5b898e38b623b915c7b5c5635921e7de68a6", size = 258588, upload-time = "2026-07-21T21:53:26.399Z" }, + { url = "https://files.pythonhosted.org/packages/88/63/50636aae68c9bf17c891c7eb18b49baa9bd6b31d2a97b8de4813a9fc8d1c/google_auth-2.56.2-py3-none-any.whl", hash = "sha256:c8270ea95b2697b74e3d8438ae9c5b898e38b623b915c7b5c5635921e7de68a6", size = 258588 }, ] [package.optional-dependencies] @@ -1779,7 +1482,7 @@ requests = [ [[package]] name = "google-genai" version = "2.14.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "distro" }, @@ -1792,121 +1495,121 @@ dependencies = [ { name = "typing-extensions" }, { name = "websockets" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/df/4f820054c99f29f2fe3de4a8a7c9534dd795302e4a07483a0cb07c3a29b6/google_genai-2.14.0.tar.gz", hash = "sha256:a9d1f4f362d76280f1be1340fcb3c86e63dbca128f6a4ae09d86ab47ff7148e8", size = 641055, upload-time = "2026-07-22T21:35:44.717Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/df/4f820054c99f29f2fe3de4a8a7c9534dd795302e4a07483a0cb07c3a29b6/google_genai-2.14.0.tar.gz", hash = "sha256:a9d1f4f362d76280f1be1340fcb3c86e63dbca128f6a4ae09d86ab47ff7148e8", size = 641055 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/86/5ac5fb53e44cca4a6607fb917eb331fa237c65a103b9ec2e8e8acc8a42db/google_genai-2.14.0-py3-none-any.whl", hash = "sha256:ae7172cdd35695189b516b33a878e4132e5daa2dbc03a5b44cddfa8a82fad664", size = 1030738, upload-time = "2026-07-22T21:35:42.785Z" }, + { url = "https://files.pythonhosted.org/packages/ba/86/5ac5fb53e44cca4a6607fb917eb331fa237c65a103b9ec2e8e8acc8a42db/google_genai-2.14.0-py3-none-any.whl", hash = "sha256:ae7172cdd35695189b516b33a878e4132e5daa2dbc03a5b44cddfa8a82fad664", size = 1030738 }, ] [[package]] name = "googleapis-common-protos" version = "1.75.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035, upload-time = "2026-05-07T08:04:49.423Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/c8/e2645aa8ed02fd4c7a2f59d68783b65b1f3cbdfe39a6308e156509d1fee8/googleapis_common_protos-1.75.0-py3-none-any.whl", hash = "sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed", size = 300631, upload-time = "2026-05-07T08:03:30.345Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c8/e2645aa8ed02fd4c7a2f59d68783b65b1f3cbdfe39a6308e156509d1fee8/googleapis_common_protos-1.75.0-py3-none-any.whl", hash = "sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed", size = 300631 }, ] [[package]] name = "greenlet" version = "3.5.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/74/b13368064b09053253555d3f2839cc2684d22d5aed0d2ccffbf7a6736558/greenlet-3.5.4.tar.gz", hash = "sha256:0232ae1de90a8e07867bb127d7a6ba2301e859145489f25cda8a6096dabe1d20", size = 206538, upload-time = "2026-07-22T12:47:14.468Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/74/b13368064b09053253555d3f2839cc2684d22d5aed0d2ccffbf7a6736558/greenlet-3.5.4.tar.gz", hash = "sha256:0232ae1de90a8e07867bb127d7a6ba2301e859145489f25cda8a6096dabe1d20", size = 206538 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/9a/e51225dcd58713f16ccbdcc501a8da21098ea14515b7870f1f94459e5ff5/greenlet-3.5.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:24e61b88cb7e1b1d794b32a10cc346ac779681d6d74ff137a3e0a444d2bf1f02", size = 294831, upload-time = "2026-07-22T11:38:53.389Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9f/ea/de50a50fadf979713ab18b46f22ad5ff5f2dcfc637a3ebdecf669801e1a5/greenlet-3.5.4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:870d730fec833f5a06906a32596cc099b9161594642a92a520b7a88911c95356", size = 614619, upload-time = "2026-07-22T12:26:42.282Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/c7/2aae27fea41205b8650294c301f042a2a4bb6155eea48c995b890a92f2c1/greenlet-3.5.4-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ec5ff0d1878df6af3bf9b638a5a92a7d5693291de77c91bff10fa48519c604ef", size = 627021, upload-time = "2026-07-22T12:29:03.445Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1b/80/fb4d4788bbc8e54761f1fc88533af9523a6e86299fa113d6e8a8503ed9fc/greenlet-3.5.4-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:07bd44616608d873d06735b63ef1a88191d6ca57c8d291d6559c71bc14c0893c", size = 632845, upload-time = "2026-07-22T12:43:45.19Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/56/79fd826f9ccaae0b84e1b4ef68dabba5e105bb044ffcd448a0b782fcba9a/greenlet-3.5.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d84d993f6e575c950d91a23c1345d18fe1a4310d447bf630849d7809196b52f0", size = 624002, upload-time = "2026-07-22T11:51:11.391Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/e3/6086fa578ebb72772722cdc4bcd628459814b42e0c2db1e3cbd6552b3271/greenlet-3.5.4-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:3529a8a933582ad19e224792cac7372489526576b75b4c124e8e4f29948f4861", size = 435053, upload-time = "2026-07-22T12:39:52.715Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/1a/27319f97e731298513dcba1a2e91b63e9d8811d9de22130f960b129b1bf1/greenlet-3.5.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:58023945f421093de5e6fa108c0985a8659d43f49e0216da25099369a121bcbd", size = 1581533, upload-time = "2026-07-22T12:25:05.322Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/6d/24240bf562e9786dd2799ee0a4a4dadb4ded22510f41b20245099159ac8c/greenlet-3.5.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bae2728e1897aa8df8cb1af38cd48b3a743aefe29372de7b8b7a9f532501e69f", size = 1645781, upload-time = "2026-07-22T11:51:14.805Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/5a/442ab1a9ef7ca6bf7210e5397a95972206a91a31033a03c8900866a10039/greenlet-3.5.4-cp313-cp313-win_amd64.whl", hash = "sha256:ca5726c0b08ca35ae873557266a78b2c3f3b2b7d7401aa5ff886c2045dd0111c", size = 247133, upload-time = "2026-07-22T11:39:20.661Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3e/e6/9160210222386b1a378ff94db846b9508ca24a121cf684991561fdb69280/greenlet-3.5.4-cp313-cp313-win_arm64.whl", hash = "sha256:7c1303791d603080cac6fc3b34df51c3b75b723739c282c8029e48a0d241672f", size = 245500, upload-time = "2026-07-22T11:40:22.185Z" }, + { url = "https://files.pythonhosted.org/packages/c0/9a/e51225dcd58713f16ccbdcc501a8da21098ea14515b7870f1f94459e5ff5/greenlet-3.5.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:24e61b88cb7e1b1d794b32a10cc346ac779681d6d74ff137a3e0a444d2bf1f02", size = 294831 }, + { url = "https://files.pythonhosted.org/packages/9f/ea/de50a50fadf979713ab18b46f22ad5ff5f2dcfc637a3ebdecf669801e1a5/greenlet-3.5.4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:870d730fec833f5a06906a32596cc099b9161594642a92a520b7a88911c95356", size = 614619 }, + { url = "https://files.pythonhosted.org/packages/db/c7/2aae27fea41205b8650294c301f042a2a4bb6155eea48c995b890a92f2c1/greenlet-3.5.4-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ec5ff0d1878df6af3bf9b638a5a92a7d5693291de77c91bff10fa48519c604ef", size = 627021 }, + { url = "https://files.pythonhosted.org/packages/1b/80/fb4d4788bbc8e54761f1fc88533af9523a6e86299fa113d6e8a8503ed9fc/greenlet-3.5.4-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:07bd44616608d873d06735b63ef1a88191d6ca57c8d291d6559c71bc14c0893c", size = 632845 }, + { url = "https://files.pythonhosted.org/packages/eb/56/79fd826f9ccaae0b84e1b4ef68dabba5e105bb044ffcd448a0b782fcba9a/greenlet-3.5.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d84d993f6e575c950d91a23c1345d18fe1a4310d447bf630849d7809196b52f0", size = 624002 }, + { url = "https://files.pythonhosted.org/packages/42/e3/6086fa578ebb72772722cdc4bcd628459814b42e0c2db1e3cbd6552b3271/greenlet-3.5.4-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:3529a8a933582ad19e224792cac7372489526576b75b4c124e8e4f29948f4861", size = 435053 }, + { url = "https://files.pythonhosted.org/packages/0a/1a/27319f97e731298513dcba1a2e91b63e9d8811d9de22130f960b129b1bf1/greenlet-3.5.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:58023945f421093de5e6fa108c0985a8659d43f49e0216da25099369a121bcbd", size = 1581533 }, + { url = "https://files.pythonhosted.org/packages/b1/6d/24240bf562e9786dd2799ee0a4a4dadb4ded22510f41b20245099159ac8c/greenlet-3.5.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bae2728e1897aa8df8cb1af38cd48b3a743aefe29372de7b8b7a9f532501e69f", size = 1645781 }, + { url = "https://files.pythonhosted.org/packages/c1/5a/442ab1a9ef7ca6bf7210e5397a95972206a91a31033a03c8900866a10039/greenlet-3.5.4-cp313-cp313-win_amd64.whl", hash = "sha256:ca5726c0b08ca35ae873557266a78b2c3f3b2b7d7401aa5ff886c2045dd0111c", size = 247133 }, + { url = "https://files.pythonhosted.org/packages/3e/e6/9160210222386b1a378ff94db846b9508ca24a121cf684991561fdb69280/greenlet-3.5.4-cp313-cp313-win_arm64.whl", hash = "sha256:7c1303791d603080cac6fc3b34df51c3b75b723739c282c8029e48a0d241672f", size = 245500 }, ] [[package]] name = "grep-ast" version = "0.9.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pathspec" }, { name = "tree-sitter-language-pack" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/82/a87079945a7c15d242cb586ae22e17952132439eaa9c878ec5fbdc61c54d/grep_ast-0.9.0.tar.gz", hash = "sha256:620a242a4493e6721338d1c9a6c234ae651f8774f4924a6dcf90f6865d4b2ee3", size = 14125, upload-time = "2025-05-08T01:08:28.371Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/82/a87079945a7c15d242cb586ae22e17952132439eaa9c878ec5fbdc61c54d/grep_ast-0.9.0.tar.gz", hash = "sha256:620a242a4493e6721338d1c9a6c234ae651f8774f4924a6dcf90f6865d4b2ee3", size = 14125 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/79/29f1373b2ce1eec37c03aefbc17194c2470d8b61ede288e5043231825999/grep_ast-0.9.0-py3-none-any.whl", hash = "sha256:a3973dca99f1abc026a01bbbc70e00a63860c8ff94a56182ff18b089836826d7", size = 13918, upload-time = "2025-05-08T01:08:27.481Z" }, + { url = "https://files.pythonhosted.org/packages/40/79/29f1373b2ce1eec37c03aefbc17194c2470d8b61ede288e5043231825999/grep_ast-0.9.0-py3-none-any.whl", hash = "sha256:a3973dca99f1abc026a01bbbc70e00a63860c8ff94a56182ff18b089836826d7", size = 13918 }, ] [[package]] name = "griffelib" version = "2.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/33/e4/8d187ea29c2e30b3a09505c567513077d6117861bde1fbd997a167f262ec/griffelib-2.1.0.tar.gz", hash = "sha256:762a186d2c6fd6794d4ea20d428d597ffb857cb56b66421651cbba15bdd5e813", size = 216234, upload-time = "2026-06-19T12:05:42.278Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/33/e4/8d187ea29c2e30b3a09505c567513077d6117861bde1fbd997a167f262ec/griffelib-2.1.0.tar.gz", hash = "sha256:762a186d2c6fd6794d4ea20d428d597ffb857cb56b66421651cbba15bdd5e813", size = 216234 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/d3/5268aeabf2ad82658c4e2ff3a060648d0f02f3926cb53247c0e4d0dab49e/griffelib-2.1.0-py3-none-any.whl", hash = "sha256:cc7b3d2d2865ad0b909fcc38086e3f554b5ea7acbaa7bbb7ecaa3f5dfb7d9f00", size = 142560, upload-time = "2026-06-19T12:05:38.742Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d3/5268aeabf2ad82658c4e2ff3a060648d0f02f3926cb53247c0e4d0dab49e/griffelib-2.1.0-py3-none-any.whl", hash = "sha256:cc7b3d2d2865ad0b909fcc38086e3f554b5ea7acbaa7bbb7ecaa3f5dfb7d9f00", size = 142560 }, ] [[package]] name = "grimp" version = "3.15" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/73/ce58881177b003def779c87b5e10f396deef068933c97d6d206bd46d4cb7/grimp-3.15.tar.gz", hash = "sha256:91b57d4d801dc107ebfb5a7040d4777a152c579b5dc202426e1185e50931fe1e", size = 831734, upload-time = "2026-07-03T12:09:36.244Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/6a/3e0a0760cc509cd09764d128de78a1f329740306c74e42dba82c58a99118/grimp-3.15-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f19b957053d1c736aaa0015eed2d4855bb2511637c5360d32b3c5ea045904e7a", size = 2143197, upload-time = "2026-07-03T12:08:51.685Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c8/2e/127cbce04a5603d382c6a2bbc1a19b6889be49d60b88864bcdb174c8926d/grimp-3.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6480472c2d1f7f6a903906c92e9897d4e3dee5d69ce3881f04368d4ec6d2dde", size = 2088342, upload-time = "2026-07-03T12:08:44.227Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/36/af9df683bf6c8711e0e9136876ca130f9971102d945ff3a36d0c45dae2ec/grimp-3.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c14b64dbf2e4397df2e35fa8aa7028533621ecf1f8ea7ec24bc296a9c695ea4", size = 2254509, upload-time = "2026-07-03T12:07:35.809Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/f5/e712633b68ea14d04e7de84ede4f8ddbba763d5f2d29ae8d6af721f84870/grimp-3.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26364c2c9f7db88243365299b4d1c4d948b74304ff03c8a6e4f028147fed3b22", size = 2193831, upload-time = "2026-07-03T12:07:46.309Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/74/151bdd73d6a60bd77d4b956f36d03dd558dd46a9b5ec8f5ad15921b503d7/grimp-3.15-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69331e1be693415596c6084342059b9ba3ecf1cfe2e3b1c761598dd2fe14d522", size = 2345289, upload-time = "2026-07-03T12:08:19.458Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/b8/3fc950fa73b757cbc35f77542bd662f431b9a8f360e63196ded640771a33/grimp-3.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe397991c269868c2fb08114099b2aa4f1bc803d03fadaaf97e006019f9e5da2", size = 2604407, upload-time = "2026-07-03T12:07:57.217Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/d8/98916b9dc0b89a3e89e0d714ce0872be859fff40ceee3e2cb6886b106eb4/grimp-3.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d556bd62664ee044c47cff64d737be132408064d4ba68ca9f756cb29b41cc2d", size = 2326769, upload-time = "2026-07-03T12:08:08.773Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/51/39595c5857f609e976e0bba1f19c1f45182ee4d8d2ea5cdfab72841eafbc/grimp-3.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9061c5b6f01130ff8639c49c80176d29d921acc36741b2ae0b763a7668106082", size = 2272498, upload-time = "2026-07-03T12:08:32.03Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/d8/a44cc9db500ae80c45425238ee44d9556796aa88b8c0649cfa613fb88d14/grimp-3.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a9d04c195f0c6da4476361560d3d206a6a784b9eb0da7156fc6974511337e2e3", size = 2431075, upload-time = "2026-07-03T12:08:58.935Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/41/544f197ddb44990789683c25740ffa72474a57f0b16bc6b4a544edf9a2a9/grimp-3.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:01fd68c74cfd08b110bfd338d77efaa470670530f7179e6977764f44cd74d5cc", size = 2467361, upload-time = "2026-07-03T12:09:09.275Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/b1/8261018b9f1ab47fffbb7739d7af3f04c8b529555b7fb2ae8b742d42d3db/grimp-3.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bd1ddd428a124d6730bed49ea60fb2ca6c8e0640c8f5abe1d0f6fc27a92fd8bc", size = 2503500, upload-time = "2026-07-03T12:09:19.585Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/d6/99a2421c4c0de9f203a7e246030b13b676766e62e48504883863942646fb/grimp-3.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:07e645e9d45ed43bb8ea8da5982c19eacf13ee685d8440e3dc280064c005599c", size = 2513834, upload-time = "2026-07-03T12:09:29.758Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/a5/263729e23d64541cd99d36dbb592e29c1ecea803deb3bb5c0c463b43c2ec/grimp-3.15-cp313-cp313-win32.whl", hash = "sha256:473646e0a74a554b4ab071d7fcbf5f442eb8cf87561770dae269818636b8edf2", size = 1855743, upload-time = "2026-07-03T12:09:49.789Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/8c/a072bbea2e2e94da38f90bd8794037c90fb4eba389b49d01cdd2bb85e13c/grimp-3.15-cp313-cp313-win_amd64.whl", hash = "sha256:dbc2c15a1fbca2ff358f86cc90067176096dd73bec27d002515521b3125ba507", size = 1984546, upload-time = "2026-07-03T12:09:42.543Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/73/ce58881177b003def779c87b5e10f396deef068933c97d6d206bd46d4cb7/grimp-3.15.tar.gz", hash = "sha256:91b57d4d801dc107ebfb5a7040d4777a152c579b5dc202426e1185e50931fe1e", size = 831734 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/6a/3e0a0760cc509cd09764d128de78a1f329740306c74e42dba82c58a99118/grimp-3.15-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f19b957053d1c736aaa0015eed2d4855bb2511637c5360d32b3c5ea045904e7a", size = 2143197 }, + { url = "https://files.pythonhosted.org/packages/c8/2e/127cbce04a5603d382c6a2bbc1a19b6889be49d60b88864bcdb174c8926d/grimp-3.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6480472c2d1f7f6a903906c92e9897d4e3dee5d69ce3881f04368d4ec6d2dde", size = 2088342 }, + { url = "https://files.pythonhosted.org/packages/b0/36/af9df683bf6c8711e0e9136876ca130f9971102d945ff3a36d0c45dae2ec/grimp-3.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c14b64dbf2e4397df2e35fa8aa7028533621ecf1f8ea7ec24bc296a9c695ea4", size = 2254509 }, + { url = "https://files.pythonhosted.org/packages/02/f5/e712633b68ea14d04e7de84ede4f8ddbba763d5f2d29ae8d6af721f84870/grimp-3.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26364c2c9f7db88243365299b4d1c4d948b74304ff03c8a6e4f028147fed3b22", size = 2193831 }, + { url = "https://files.pythonhosted.org/packages/13/74/151bdd73d6a60bd77d4b956f36d03dd558dd46a9b5ec8f5ad15921b503d7/grimp-3.15-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69331e1be693415596c6084342059b9ba3ecf1cfe2e3b1c761598dd2fe14d522", size = 2345289 }, + { url = "https://files.pythonhosted.org/packages/a1/b8/3fc950fa73b757cbc35f77542bd662f431b9a8f360e63196ded640771a33/grimp-3.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe397991c269868c2fb08114099b2aa4f1bc803d03fadaaf97e006019f9e5da2", size = 2604407 }, + { url = "https://files.pythonhosted.org/packages/0a/d8/98916b9dc0b89a3e89e0d714ce0872be859fff40ceee3e2cb6886b106eb4/grimp-3.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d556bd62664ee044c47cff64d737be132408064d4ba68ca9f756cb29b41cc2d", size = 2326769 }, + { url = "https://files.pythonhosted.org/packages/63/51/39595c5857f609e976e0bba1f19c1f45182ee4d8d2ea5cdfab72841eafbc/grimp-3.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9061c5b6f01130ff8639c49c80176d29d921acc36741b2ae0b763a7668106082", size = 2272498 }, + { url = "https://files.pythonhosted.org/packages/7d/d8/a44cc9db500ae80c45425238ee44d9556796aa88b8c0649cfa613fb88d14/grimp-3.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a9d04c195f0c6da4476361560d3d206a6a784b9eb0da7156fc6974511337e2e3", size = 2431075 }, + { url = "https://files.pythonhosted.org/packages/a9/41/544f197ddb44990789683c25740ffa72474a57f0b16bc6b4a544edf9a2a9/grimp-3.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:01fd68c74cfd08b110bfd338d77efaa470670530f7179e6977764f44cd74d5cc", size = 2467361 }, + { url = "https://files.pythonhosted.org/packages/3b/b1/8261018b9f1ab47fffbb7739d7af3f04c8b529555b7fb2ae8b742d42d3db/grimp-3.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bd1ddd428a124d6730bed49ea60fb2ca6c8e0640c8f5abe1d0f6fc27a92fd8bc", size = 2503500 }, + { url = "https://files.pythonhosted.org/packages/db/d6/99a2421c4c0de9f203a7e246030b13b676766e62e48504883863942646fb/grimp-3.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:07e645e9d45ed43bb8ea8da5982c19eacf13ee685d8440e3dc280064c005599c", size = 2513834 }, + { url = "https://files.pythonhosted.org/packages/62/a5/263729e23d64541cd99d36dbb592e29c1ecea803deb3bb5c0c463b43c2ec/grimp-3.15-cp313-cp313-win32.whl", hash = "sha256:473646e0a74a554b4ab071d7fcbf5f442eb8cf87561770dae269818636b8edf2", size = 1855743 }, + { url = "https://files.pythonhosted.org/packages/1c/8c/a072bbea2e2e94da38f90bd8794037c90fb4eba389b49d01cdd2bb85e13c/grimp-3.15-cp313-cp313-win_amd64.whl", hash = "sha256:dbc2c15a1fbca2ff358f86cc90067176096dd73bec27d002515521b3125ba507", size = 1984546 }, ] [[package]] name = "h11" version = "0.16.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, ] [[package]] name = "hf-xet" version = "1.5.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/39/67be8d71f900d9a55761b6022821d6679fb56c64f1b6063d5af2c2606727/hf_xet-1.5.2.tar.gz", hash = "sha256:73044bd31bae33c984af832d19c752a0dffb67518fee9ddbd91d616e1101cf47", size = 903674, upload-time = "2026-07-16T17:29:56.833Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/39/67be8d71f900d9a55761b6022821d6679fb56c64f1b6063d5af2c2606727/hf_xet-1.5.2.tar.gz", hash = "sha256:73044bd31bae33c984af832d19c752a0dffb67518fee9ddbd91d616e1101cf47", size = 903674 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/ba/2b70603c7552db82baeb2623e2336898304a17328845151be4fe1f48d420/hf_xet-1.5.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f922b8f5fb84f1dd3d7ab7a1316354a1bca9b1c73ecfc19c76e51a2a49d29799", size = 4033760, upload-time = "2026-07-16T17:29:43.884Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/ac/b097a86a1e4a6098f3a79382643ab09d5733d87ccc864877ad1e12b49b70/hf_xet-1.5.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:045f84440c55cdeb659cf1a1dd48c77bcd0d2e93632e2fea8f2c3bdee79f38ed", size = 3841438, upload-time = "2026-07-16T17:29:45.539Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/35/db860aa3a0780660324a506ad4b3d322ddc6ecbba4b9340aed0942cbf21c/hf_xet-1.5.2-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db78c39c83d6279daddc98e2238f373ab8980685556d42472b4ec51abcf03e8c", size = 4428006, upload-time = "2026-07-16T17:29:46.996Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/af/6b/832dd980af4b0c3ae0660e309285f2ffcdff2faa38129390dbb47aa4a3f9/hf_xet-1.5.2-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7db73c810500c54c6760be8c39d4b2e476974de85424c50063efc22fdda13025", size = 4221099, upload-time = "2026-07-16T17:29:48.525Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/05/ae50f0d34e3254e6c3e208beb2519f6b8673016fc4b3643badaf6450d186/hf_xet-1.5.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6395cfe3c9cbead4f16b31808b0e67eac428b66c656f856e99636adaddea878f", size = 4420766, upload-time = "2026-07-16T17:29:50.092Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/a9/c050bc2743a2bcd68928bfee157b08681667a164a24ec95fbfcfcd717e08/hf_xet-1.5.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cde8cd167126bb6109b2ceb19b844433a4988643e8f3e01dd9dd0e4a34535097", size = 4636716, upload-time = "2026-07-16T17:29:51.62Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/f8/68b01c5c2edb56ac9a67b3d076ffddcb90867abaee923923eb34e7a14e76/hf_xet-1.5.2-cp38-abi3-win_amd64.whl", hash = "sha256:ecf63d1cb69a9a7319910f8f83fcf9b46e7a32dfcf4b8f8eeddb55f647306e65", size = 3988373, upload-time = "2026-07-16T17:29:53.395Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/39/c6/988383e9dc17294d536fcbcd6fd16eed882e411ad16c954984a53e47b09c/hf_xet-1.5.2-cp38-abi3-win_arm64.whl", hash = "sha256:1da28519496eb7c8094c11e4d25509b4a468457a0302d58136099db2fd9a671d", size = 3816957, upload-time = "2026-07-16T17:29:54.991Z" }, + { url = "https://files.pythonhosted.org/packages/de/ba/2b70603c7552db82baeb2623e2336898304a17328845151be4fe1f48d420/hf_xet-1.5.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f922b8f5fb84f1dd3d7ab7a1316354a1bca9b1c73ecfc19c76e51a2a49d29799", size = 4033760 }, + { url = "https://files.pythonhosted.org/packages/60/ac/b097a86a1e4a6098f3a79382643ab09d5733d87ccc864877ad1e12b49b70/hf_xet-1.5.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:045f84440c55cdeb659cf1a1dd48c77bcd0d2e93632e2fea8f2c3bdee79f38ed", size = 3841438 }, + { url = "https://files.pythonhosted.org/packages/d3/35/db860aa3a0780660324a506ad4b3d322ddc6ecbba4b9340aed0942cbf21c/hf_xet-1.5.2-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db78c39c83d6279daddc98e2238f373ab8980685556d42472b4ec51abcf03e8c", size = 4428006 }, + { url = "https://files.pythonhosted.org/packages/af/6b/832dd980af4b0c3ae0660e309285f2ffcdff2faa38129390dbb47aa4a3f9/hf_xet-1.5.2-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7db73c810500c54c6760be8c39d4b2e476974de85424c50063efc22fdda13025", size = 4221099 }, + { url = "https://files.pythonhosted.org/packages/9e/05/ae50f0d34e3254e6c3e208beb2519f6b8673016fc4b3643badaf6450d186/hf_xet-1.5.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6395cfe3c9cbead4f16b31808b0e67eac428b66c656f856e99636adaddea878f", size = 4420766 }, + { url = "https://files.pythonhosted.org/packages/07/a9/c050bc2743a2bcd68928bfee157b08681667a164a24ec95fbfcfcd717e08/hf_xet-1.5.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cde8cd167126bb6109b2ceb19b844433a4988643e8f3e01dd9dd0e4a34535097", size = 4636716 }, + { url = "https://files.pythonhosted.org/packages/e9/f8/68b01c5c2edb56ac9a67b3d076ffddcb90867abaee923923eb34e7a14e76/hf_xet-1.5.2-cp38-abi3-win_amd64.whl", hash = "sha256:ecf63d1cb69a9a7319910f8f83fcf9b46e7a32dfcf4b8f8eeddb55f647306e65", size = 3988373 }, + { url = "https://files.pythonhosted.org/packages/39/c6/988383e9dc17294d536fcbcd6fd16eed882e411ad16c954984a53e47b09c/hf_xet-1.5.2-cp38-abi3-win_arm64.whl", hash = "sha256:1da28519496eb7c8094c11e4d25509b4a468457a0302d58136099db2fd9a671d", size = 3816957 }, ] [[package]] name = "hishel" version = "1.3.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "msgpack" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/6c/6fda06f82ec7adc959ec49d80a87e26d31ddce2a9a4c8582a8721c9ac8ec/hishel-1.3.0.tar.gz", hash = "sha256:5be585dca8c035866cffc745a50dbce6b277a3d1f4b07ef24f77c07f6b31ff92", size = 813532, upload-time = "2026-06-11T08:41:29.699Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/6c/6fda06f82ec7adc959ec49d80a87e26d31ddce2a9a4c8582a8721c9ac8ec/hishel-1.3.0.tar.gz", hash = "sha256:5be585dca8c035866cffc745a50dbce6b277a3d1f4b07ef24f77c07f6b31ff92", size = 813532 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f5/fd/8d2ed31f94fbf6fd15923afdb40d0e4ed26286ecaa70c256033b240ca5b1/hishel-1.3.0-py3-none-any.whl", hash = "sha256:b803ad9f1d410085b61459a5dbbd273806215021e672198ba911c7d3db14adaa", size = 73626, upload-time = "2026-06-11T08:41:28.079Z" }, + { url = "https://files.pythonhosted.org/packages/f5/fd/8d2ed31f94fbf6fd15923afdb40d0e4ed26286ecaa70c256033b240ca5b1/hishel-1.3.0-py3-none-any.whl", hash = "sha256:b803ad9f1d410085b61459a5dbbd273806215021e672198ba911c7d3db14adaa", size = 73626 }, ] [package.optional-dependencies] @@ -1918,57 +1621,57 @@ async = [ [[package]] name = "httpcore" version = "1.0.9" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "h11" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784 }, ] [[package]] name = "httpcore2" version = "2.9.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "h11" }, { name = "truststore" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/39/a8/20ed1ed79cbc2ecdf5301c0968ab7c85547212e2a7bd126ddd2d986e206e/httpcore2-2.9.1.tar.gz", hash = "sha256:4d8acbf8b306f48c9d6046591fd5ba4037d1b1b1000d140fc2c3eab1e9a0c0e2", size = 67089, upload-time = "2026-07-24T09:21:03.867Z" } +sdist = { url = "https://files.pythonhosted.org/packages/39/a8/20ed1ed79cbc2ecdf5301c0968ab7c85547212e2a7bd126ddd2d986e206e/httpcore2-2.9.1.tar.gz", hash = "sha256:4d8acbf8b306f48c9d6046591fd5ba4037d1b1b1000d140fc2c3eab1e9a0c0e2", size = 67089 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9f/fb/46c52b781975c335a2bcf1072c7bbc007cbdc8d674217f5ee1daba2c848b/httpcore2-2.9.1-py3-none-any.whl", hash = "sha256:6182472379e855fe4221246a2bb7ecede403bc61c6798062ae1787d051ccde26", size = 82809, upload-time = "2026-07-24T09:21:01.178Z" }, + { url = "https://files.pythonhosted.org/packages/9f/fb/46c52b781975c335a2bcf1072c7bbc007cbdc8d674217f5ee1daba2c848b/httpcore2-2.9.1-py3-none-any.whl", hash = "sha256:6182472379e855fe4221246a2bb7ecede403bc61c6798062ae1787d051ccde26", size = 82809 }, ] [[package]] name = "httptools" version = "0.8.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/e5/d471fcb0e14523fe1c3f4ba58ca52480e7bd70ad7109a3846bc75892f7fb/httptools-0.8.0.tar.gz", hash = "sha256:6b2a32f18d97e16e90827d7a819ffa8dbd8cc245fc4e1fa9d1095b54ef4bd999", size = 271342, upload-time = "2026-05-25T22:17:48.841Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/e5/d471fcb0e14523fe1c3f4ba58ca52480e7bd70ad7109a3846bc75892f7fb/httptools-0.8.0.tar.gz", hash = "sha256:6b2a32f18d97e16e90827d7a819ffa8dbd8cc245fc4e1fa9d1095b54ef4bd999", size = 271342 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5e/e5/8cfcabc5546e8022f168be28bcdaa128a240a0befdd03b59d558b4f18bd6/httptools-0.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:614ceea8ea606848bece2338ac03b3ce5324bcb4be8dc7d377ed708012fa4db8", size = 205148, upload-time = "2026-05-25T22:17:16.333Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/0e/0fb14848c19a686c8062ff9067c1a48793e3224b47bc5b201535b6036fce/httptools-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d689918c15a013c65ef52d9fd495d766893ab831a2c8d89f2ac5940a5df847c", size = 111368, upload-time = "2026-05-25T22:17:17.586Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/1b/46f1cecf06b9bbde8e4b8c88034ac7908989e5ff7a3a388ef38392949c1f/httptools-0.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eb3028cca2fc0a6d720e52ef61d8ebb62fcbfeb1de56874546d858d3f25a26b7", size = 486447, upload-time = "2026-05-25T22:17:18.564Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/00/258bfc0837221f81d9725c45f9b948a6a6b2994a147a4fb66e85100c668f/httptools-0.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88bdd940f2b5d487b4d032c6afa5489a7dc4694410d43de3c38c4fb3af0dc45d", size = 482448, upload-time = "2026-05-25T22:17:19.912Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/ab/d1cef3b5523f4d272a70f42a776c3169a2dddfe3a54de4b2ce4a36341528/httptools-0.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a43c9dd399758ccc0531acb0a3c4a6c299ee893ee9400e9c893b7bdcfae0681", size = 464460, upload-time = "2026-05-25T22:17:20.882Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/48/5d1d072442277bb2b3434e0e60690b8e8c23840ef7de8b6ea54040a536d3/httptools-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0770728beb05094c809b98e814edff5fef69d26ad7d21185f2f6d5884a0ba683", size = 471312, upload-time = "2026-05-25T22:17:22.085Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/66/b96623b27e51a68199ef4efdda0613cced9233fe3062ac74e50749c5ad37/httptools-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:7685df791fad561384bfb139e77fde27a1ffd93134e016f95a0db424ffbf77b1", size = 90117, upload-time = "2026-05-25T22:17:23.074Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e5/8cfcabc5546e8022f168be28bcdaa128a240a0befdd03b59d558b4f18bd6/httptools-0.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:614ceea8ea606848bece2338ac03b3ce5324bcb4be8dc7d377ed708012fa4db8", size = 205148 }, + { url = "https://files.pythonhosted.org/packages/2a/0e/0fb14848c19a686c8062ff9067c1a48793e3224b47bc5b201535b6036fce/httptools-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d689918c15a013c65ef52d9fd495d766893ab831a2c8d89f2ac5940a5df847c", size = 111368 }, + { url = "https://files.pythonhosted.org/packages/2e/1b/46f1cecf06b9bbde8e4b8c88034ac7908989e5ff7a3a388ef38392949c1f/httptools-0.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eb3028cca2fc0a6d720e52ef61d8ebb62fcbfeb1de56874546d858d3f25a26b7", size = 486447 }, + { url = "https://files.pythonhosted.org/packages/77/00/258bfc0837221f81d9725c45f9b948a6a6b2994a147a4fb66e85100c668f/httptools-0.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88bdd940f2b5d487b4d032c6afa5489a7dc4694410d43de3c38c4fb3af0dc45d", size = 482448 }, + { url = "https://files.pythonhosted.org/packages/04/ab/d1cef3b5523f4d272a70f42a776c3169a2dddfe3a54de4b2ce4a36341528/httptools-0.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a43c9dd399758ccc0531acb0a3c4a6c299ee893ee9400e9c893b7bdcfae0681", size = 464460 }, + { url = "https://files.pythonhosted.org/packages/ce/48/5d1d072442277bb2b3434e0e60690b8e8c23840ef7de8b6ea54040a536d3/httptools-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0770728beb05094c809b98e814edff5fef69d26ad7d21185f2f6d5884a0ba683", size = 471312 }, + { url = "https://files.pythonhosted.org/packages/0d/66/b96623b27e51a68199ef4efdda0613cced9233fe3062ac74e50749c5ad37/httptools-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:7685df791fad561384bfb139e77fde27a1ffd93134e016f95a0db424ffbf77b1", size = 90117 }, ] [[package]] name = "httpx" version = "0.28.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "certifi" }, { name = "httpcore" }, { name = "idna" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, ] [package.optional-dependencies] @@ -1979,31 +1682,31 @@ socks = [ [[package]] name = "httpx-sse" version = "0.4.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", size = 15943, upload-time = "2025-10-10T21:48:22.271Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", size = 15943 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, + { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960 }, ] [[package]] name = "httpx2" version = "2.9.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "httpcore2" }, { name = "idna" }, { name = "truststore" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/14/38128fbafd7e0ed41d874df6c9a653d47c2d111cfe59e2b4ac95161b4abd/httpx2-2.9.1.tar.gz", hash = "sha256:1932a768737e3666291582833da748cc4e563c337cf96706fccc04fa6e58764a", size = 95458, upload-time = "2026-07-24T09:21:04.972Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/14/38128fbafd7e0ed41d874df6c9a653d47c2d111cfe59e2b4ac95161b4abd/httpx2-2.9.1.tar.gz", hash = "sha256:1932a768737e3666291582833da748cc4e563c337cf96706fccc04fa6e58764a", size = 95458 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/b8/cfd91c4ab9134d386d48f0b6ac662ff3d4be6efdee59ee1c67ebc3c0487c/httpx2-2.9.1-py3-none-any.whl", hash = "sha256:1820fe14a9ab1107bfeff39259987429450b070ec0ff38cc87eb0d8c97fdc71a", size = 91191, upload-time = "2026-07-24T09:21:02.6Z" }, + { url = "https://files.pythonhosted.org/packages/13/b8/cfd91c4ab9134d386d48f0b6ac662ff3d4be6efdee59ee1c67ebc3c0487c/httpx2-2.9.1-py3-none-any.whl", hash = "sha256:1820fe14a9ab1107bfeff39259987429450b070ec0ff38cc87eb0d8c97fdc71a", size = 91191 }, ] [[package]] name = "huggingface-hub" version = "1.24.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "filelock" }, @@ -2015,73 +1718,73 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/9b/d3bb4e7d792835daf34dd7091bbc7d7b4e0437d9388f1ea7239cce49f478/huggingface_hub-1.24.0.tar.gz", hash = "sha256:18431ff4daae0749aa9ba102fc952e314c98e1d30ebdec5319d85ca0a83e1ae5", size = 921848, upload-time = "2026-07-17T09:54:01.022Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/9b/d3bb4e7d792835daf34dd7091bbc7d7b4e0437d9388f1ea7239cce49f478/huggingface_hub-1.24.0.tar.gz", hash = "sha256:18431ff4daae0749aa9ba102fc952e314c98e1d30ebdec5319d85ca0a83e1ae5", size = 921848 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/c3/aeaaf3911d2529614be18d1c8b5496afc185560e76568063d517283318af/huggingface_hub-1.24.0-py3-none-any.whl", hash = "sha256:6ed4120a84a6beec900640aa7e346bd766a6b7341e41526fef5dc8bd81fb7d59", size = 771904, upload-time = "2026-07-17T09:53:59.106Z" }, + { url = "https://files.pythonhosted.org/packages/5f/c3/aeaaf3911d2529614be18d1c8b5496afc185560e76568063d517283318af/huggingface_hub-1.24.0-py3-none-any.whl", hash = "sha256:6ed4120a84a6beec900640aa7e346bd766a6b7341e41526fef5dc8bd81fb7d59", size = 771904 }, ] [[package]] name = "idna" version = "3.18" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455 }, ] [[package]] name = "import-linter" version = "2.13" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "grimp" }, { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/97/c6/42962eb043df4d6984c1540220735b20442572fe37dab5e65ac807c939b9/import_linter-2.13.tar.gz", hash = "sha256:13af4a1d6b06044c58ea784e8732fd7fe48eec821a75feb4d6a1a2de36dd5c27", size = 1279761, upload-time = "2026-07-03T14:00:31.285Z" } +sdist = { url = "https://files.pythonhosted.org/packages/97/c6/42962eb043df4d6984c1540220735b20442572fe37dab5e65ac807c939b9/import_linter-2.13.tar.gz", hash = "sha256:13af4a1d6b06044c58ea784e8732fd7fe48eec821a75feb4d6a1a2de36dd5c27", size = 1279761 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/13/e7725e6eb32607fd4af51ccf3edfe835826e5cdf783b4d7fdc8f459196ae/import_linter-2.13-py3-none-any.whl", hash = "sha256:c0372e7ee5e15657bc06a8e841445e13237afd738a672d26863dc927af9f0bf5", size = 638185, upload-time = "2026-07-03T14:00:29.676Z" }, + { url = "https://files.pythonhosted.org/packages/88/13/e7725e6eb32607fd4af51ccf3edfe835826e5cdf783b4d7fdc8f459196ae/import_linter-2.13-py3-none-any.whl", hash = "sha256:c0372e7ee5e15657bc06a8e841445e13237afd738a672d26863dc927af9f0bf5", size = 638185 }, ] [[package]] name = "importlib-metadata" version = "8.7.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865 }, ] [[package]] name = "inflect" version = "7.5.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "more-itertools" }, { name = "typeguard" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/c6/943357d44a21fd995723d07ccaddd78023eace03c1846049a2645d4324a3/inflect-7.5.0.tar.gz", hash = "sha256:faf19801c3742ed5a05a8ce388e0d8fe1a07f8d095c82201eb904f5d27ad571f", size = 73751, upload-time = "2024-12-28T17:11:18.897Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/c6/943357d44a21fd995723d07ccaddd78023eace03c1846049a2645d4324a3/inflect-7.5.0.tar.gz", hash = "sha256:faf19801c3742ed5a05a8ce388e0d8fe1a07f8d095c82201eb904f5d27ad571f", size = 73751 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8a/eb/427ed2b20a38a4ee29f24dbe4ae2dafab198674fe9a85e3d6adf9e5f5f41/inflect-7.5.0-py3-none-any.whl", hash = "sha256:2aea70e5e70c35d8350b8097396ec155ffd68def678c7ff97f51aa69c1d92344", size = 35197, upload-time = "2024-12-28T17:11:15.931Z" }, + { url = "https://files.pythonhosted.org/packages/8a/eb/427ed2b20a38a4ee29f24dbe4ae2dafab198674fe9a85e3d6adf9e5f5f41/inflect-7.5.0-py3-none-any.whl", hash = "sha256:2aea70e5e70c35d8350b8097396ec155ffd68def678c7ff97f51aa69c1d92344", size = 35197 }, ] [[package]] name = "iniconfig" version = "2.3.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484 }, ] [[package]] name = "inline-snapshot" version = "0.35.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asttokens" }, { name = "executing" }, @@ -2089,87 +1792,87 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/b3/38a1b9c6323c5dff0ab6c74aa839f1c7d8b7057a861d80ec5bfe834be24e/inline_snapshot-0.35.2.tar.gz", hash = "sha256:6cfd2ea0b52d9cb9beb13c1e73d740ff86f630ba48d9ea6947e54e3ff8494876", size = 2534713, upload-time = "2026-07-16T10:51:58.826Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/38a1b9c6323c5dff0ab6c74aa839f1c7d8b7057a861d80ec5bfe834be24e/inline_snapshot-0.35.2.tar.gz", hash = "sha256:6cfd2ea0b52d9cb9beb13c1e73d740ff86f630ba48d9ea6947e54e3ff8494876", size = 2534713 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/ea/de85fc264e4c76bda3552eee42904e8b7079fd826902aa5fa044bc5bbc3c/inline_snapshot-0.35.2-py3-none-any.whl", hash = "sha256:91b230b310c95a8c3b91cdbc637e064c7c2f98c13935b64875a7ba9ef174e161", size = 94669, upload-time = "2026-07-16T10:51:57.457Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ea/de85fc264e4c76bda3552eee42904e8b7079fd826902aa5fa044bc5bbc3c/inline_snapshot-0.35.2-py3-none-any.whl", hash = "sha256:91b230b310c95a8c3b91cdbc637e064c7c2f98c13935b64875a7ba9ef174e161", size = 94669 }, ] [[package]] name = "installer" version = "1.0.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/fe/b9f481cf0cc867958a21338baa900357b7b7d86cac9b025948049d77923c/installer-1.0.1.tar.gz", hash = "sha256:052c7fc3721d54c696e2dea019be67539d7b144e924f559f54beb3121831c364", size = 481132, upload-time = "2026-05-11T18:13:28.158Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/fe/b9f481cf0cc867958a21338baa900357b7b7d86cac9b025948049d77923c/installer-1.0.1.tar.gz", hash = "sha256:052c7fc3721d54c696e2dea019be67539d7b144e924f559f54beb3121831c364", size = 481132 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/48/bedf3ba4163e7db392c9d4cbdfc8217423196c8fccbe5a404a0f094fde63/installer-1.0.1-py3-none-any.whl", hash = "sha256:011d045df8b954ced7dde3a7e42ae4418da40ecda7990f2d11d5ed7c146fd98b", size = 464455, upload-time = "2026-05-11T18:13:26.252Z" }, + { url = "https://files.pythonhosted.org/packages/26/48/bedf3ba4163e7db392c9d4cbdfc8217423196c8fccbe5a404a0f094fde63/installer-1.0.1-py3-none-any.whl", hash = "sha256:011d045df8b954ced7dde3a7e42ae4418da40ecda7990f2d11d5ed7c146fd98b", size = 464455 }, ] [[package]] name = "isort" version = "8.0.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ef/7c/ec4ab396d31b3b395e2e999c8f46dec78c5e29209fac49d1f4dace04041d/isort-8.0.1.tar.gz", hash = "sha256:171ac4ff559cdc060bcfff550bc8404a486fee0caab245679c2abe7cb253c78d", size = 769592, upload-time = "2026-02-28T10:08:20.685Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/7c/ec4ab396d31b3b395e2e999c8f46dec78c5e29209fac49d1f4dace04041d/isort-8.0.1.tar.gz", hash = "sha256:171ac4ff559cdc060bcfff550bc8404a486fee0caab245679c2abe7cb253c78d", size = 769592 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3e/95/c7c34aa53c16353c56d0b802fba48d5f5caa2cdee7958acbcb795c830416/isort-8.0.1-py3-none-any.whl", hash = "sha256:28b89bc70f751b559aeca209e6120393d43fbe2490de0559662be7a9787e3d75", size = 89733, upload-time = "2026-02-28T10:08:19.466Z" }, + { url = "https://files.pythonhosted.org/packages/3e/95/c7c34aa53c16353c56d0b802fba48d5f5caa2cdee7958acbcb795c830416/isort-8.0.1-py3-none-any.whl", hash = "sha256:28b89bc70f751b559aeca209e6120393d43fbe2490de0559662be7a9787e3d75", size = 89733 }, ] [[package]] name = "jaraco-classes" version = "3.4.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "more-itertools" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777 }, ] [[package]] name = "jaraco-context" version = "6.1.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871, upload-time = "2026-03-20T22:13:32.808Z" }, + { url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871 }, ] [[package]] name = "jaraco-functools" version = "4.6.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "more-itertools" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/1f/c23395957d41ccf27c4e535c3d334c4051e5395b3752057ba4cbaec35c56/jaraco_functools-4.6.0.tar.gz", hash = "sha256:880c577ec9720b3a052d5bc611fb9f2269b3d87902ef42440df443b88e443280", size = 20837, upload-time = "2026-07-14T01:28:02.544Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/1f/c23395957d41ccf27c4e535c3d334c4051e5395b3752057ba4cbaec35c56/jaraco_functools-4.6.0.tar.gz", hash = "sha256:880c577ec9720b3a052d5bc611fb9f2269b3d87902ef42440df443b88e443280", size = 20837 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/36/ecc85bc96c273dc8a11273ed4782272975e6338d4a3e9228621175edf0e3/jaraco_functools-4.6.0-py3-none-any.whl", hash = "sha256:99e3dc0060c5cbe8fcd1cdb36258e2a65ca40f1566b2033b12abb1bb44dd3c30", size = 11677, upload-time = "2026-07-14T01:28:01.59Z" }, + { url = "https://files.pythonhosted.org/packages/02/36/ecc85bc96c273dc8a11273ed4782272975e6338d4a3e9228621175edf0e3/jaraco_functools-4.6.0-py3-none-any.whl", hash = "sha256:99e3dc0060c5cbe8fcd1cdb36258e2a65ca40f1566b2033b12abb1bb44dd3c30", size = 11677 }, ] [[package]] name = "jeepney" version = "0.9.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010 }, ] [[package]] name = "jinja2" version = "3.1.6" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, ] [[package]] name = "jinjarope" version = "1.0.7" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyenv" }, { name = "epregistry" }, @@ -2178,9 +1881,9 @@ dependencies = [ { name = "universal-pathlib" }, { name = "upathtools" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/14/6caaf04cefcf97fff8db5de10e5fc1f6f7af7f20acdb441f089a5dbe130c/jinjarope-1.0.7.tar.gz", hash = "sha256:876db5c9b087f8275f9a6ae2686ae12d57999d320500b8ddcbc9ecbf26e3c42b", size = 2686298, upload-time = "2026-01-08T20:36:05.787Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/14/6caaf04cefcf97fff8db5de10e5fc1f6f7af7f20acdb441f089a5dbe130c/jinjarope-1.0.7.tar.gz", hash = "sha256:876db5c9b087f8275f9a6ae2686ae12d57999d320500b8ddcbc9ecbf26e3c42b", size = 2686298 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/17/da/065560563ffa16799e488f1fddfca96834a905b47a3201a0071b33fac43f/jinjarope-1.0.7-py3-none-any.whl", hash = "sha256:c6a46558281f74fa2bde31bce368663100962ec0fa2bf68c9faf430030dea298", size = 2699207, upload-time = "2026-01-08T20:36:04.156Z" }, + { url = "https://files.pythonhosted.org/packages/17/da/065560563ffa16799e488f1fddfca96834a905b47a3201a0071b33fac43f/jinjarope-1.0.7-py3-none-any.whl", hash = "sha256:c6a46558281f74fa2bde31bce368663100962ec0fa2bf68c9faf430030dea298", size = 2699207 }, ] [package.optional-dependencies] @@ -2191,41 +1894,41 @@ icons = [ [[package]] name = "jiter" version = "0.16.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1d/1f/10936e16d8860c70698a1aa939a46aa0224813b782bce4e000e637da0b2d/jiter-0.16.0.tar.gz", hash = "sha256:7b24c3492c5f4f84a37946ad9cf504910cf6a782d6a4e0689b6673c5894b4a1c", size = 176431, upload-time = "2026-06-29T13:05:13.657Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/c0/555fc60473d30d66894ba825e63615e3be7524fac23858356afa7a38906c/jiter-0.16.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:41977aa5654023948c2dae2a81cbf9c43343954bef1cd59a154dd15a4d84c195", size = 306203, upload-time = "2026-06-29T13:03:36.243Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/2b/c3eaf16f5d7c9bad66ea32f40a95bd169b29a91217fcc7f081375157e99c/jiter-0.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d28bb3c26762358dadf3e5bf0bccd29ae987d65e6988d2e6f49829c76b003c09", size = 306489, upload-time = "2026-06-29T13:03:37.846Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/3f/02fdfc6705cad96127d883af5c34e4867f554f29ec7705ec1a46156400a9/jiter-0.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0542a7189c26920778658fc8fcf2af8bae05bae9924577f71804acef37996536", size = 335453, upload-time = "2026-06-29T13:03:39.221Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/a6/e4bda5920d4b0d7c5dfb7174ce4a6b2e4d3e11c9162c452ef0eab4cdbdbd/jiter-0.16.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8fb8de1e23a0cb2a7f53c335049c7b72b6db41aa6227cdcc0972a1de5cb39450", size = 361625, upload-time = "2026-06-29T13:03:40.597Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/97/4e6b59b2c6e55cbb3e183595f81ad65dcfb21c915fee5e19e335df21bc55/jiter-0.16.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72d0b2990ca754a9102779ac98d8597b7cb31678958562214a007f909eab78e", size = 456958, upload-time = "2026-06-29T13:03:42.074Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/15/e0/97e9557686d2f94f4b93786eccb7eed28e9228ad132ea8237f44727314a7/jiter-0.16.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5f91b1c27fc22a57993d5a5cb8a627cb8ed4b10502716fac1ffbfe1d19d84e8", size = 372017, upload-time = "2026-06-29T13:03:43.658Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/94/db768b6938e0df35c86beeba3dfbbb025c9ee5c19e1aa271f2396e50864d/jiter-0.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c682bea068a90b764577bdb78a60a4c1d1606daf9cd4c893832a37c7cc9d9026", size = 343320, upload-time = "2026-06-29T13:03:45.226Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/d6/5a59d938244a30735fe62d9433fd325f9021ea29d89780ea4596ea93bc89/jiter-0.16.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:8d031aabecc4f1b6276adfb42e3aabb77c89d468bf616600e8d3a11328929053", size = 350520, upload-time = "2026-06-29T13:03:46.671Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/f8/c4a857f49c9af125f6bbcac7e3eee7f7978ed89682833062e2dbf62576b1/jiter-0.16.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eab2cd170150e70153de16896a1774e3a1dca80154c56b54d7a812c479a7165e", size = 387550, upload-time = "2026-06-29T13:03:48.361Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/d6/5fbc2f7d6b67b754caa61a993a2e626e815dec47ffc2f9e35f01adfebec7/jiter-0.16.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6edb63a46e65a82c26800a868e49b2cac30dd5a4218b88d74bc2c848c8ad60bb", size = 515424, upload-time = "2026-06-29T13:03:49.881Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/54/284f0164b64a5fed915fea6ba7e9ba9b3d8d37c67d59cf2e3bb99d45cdfe/jiter-0.16.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:659039cc50b5addcc35fcc87ae2c1833b7c0a8e5326ef631a75e4478447bcf84", size = 546981, upload-time = "2026-06-29T13:03:51.363Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/c5/2a467585a576594384e1d2c43e1224deaafc085f24e243529cf98beef8e1/jiter-0.16.0-cp313-cp313-win32.whl", hash = "sha256:c9c53be232c2e206ef9cdbad81a48bfa74c3d3f08bcf8124630a8a748aad993e", size = 202853, upload-time = "2026-06-29T13:03:53.015Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/6a/de61d04b9eec69c71719968d2f716532a3bc121170c44a39e14979c6be81/jiter-0.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:baad945ed47f163ad833314f8e3288c396118934f94e7bbb9e243ce4b341a4fd", size = 196160, upload-time = "2026-06-29T13:03:54.447Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/4b/b390ed59bafb3f31d008d1218578f10327714484b334439947f7e5b11e7f/jiter-0.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:3c1fd2dbe1b0af19e987f03fe66c5f5bd105a2229c1aff4ab14890b24f41d21a", size = 189862, upload-time = "2026-06-29T13:03:55.754Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/1f/10936e16d8860c70698a1aa939a46aa0224813b782bce4e000e637da0b2d/jiter-0.16.0.tar.gz", hash = "sha256:7b24c3492c5f4f84a37946ad9cf504910cf6a782d6a4e0689b6673c5894b4a1c", size = 176431 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/c0/555fc60473d30d66894ba825e63615e3be7524fac23858356afa7a38906c/jiter-0.16.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:41977aa5654023948c2dae2a81cbf9c43343954bef1cd59a154dd15a4d84c195", size = 306203 }, + { url = "https://files.pythonhosted.org/packages/d0/2b/c3eaf16f5d7c9bad66ea32f40a95bd169b29a91217fcc7f081375157e99c/jiter-0.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d28bb3c26762358dadf3e5bf0bccd29ae987d65e6988d2e6f49829c76b003c09", size = 306489 }, + { url = "https://files.pythonhosted.org/packages/96/3f/02fdfc6705cad96127d883af5c34e4867f554f29ec7705ec1a46156400a9/jiter-0.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0542a7189c26920778658fc8fcf2af8bae05bae9924577f71804acef37996536", size = 335453 }, + { url = "https://files.pythonhosted.org/packages/b2/a6/e4bda5920d4b0d7c5dfb7174ce4a6b2e4d3e11c9162c452ef0eab4cdbdbd/jiter-0.16.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8fb8de1e23a0cb2a7f53c335049c7b72b6db41aa6227cdcc0972a1de5cb39450", size = 361625 }, + { url = "https://files.pythonhosted.org/packages/b7/97/4e6b59b2c6e55cbb3e183595f81ad65dcfb21c915fee5e19e335df21bc55/jiter-0.16.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72d0b2990ca754a9102779ac98d8597b7cb31678958562214a007f909eab78e", size = 456958 }, + { url = "https://files.pythonhosted.org/packages/15/e0/97e9557686d2f94f4b93786eccb7eed28e9228ad132ea8237f44727314a7/jiter-0.16.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5f91b1c27fc22a57993d5a5cb8a627cb8ed4b10502716fac1ffbfe1d19d84e8", size = 372017 }, + { url = "https://files.pythonhosted.org/packages/0f/94/db768b6938e0df35c86beeba3dfbbb025c9ee5c19e1aa271f2396e50864d/jiter-0.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c682bea068a90b764577bdb78a60a4c1d1606daf9cd4c893832a37c7cc9d9026", size = 343320 }, + { url = "https://files.pythonhosted.org/packages/c1/d6/5a59d938244a30735fe62d9433fd325f9021ea29d89780ea4596ea93bc89/jiter-0.16.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:8d031aabecc4f1b6276adfb42e3aabb77c89d468bf616600e8d3a11328929053", size = 350520 }, + { url = "https://files.pythonhosted.org/packages/67/f8/c4a857f49c9af125f6bbcac7e3eee7f7978ed89682833062e2dbf62576b1/jiter-0.16.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eab2cd170150e70153de16896a1774e3a1dca80154c56b54d7a812c479a7165e", size = 387550 }, + { url = "https://files.pythonhosted.org/packages/8b/d6/5fbc2f7d6b67b754caa61a993a2e626e815dec47ffc2f9e35f01adfebec7/jiter-0.16.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6edb63a46e65a82c26800a868e49b2cac30dd5a4218b88d74bc2c848c8ad60bb", size = 515424 }, + { url = "https://files.pythonhosted.org/packages/ed/54/284f0164b64a5fed915fea6ba7e9ba9b3d8d37c67d59cf2e3bb99d45cdfe/jiter-0.16.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:659039cc50b5addcc35fcc87ae2c1833b7c0a8e5326ef631a75e4478447bcf84", size = 546981 }, + { url = "https://files.pythonhosted.org/packages/13/c5/2a467585a576594384e1d2c43e1224deaafc085f24e243529cf98beef8e1/jiter-0.16.0-cp313-cp313-win32.whl", hash = "sha256:c9c53be232c2e206ef9cdbad81a48bfa74c3d3f08bcf8124630a8a748aad993e", size = 202853 }, + { url = "https://files.pythonhosted.org/packages/88/6a/de61d04b9eec69c71719968d2f716532a3bc121170c44a39e14979c6be81/jiter-0.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:baad945ed47f163ad833314f8e3288c396118934f94e7bbb9e243ce4b341a4fd", size = 196160 }, + { url = "https://files.pythonhosted.org/packages/19/4b/b390ed59bafb3f31d008d1218578f10327714484b334439947f7e5b11e7f/jiter-0.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:3c1fd2dbe1b0af19e987f03fe66c5f5bd105a2229c1aff4ab14890b24f41d21a", size = 189862 }, ] [[package]] name = "joserfc" version = "1.7.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/e0/27a6a081ae25420eda6768ceae05d7022a7f2447f420588843f2a44e4298/joserfc-1.7.4.tar.gz", hash = "sha256:b3bc561672ae541b17a9237053b48a03dacddd92d68047b3ecdfb4b5714a88ed", size = 234027, upload-time = "2026-07-19T15:43:02.739Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/e0/27a6a081ae25420eda6768ceae05d7022a7f2447f420588843f2a44e4298/joserfc-1.7.4.tar.gz", hash = "sha256:b3bc561672ae541b17a9237053b48a03dacddd92d68047b3ecdfb4b5714a88ed", size = 234027 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/bf/249dcd99b3376375910b7fa922383b57792975c8758f50d44612e749226c/joserfc-1.7.4-py3-none-any.whl", hash = "sha256:32d46c2cd5e3203c13e87a6c61333cab310b1ba80cd54b4c4f386a848a122463", size = 71000, upload-time = "2026-07-19T15:43:01.299Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/249dcd99b3376375910b7fa922383b57792975c8758f50d44612e749226c/joserfc-1.7.4-py3-none-any.whl", hash = "sha256:32d46c2cd5e3203c13e87a6c61333cab310b1ba80cd54b4c4f386a848a122463", size = 71000 }, ] [[package]] name = "json-schema-for-humans" version = "1.5.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "dataclasses-json" }, @@ -2236,87 +1939,87 @@ dependencies = [ { name = "pyyaml" }, { name = "requests" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/4c/83fc5c339cabfc0d14717c843f506ad2e70a197b6f2c139bb7b2a27e368b/json_schema_for_humans-1.5.1.tar.gz", hash = "sha256:a43023f6c1b99f8e75126cc824c22992d8f55e941060aa3fddfc7c38de3cb973", size = 256753, upload-time = "2025-11-21T14:55:54.536Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/4c/83fc5c339cabfc0d14717c843f506ad2e70a197b6f2c139bb7b2a27e368b/json_schema_for_humans-1.5.1.tar.gz", hash = "sha256:a43023f6c1b99f8e75126cc824c22992d8f55e941060aa3fddfc7c38de3cb973", size = 256753 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/97/1e9a730a7d7674d6022e9eaabff9218ba096b310cef712c004854248a64b/json_schema_for_humans-1.5.1-py3-none-any.whl", hash = "sha256:6b5bb65c8ccfb46219352f3da32312c9d904c08790bb96f43f109338c2141478", size = 285017, upload-time = "2025-11-21T14:55:53.26Z" }, + { url = "https://files.pythonhosted.org/packages/a1/97/1e9a730a7d7674d6022e9eaabff9218ba096b310cef712c004854248a64b/json_schema_for_humans-1.5.1-py3-none-any.whl", hash = "sha256:6b5bb65c8ccfb46219352f3da32312c9d904c08790bb96f43f109338c2141478", size = 285017 }, ] [[package]] name = "json-schema-to-pydantic" version = "0.4.11" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/d8/423895b918706c80db1cee679c13fbe810200b9a9d9a9442c7a58d35c3f2/json_schema_to_pydantic-0.4.11.tar.gz", hash = "sha256:35448ed711a28dd33396b095c8492939b4925aa30eb31942e9b8e08d04279465", size = 56597, upload-time = "2026-03-09T20:53:55.692Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/d8/423895b918706c80db1cee679c13fbe810200b9a9d9a9442c7a58d35c3f2/json_schema_to_pydantic-0.4.11.tar.gz", hash = "sha256:35448ed711a28dd33396b095c8492939b4925aa30eb31942e9b8e08d04279465", size = 56597 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/64/7cfeb8c6d2a5e73e0f8d732032aa62be9a7724c04beb461d677de0b4beb3/json_schema_to_pydantic-0.4.11-py3-none-any.whl", hash = "sha256:da2ccc39d070ee03dbcf0517d16720e3e33f7aa8d61257ace09af8c51bd46348", size = 17842, upload-time = "2026-03-09T20:53:54.576Z" }, + { url = "https://files.pythonhosted.org/packages/f3/64/7cfeb8c6d2a5e73e0f8d732032aa62be9a7724c04beb461d677de0b4beb3/json_schema_to_pydantic-0.4.11-py3-none-any.whl", hash = "sha256:da2ccc39d070ee03dbcf0517d16720e3e33f7aa8d61257ace09af8c51bd46348", size = 17842 }, ] [[package]] name = "jsonpath-python" version = "1.1.6" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/18/4ca8742534a5993ff383f7602e325ce2d5d7cc93d72ac5e1cdedbea8a458/jsonpath_python-1.1.6.tar.gz", hash = "sha256:dded9932b4ec41fb8726e09c83afa4e6be618f938c2db287cc2a81723c639671", size = 88178, upload-time = "2026-05-07T01:26:34.482Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/18/4ca8742534a5993ff383f7602e325ce2d5d7cc93d72ac5e1cdedbea8a458/jsonpath_python-1.1.6.tar.gz", hash = "sha256:dded9932b4ec41fb8726e09c83afa4e6be618f938c2db287cc2a81723c639671", size = 88178 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/8a/1270a6803bd821cbfcdda387eaa13cb41a7b1f7b9bd145979b3bfb9d6cb7/jsonpath_python-1.1.6-py3-none-any.whl", hash = "sha256:a1c50afd8d3fbbaf47a4873bc890dcb3c15da96f5c020327977d844d8731a2d4", size = 14453, upload-time = "2026-05-07T01:26:33.306Z" }, + { url = "https://files.pythonhosted.org/packages/55/8a/1270a6803bd821cbfcdda387eaa13cb41a7b1f7b9bd145979b3bfb9d6cb7/jsonpath_python-1.1.6-py3-none-any.whl", hash = "sha256:a1c50afd8d3fbbaf47a4873bc890dcb3c15da96f5c020327977d844d8731a2d4", size = 14453 }, ] [[package]] name = "jsonref" version = "1.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/aa/0d/c1f3277e90ccdb50d33ed5ba1ec5b3f0a242ed8c1b1a85d3afeb68464dca/jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552", size = 8814, upload-time = "2023-01-16T16:10:04.455Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/0d/c1f3277e90ccdb50d33ed5ba1ec5b3f0a242ed8c1b1a85d3afeb68464dca/jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552", size = 8814 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/ec/e1db9922bceb168197a558a2b8c03a7963f1afe93517ddd3cf99f202f996/jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9", size = 9425, upload-time = "2023-01-16T16:10:02.255Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ec/e1db9922bceb168197a558a2b8c03a7963f1afe93517ddd3cf99f202f996/jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9", size = 9425 }, ] [[package]] name = "jsonschema" version = "4.26.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "jsonschema-specifications" }, { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630 }, ] [[package]] name = "jsonschema-path" version = "0.5.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "pathable" }, { name = "pyyaml" }, { name = "referencing" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/39/79/cd02a4df6d9270efdc7d3feefe6edd730b0820c39eeaa107a2faee8322d5/jsonschema_path-0.5.0.tar.gz", hash = "sha256:493b156ba895c97602655b620a8456caa2ce08c1aa389f5a7addec065e6e855c", size = 19597, upload-time = "2026-05-19T20:45:00.971Z" } +sdist = { url = "https://files.pythonhosted.org/packages/39/79/cd02a4df6d9270efdc7d3feefe6edd730b0820c39eeaa107a2faee8322d5/jsonschema_path-0.5.0.tar.gz", hash = "sha256:493b156ba895c97602655b620a8456caa2ce08c1aa389f5a7addec065e6e855c", size = 19597 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/2c/9e69d73c4297508be9e3b64a970ea3971b3eb8db64ffc5802d40bd25981f/jsonschema_path-0.5.0-py3-none-any.whl", hash = "sha256:2790a070bc7abb08ea3dbe4d340ece4efadf639223001f020c7503229ba068e2", size = 24077, upload-time = "2026-05-19T20:44:59.225Z" }, + { url = "https://files.pythonhosted.org/packages/04/2c/9e69d73c4297508be9e3b64a970ea3971b3eb8db64ffc5802d40bd25981f/jsonschema_path-0.5.0-py3-none-any.whl", hash = "sha256:2790a070bc7abb08ea3dbe4d340ece4efadf639223001f020c7503229ba068e2", size = 24077 }, ] [[package]] name = "jsonschema-specifications" version = "2025.9.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437 }, ] [[package]] name = "keyring" version = "25.7.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jaraco-classes" }, { name = "jaraco-context" }, @@ -2325,42 +2028,42 @@ dependencies = [ { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, { name = "secretstorage", marker = "sys_platform == 'linux'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, + { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160 }, ] [[package]] name = "lance-namespace" version = "0.9.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "lance-namespace-urllib3-client" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/81/4cf8d0412e1f37b2bfa70d0aeb9c7ae4ab73607534e44d60b55efb485306/lance_namespace-0.9.0.tar.gz", hash = "sha256:f738b641cc615b17323baa4eb47900f184688739ee3d2ea9fe39396b9588e53d", size = 11637, upload-time = "2026-07-01T07:42:41.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/81/4cf8d0412e1f37b2bfa70d0aeb9c7ae4ab73607534e44d60b55efb485306/lance_namespace-0.9.0.tar.gz", hash = "sha256:f738b641cc615b17323baa4eb47900f184688739ee3d2ea9fe39396b9588e53d", size = 11637 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/fe/f38747c9610ade83dd9a99a0470b9432b6f21ce4e2bb5524edbe66f626fd/lance_namespace-0.9.0-py3-none-any.whl", hash = "sha256:f785ff10927e4ce0db69986576670fedd37f8a33521e8a4630c6be22db8061b2", size = 13501, upload-time = "2026-07-01T07:42:39.372Z" }, + { url = "https://files.pythonhosted.org/packages/e1/fe/f38747c9610ade83dd9a99a0470b9432b6f21ce4e2bb5524edbe66f626fd/lance_namespace-0.9.0-py3-none-any.whl", hash = "sha256:f785ff10927e4ce0db69986576670fedd37f8a33521e8a4630c6be22db8061b2", size = 13501 }, ] [[package]] name = "lance-namespace-urllib3-client" version = "0.9.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dateutil" }, { name = "typing-extensions" }, { name = "urllib3" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/c3/32d0e2618549ace857c80a457e5915ef3e1145661baff876c8a5ec27be5b/lance_namespace_urllib3_client-0.9.0.tar.gz", hash = "sha256:cf796fa5307fa4dde91fe4bec2af28b90ba79191852d4394e8fe44276538e40f", size = 235805, upload-time = "2026-07-01T07:42:42.563Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/c3/32d0e2618549ace857c80a457e5915ef3e1145661baff876c8a5ec27be5b/lance_namespace_urllib3_client-0.9.0.tar.gz", hash = "sha256:cf796fa5307fa4dde91fe4bec2af28b90ba79191852d4394e8fe44276538e40f", size = 235805 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cc/ab/c8754da0a1efc817f8480100cfe12b7e04034df834759de8ecf02beff3cc/lance_namespace_urllib3_client-0.9.0-py3-none-any.whl", hash = "sha256:be819c8cffb1e460a3a504dbf52d1ca009560a48e7202b8c4279998e4adf9fe4", size = 405586, upload-time = "2026-07-01T07:42:40.503Z" }, + { url = "https://files.pythonhosted.org/packages/cc/ab/c8754da0a1efc817f8480100cfe12b7e04034df834759de8ecf02beff3cc/lance_namespace_urllib3_client-0.9.0-py3-none-any.whl", hash = "sha256:be819c8cffb1e460a3a504dbf52d1ca009560a48e7202b8c4279998e4adf9fe4", size = 405586 }, ] [[package]] name = "lancedb" version = "0.34.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecation" }, { name = "lance-namespace" }, @@ -2371,16 +2074,16 @@ dependencies = [ { name = "tqdm" }, ] wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/f7/5262b9aa593f790757163c0165ab0da1dda054758901bea7e4f02c9cb633/lancedb-0.34.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c462f2e6f933cad659fd0179394eaab578acbc9151fe2ef41bc29b36ecca5058", size = 52654213, upload-time = "2026-07-02T17:13:31.102Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/99/05ea0d32229ebea695193ff20c15d6ecae25785ad82a9d4723d98832a284/lancedb-0.34.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:48829e88e708947d0520454ab9e4f8efa35f3e3626469eadd3a6e061b89cb223", size = 55434501, upload-time = "2026-07-02T17:13:34.81Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/4e/4325c13d5afa93c466428a5a0f168ad4d96f5eb4a77bbe7c5100d39c9897/lancedb-0.34.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:05ba8a5b58e064edfbe5be71b1abf2e411b4eaf295d1a173dcb1a55c5bfb5285", size = 58659359, upload-time = "2026-07-02T17:13:38.424Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/5d/8ca165f1386caf6c4d1c515afd52f345b66432264eecfdfb7fd33eefd9af/lancedb-0.34.0-cp39-abi3-win_amd64.whl", hash = "sha256:51cbc11808f9e3332819b9367c975b3a888541447a8e7bea09c57c852a279153", size = 63530726, upload-time = "2026-07-02T17:13:41.612Z" }, + { url = "https://files.pythonhosted.org/packages/df/f7/5262b9aa593f790757163c0165ab0da1dda054758901bea7e4f02c9cb633/lancedb-0.34.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c462f2e6f933cad659fd0179394eaab578acbc9151fe2ef41bc29b36ecca5058", size = 52654213 }, + { url = "https://files.pythonhosted.org/packages/69/99/05ea0d32229ebea695193ff20c15d6ecae25785ad82a9d4723d98832a284/lancedb-0.34.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:48829e88e708947d0520454ab9e4f8efa35f3e3626469eadd3a6e061b89cb223", size = 55434501 }, + { url = "https://files.pythonhosted.org/packages/cd/4e/4325c13d5afa93c466428a5a0f168ad4d96f5eb4a77bbe7c5100d39c9897/lancedb-0.34.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:05ba8a5b58e064edfbe5be71b1abf2e411b4eaf295d1a173dcb1a55c5bfb5285", size = 58659359 }, + { url = "https://files.pythonhosted.org/packages/d9/5d/8ca165f1386caf6c4d1c515afd52f345b66432264eecfdfb7fd33eefd9af/lancedb-0.34.0-cp39-abi3-win_amd64.whl", hash = "sha256:51cbc11808f9e3332819b9367c975b3a888541447a8e7bea09c57c852a279153", size = 63530726 }, ] [[package]] name = "langfuse" version = "4.14.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backoff" }, { name = "httpx" }, @@ -2391,57 +2094,57 @@ dependencies = [ { name = "pydantic" }, { name = "wrapt" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/61/bb7fa00f5334a670c9aae1f053bc725654a0ca5435fa17d0cb103df8c978/langfuse-4.14.1.tar.gz", hash = "sha256:576641820ae79aeca71453c8eff3c8c35d53f7e41729c918f59eb81f7499faf9", size = 381977, upload-time = "2026-07-20T08:44:04.669Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/61/bb7fa00f5334a670c9aae1f053bc725654a0ca5435fa17d0cb103df8c978/langfuse-4.14.1.tar.gz", hash = "sha256:576641820ae79aeca71453c8eff3c8c35d53f7e41729c918f59eb81f7499faf9", size = 381977 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/e4/6c305af16f1ce344271dd829383b7af586530cf60b55af1aaf274ca37ba9/langfuse-4.14.1-py3-none-any.whl", hash = "sha256:07d19f16338b8e21f8e5996b7e6c3ed150ee582fbaa6275ac9eeea297093f4be", size = 669448, upload-time = "2026-07-20T08:44:05.682Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e4/6c305af16f1ce344271dd829383b7af586530cf60b55af1aaf274ca37ba9/langfuse-4.14.1-py3-none-any.whl", hash = "sha256:07d19f16338b8e21f8e5996b7e6c3ed150ee582fbaa6275ac9eeea297093f4be", size = 669448 }, ] [[package]] name = "lazy-object-proxy" version = "1.12.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/08/a2/69df9c6ba6d316cfd81fe2381e464db3e6de5db45f8c43c6a23504abf8cb/lazy_object_proxy-1.12.0.tar.gz", hash = "sha256:1f5a462d92fd0cfb82f1fab28b51bfb209fabbe6aabf7f0d51472c0c124c0c61", size = 43681, upload-time = "2025-08-22T13:50:06.783Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/08/a2/69df9c6ba6d316cfd81fe2381e464db3e6de5db45f8c43c6a23504abf8cb/lazy_object_proxy-1.12.0.tar.gz", hash = "sha256:1f5a462d92fd0cfb82f1fab28b51bfb209fabbe6aabf7f0d51472c0c124c0c61", size = 43681 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f4/26/b74c791008841f8ad896c7f293415136c66cc27e7c7577de4ee68040c110/lazy_object_proxy-1.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:86fd61cb2ba249b9f436d789d1356deae69ad3231dc3c0f17293ac535162672e", size = 26745, upload-time = "2025-08-22T13:42:44.982Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9b/52/641870d309e5d1fb1ea7d462a818ca727e43bfa431d8c34b173eb090348c/lazy_object_proxy-1.12.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:81d1852fb30fab81696f93db1b1e55a5d1ff7940838191062f5f56987d5fcc3e", size = 71537, upload-time = "2025-08-22T13:42:46.141Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/b6/919118e99d51c5e76e8bf5a27df406884921c0acf2c7b8a3b38d847ab3e9/lazy_object_proxy-1.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be9045646d83f6c2664c1330904b245ae2371b5c57a3195e4028aedc9f999655", size = 71141, upload-time = "2025-08-22T13:42:47.375Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/47/1d20e626567b41de085cf4d4fb3661a56c159feaa73c825917b3b4d4f806/lazy_object_proxy-1.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:67f07ab742f1adfb3966c40f630baaa7902be4222a17941f3d85fd1dae5565ff", size = 69449, upload-time = "2025-08-22T13:42:48.49Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/8d/25c20ff1a1a8426d9af2d0b6f29f6388005fc8cd10d6ee71f48bff86fdd0/lazy_object_proxy-1.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ba769017b944fcacbf6a80c18b2761a1795b03f8899acdad1f1c39db4409be", size = 70744, upload-time = "2025-08-22T13:42:49.608Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/67/8ec9abe15c4f8a4bcc6e65160a2c667240d025cbb6591b879bea55625263/lazy_object_proxy-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:7b22c2bbfb155706b928ac4d74c1a63ac8552a55ba7fff4445155523ea4067e1", size = 26568, upload-time = "2025-08-22T13:42:57.719Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/23/12/cd2235463f3469fd6c62d41d92b7f120e8134f76e52421413a0ad16d493e/lazy_object_proxy-1.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4a79b909aa16bde8ae606f06e6bbc9d3219d2e57fb3e0076e17879072b742c65", size = 27391, upload-time = "2025-08-22T13:42:50.62Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/9e/f1c53e39bbebad2e8609c67d0830cc275f694d0ea23d78e8f6db526c12d3/lazy_object_proxy-1.12.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:338ab2f132276203e404951205fe80c3fd59429b3a724e7b662b2eb539bb1be9", size = 80552, upload-time = "2025-08-22T13:42:51.731Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/b6/6c513693448dcb317d9d8c91d91f47addc09553613379e504435b4cc8b3e/lazy_object_proxy-1.12.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c40b3c9faee2e32bfce0df4ae63f4e73529766893258eca78548bac801c8f66", size = 82857, upload-time = "2025-08-22T13:42:53.225Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/1c/d9c4aaa4c75da11eb7c22c43d7c90a53b4fca0e27784a5ab207768debea7/lazy_object_proxy-1.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:717484c309df78cedf48396e420fa57fc8a2b1f06ea889df7248fdd156e58847", size = 80833, upload-time = "2025-08-22T13:42:54.391Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/ae/29117275aac7d7d78ae4f5a4787f36ff33262499d486ac0bf3e0b97889f6/lazy_object_proxy-1.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a6b7ea5ea1ffe15059eb44bcbcb258f97bcb40e139b88152c40d07b1a1dfc9ac", size = 79516, upload-time = "2025-08-22T13:42:55.812Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/40/b4e48b2c38c69392ae702ae7afa7b6551e0ca5d38263198b7c79de8b3bdf/lazy_object_proxy-1.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:08c465fb5cd23527512f9bd7b4c7ba6cec33e28aad36fbbe46bf7b858f9f3f7f", size = 27656, upload-time = "2025-08-22T13:42:56.793Z" }, + { url = "https://files.pythonhosted.org/packages/f4/26/b74c791008841f8ad896c7f293415136c66cc27e7c7577de4ee68040c110/lazy_object_proxy-1.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:86fd61cb2ba249b9f436d789d1356deae69ad3231dc3c0f17293ac535162672e", size = 26745 }, + { url = "https://files.pythonhosted.org/packages/9b/52/641870d309e5d1fb1ea7d462a818ca727e43bfa431d8c34b173eb090348c/lazy_object_proxy-1.12.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:81d1852fb30fab81696f93db1b1e55a5d1ff7940838191062f5f56987d5fcc3e", size = 71537 }, + { url = "https://files.pythonhosted.org/packages/47/b6/919118e99d51c5e76e8bf5a27df406884921c0acf2c7b8a3b38d847ab3e9/lazy_object_proxy-1.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be9045646d83f6c2664c1330904b245ae2371b5c57a3195e4028aedc9f999655", size = 71141 }, + { url = "https://files.pythonhosted.org/packages/e5/47/1d20e626567b41de085cf4d4fb3661a56c159feaa73c825917b3b4d4f806/lazy_object_proxy-1.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:67f07ab742f1adfb3966c40f630baaa7902be4222a17941f3d85fd1dae5565ff", size = 69449 }, + { url = "https://files.pythonhosted.org/packages/58/8d/25c20ff1a1a8426d9af2d0b6f29f6388005fc8cd10d6ee71f48bff86fdd0/lazy_object_proxy-1.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ba769017b944fcacbf6a80c18b2761a1795b03f8899acdad1f1c39db4409be", size = 70744 }, + { url = "https://files.pythonhosted.org/packages/c0/67/8ec9abe15c4f8a4bcc6e65160a2c667240d025cbb6591b879bea55625263/lazy_object_proxy-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:7b22c2bbfb155706b928ac4d74c1a63ac8552a55ba7fff4445155523ea4067e1", size = 26568 }, + { url = "https://files.pythonhosted.org/packages/23/12/cd2235463f3469fd6c62d41d92b7f120e8134f76e52421413a0ad16d493e/lazy_object_proxy-1.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4a79b909aa16bde8ae606f06e6bbc9d3219d2e57fb3e0076e17879072b742c65", size = 27391 }, + { url = "https://files.pythonhosted.org/packages/60/9e/f1c53e39bbebad2e8609c67d0830cc275f694d0ea23d78e8f6db526c12d3/lazy_object_proxy-1.12.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:338ab2f132276203e404951205fe80c3fd59429b3a724e7b662b2eb539bb1be9", size = 80552 }, + { url = "https://files.pythonhosted.org/packages/4c/b6/6c513693448dcb317d9d8c91d91f47addc09553613379e504435b4cc8b3e/lazy_object_proxy-1.12.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c40b3c9faee2e32bfce0df4ae63f4e73529766893258eca78548bac801c8f66", size = 82857 }, + { url = "https://files.pythonhosted.org/packages/12/1c/d9c4aaa4c75da11eb7c22c43d7c90a53b4fca0e27784a5ab207768debea7/lazy_object_proxy-1.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:717484c309df78cedf48396e420fa57fc8a2b1f06ea889df7248fdd156e58847", size = 80833 }, + { url = "https://files.pythonhosted.org/packages/0b/ae/29117275aac7d7d78ae4f5a4787f36ff33262499d486ac0bf3e0b97889f6/lazy_object_proxy-1.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a6b7ea5ea1ffe15059eb44bcbcb258f97bcb40e139b88152c40d07b1a1dfc9ac", size = 79516 }, + { url = "https://files.pythonhosted.org/packages/19/40/b4e48b2c38c69392ae702ae7afa7b6551e0ca5d38263198b7c79de8b3bdf/lazy_object_proxy-1.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:08c465fb5cd23527512f9bd7b4c7ba6cec33e28aad36fbbe46bf7b858f9f3f7f", size = 27656 }, ] [[package]] name = "librt" version = "0.13.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/2f/3908645ddddab7120b46295e541ead308109fa48dbec7d67d7a778870d60/librt-0.13.0.tar.gz", hash = "sha256:1d2a610c14ac0d0750ee0a3ab8548e83155258387891caaca04def4bf7289781", size = 211402, upload-time = "2026-07-08T12:26:29.834Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/3b/18e7b63255297a2bdc9c25c8d6d4ca8eca9f63aceb1252c0f7427ac7099e/librt-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a468951af16155824e88bdd8326ebe5bdb371f3ec0ac04642994b98201d914f3", size = 151027, upload-time = "2026-07-08T12:25:19.638Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/68/e2248452c00d1a03b45fee1752cdc8f790a476efd2402b75181da88a9e61/librt-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ae01d8512cc17079e53425635327dbf3f7ff57a42c00dec348bf79791c56444c", size = 155152, upload-time = "2026-07-08T12:25:20.851Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/16/52b1c99bf19057a062aac39c900cbb81499f6f75d6c537c14463d247ba78/librt-0.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32c26893cd085c1efe83219e78d866da23fb20a066101b8f68210004361d224c", size = 502499, upload-time = "2026-07-08T12:25:22.055Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9f/54/b811151805c795f55e0dedee6ec687b75f9982a8105d240ea3910737a77b/librt-0.13.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5929da1981a46bcf4b28b1b9499905f0ff58e2419da402a048234e9783acbc4b", size = 496108, upload-time = "2026-07-08T12:25:23.296Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/f8/094d6b2bd93f3fdaa54db54cc788c4a365333bddad65ab02e04da0b1d004/librt-0.13.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94b85d664d777bab6c0d709416cb42938251fda9e221b79e3a2215d85df5f4f9", size = 531576, upload-time = "2026-07-08T12:25:24.648Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/40/541733d5755824f968f7ec39d78ffbd75d145964157ae5e69a09ec6d7326/librt-0.13.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:531b2df3e9fe96b1fcf73a6d165921e4656be5f58d631d384ebce344298368db", size = 524390, upload-time = "2026-07-08T12:25:25.898Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/b5/255673cfdbf5ba663339d36cd863c897289ab4337577e19f9405ce059f36/librt-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:109b84a9edf69ad89dc1f66358659e14a031baca95e3e5b0060bd903ede8efd6", size = 543053, upload-time = "2026-07-08T12:25:27.436Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/11/ab5005e9c9850710f21e354201bf090646349d3fabf5f951eaf70235729e/librt-0.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1304368a3e7ffc3e9db986796cc5326fdb5943a3567ecc137cff318e4240c0e7", size = 546387, upload-time = "2026-07-08T12:25:28.65Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/04/a5d7ce1d1df1afd15ca283dcdf7530ac073e12d69ae8c40879dda96f7868/librt-0.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e4f9b472e7d308d94b62c801982065661158c6ed02790d6c7ddb4337cea0f9c1", size = 535970, upload-time = "2026-07-08T12:25:30.171Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/76/927e267a6daa290174ac281b23c9804c8829b042ade9c6f24a065f540958/librt-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f836c37478f167a81200d8c8b2c920a22224564bed2c23d7aeec760965c367a", size = 573582, upload-time = "2026-07-08T12:25:31.507Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/24/b6c5213efe39c19f9e13605644d0cf063b4ddaa33ac2e45b088e23a70e2e/librt-0.13.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:4000d961ff9598ac6ea603c6c836a5ed49bc205ade5fc378b998dfe1e2c36628", size = 82189, upload-time = "2026-07-08T12:25:32.675Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/00/d29736be177a906ac0b84a5b04b4fbfa22c776dc2f366de4172b0f968c08/librt-0.13.0-cp313-cp313-win32.whl", hash = "sha256:79e44cff71750d299d61a678e49995b0d5935a9cda238c2574daeca3ba536927", size = 106193, upload-time = "2026-07-08T12:25:33.692Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c8/ac/aff6fb45393cb8912f39dfb156ef6b2d1cadb207ff465fc8f66141054be8/librt-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:54dab44a847d5ad1acd05c8a83fe518ae685516ecf4d3f7cc6e3df2a66767650", size = 126962, upload-time = "2026-07-08T12:25:34.769Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/3a/d68cb2b334d53fd30fac81d3a489ce4ba0d9506f4df43fcf676b68352b19/librt-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:d4cb6fbfdf874340ab5e51450753c0f817b6958a3621125ee695bbc3de866566", size = 112127, upload-time = "2026-07-08T12:25:35.981Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/2f/3908645ddddab7120b46295e541ead308109fa48dbec7d67d7a778870d60/librt-0.13.0.tar.gz", hash = "sha256:1d2a610c14ac0d0750ee0a3ab8548e83155258387891caaca04def4bf7289781", size = 211402 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/3b/18e7b63255297a2bdc9c25c8d6d4ca8eca9f63aceb1252c0f7427ac7099e/librt-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a468951af16155824e88bdd8326ebe5bdb371f3ec0ac04642994b98201d914f3", size = 151027 }, + { url = "https://files.pythonhosted.org/packages/4d/68/e2248452c00d1a03b45fee1752cdc8f790a476efd2402b75181da88a9e61/librt-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ae01d8512cc17079e53425635327dbf3f7ff57a42c00dec348bf79791c56444c", size = 155152 }, + { url = "https://files.pythonhosted.org/packages/0e/16/52b1c99bf19057a062aac39c900cbb81499f6f75d6c537c14463d247ba78/librt-0.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32c26893cd085c1efe83219e78d866da23fb20a066101b8f68210004361d224c", size = 502499 }, + { url = "https://files.pythonhosted.org/packages/9f/54/b811151805c795f55e0dedee6ec687b75f9982a8105d240ea3910737a77b/librt-0.13.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5929da1981a46bcf4b28b1b9499905f0ff58e2419da402a048234e9783acbc4b", size = 496108 }, + { url = "https://files.pythonhosted.org/packages/8f/f8/094d6b2bd93f3fdaa54db54cc788c4a365333bddad65ab02e04da0b1d004/librt-0.13.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94b85d664d777bab6c0d709416cb42938251fda9e221b79e3a2215d85df5f4f9", size = 531576 }, + { url = "https://files.pythonhosted.org/packages/2e/40/541733d5755824f968f7ec39d78ffbd75d145964157ae5e69a09ec6d7326/librt-0.13.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:531b2df3e9fe96b1fcf73a6d165921e4656be5f58d631d384ebce344298368db", size = 524390 }, + { url = "https://files.pythonhosted.org/packages/c6/b5/255673cfdbf5ba663339d36cd863c897289ab4337577e19f9405ce059f36/librt-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:109b84a9edf69ad89dc1f66358659e14a031baca95e3e5b0060bd903ede8efd6", size = 543053 }, + { url = "https://files.pythonhosted.org/packages/9e/11/ab5005e9c9850710f21e354201bf090646349d3fabf5f951eaf70235729e/librt-0.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1304368a3e7ffc3e9db986796cc5326fdb5943a3567ecc137cff318e4240c0e7", size = 546387 }, + { url = "https://files.pythonhosted.org/packages/a2/04/a5d7ce1d1df1afd15ca283dcdf7530ac073e12d69ae8c40879dda96f7868/librt-0.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e4f9b472e7d308d94b62c801982065661158c6ed02790d6c7ddb4337cea0f9c1", size = 535970 }, + { url = "https://files.pythonhosted.org/packages/5a/76/927e267a6daa290174ac281b23c9804c8829b042ade9c6f24a065f540958/librt-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f836c37478f167a81200d8c8b2c920a22224564bed2c23d7aeec760965c367a", size = 573582 }, + { url = "https://files.pythonhosted.org/packages/10/24/b6c5213efe39c19f9e13605644d0cf063b4ddaa33ac2e45b088e23a70e2e/librt-0.13.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:4000d961ff9598ac6ea603c6c836a5ed49bc205ade5fc378b998dfe1e2c36628", size = 82189 }, + { url = "https://files.pythonhosted.org/packages/4c/00/d29736be177a906ac0b84a5b04b4fbfa22c776dc2f366de4172b0f968c08/librt-0.13.0-cp313-cp313-win32.whl", hash = "sha256:79e44cff71750d299d61a678e49995b0d5935a9cda238c2574daeca3ba536927", size = 106193 }, + { url = "https://files.pythonhosted.org/packages/c8/ac/aff6fb45393cb8912f39dfb156ef6b2d1cadb207ff465fc8f66141054be8/librt-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:54dab44a847d5ad1acd05c8a83fe518ae685516ecf4d3f7cc6e3df2a66767650", size = 126962 }, + { url = "https://files.pythonhosted.org/packages/d9/3a/d68cb2b334d53fd30fac81d3a489ce4ba0d9506f4df43fcf676b68352b19/librt-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:d4cb6fbfdf874340ab5e51450753c0f817b6958a3621125ee695bbc3de866566", size = 112127 }, ] [[package]] name = "logfire" version = "4.38.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "executing" }, { name = "opentelemetry-exporter-otlp-proto-http" }, @@ -2451,9 +2154,9 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/b7/2b9670e893b5c662c23252bc52cafa2664b7c582b8c36b280693b2beaaa0/logfire-4.38.0.tar.gz", hash = "sha256:da62f7616f3411098cf5fb087f9ff24f54886a9087a238fe0e5fae8bbd609717", size = 1237040, upload-time = "2026-07-20T12:15:33.488Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/b7/2b9670e893b5c662c23252bc52cafa2664b7c582b8c36b280693b2beaaa0/logfire-4.38.0.tar.gz", hash = "sha256:da62f7616f3411098cf5fb087f9ff24f54886a9087a238fe0e5fae8bbd609717", size = 1237040 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/84/7593993a474fdea837577303840177864aaa2883859874d5fa6d037af03f/logfire-4.38.0-py3-none-any.whl", hash = "sha256:da4bffd43190930d0b889e06c596c0a7fce1c485a51de862ad9ff0d5033ecfb9", size = 403289, upload-time = "2026-07-20T12:15:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/5c/84/7593993a474fdea837577303840177864aaa2883859874d5fa6d037af03f/logfire-4.38.0-py3-none-any.whl", hash = "sha256:da4bffd43190930d0b889e06c596c0a7fce1c485a51de862ad9ff0d5033ecfb9", size = 403289 }, ] [package.optional-dependencies] @@ -2467,114 +2170,114 @@ httpx = [ [[package]] name = "logfire-api" version = "4.38.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/1a/17af258260cf8378fabd10bacef0c585e19697eab1deea25f8e4f4fb6462/logfire_api-4.38.0.tar.gz", hash = "sha256:e773cd4a26edb48ef4ec6f88661d1c670bb68c303a71c7043a236d64a9699cd2", size = 90364, upload-time = "2026-07-20T12:15:34.913Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/10/1a/17af258260cf8378fabd10bacef0c585e19697eab1deea25f8e4f4fb6462/logfire_api-4.38.0.tar.gz", hash = "sha256:e773cd4a26edb48ef4ec6f88661d1c670bb68c303a71c7043a236d64a9699cd2", size = 90364 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/22/598f988f293ce391e88baddeeaa1acaea625822653193935301e7149b5c6/logfire_api-4.38.0-py3-none-any.whl", hash = "sha256:6c0612d9200727b64b42eba6068d0d6afd45308f4b844ffd6290c2d33aa6a6f6", size = 140109, upload-time = "2026-07-20T12:15:31.973Z" }, + { url = "https://files.pythonhosted.org/packages/26/22/598f988f293ce391e88baddeeaa1acaea625822653193935301e7149b5c6/logfire_api-4.38.0-py3-none-any.whl", hash = "sha256:6c0612d9200727b64b42eba6068d0d6afd45308f4b844ffd6290c2d33aa6a6f6", size = 140109 }, ] [[package]] name = "loguru" version = "0.7.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "win32-setctime", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload-time = "2024-12-06T11:20:56.608Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload-time = "2024-12-06T11:20:54.538Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595 }, ] [[package]] name = "macholib" version = "1.16.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "altgraph" }, + { name = "altgraph", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/2f/97589876ea967487978071c9042518d28b958d87b17dceb7cdc1d881f963/macholib-1.16.4.tar.gz", hash = "sha256:f408c93ab2e995cd2c46e34fe328b130404be143469e41bc366c807448979362", size = 59427, upload-time = "2025-11-22T08:28:38.373Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/2f/97589876ea967487978071c9042518d28b958d87b17dceb7cdc1d881f963/macholib-1.16.4.tar.gz", hash = "sha256:f408c93ab2e995cd2c46e34fe328b130404be143469e41bc366c807448979362", size = 59427 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/d1/a9f36f8ecdf0fb7c9b1e78c8d7af12b8c8754e74851ac7b94a8305540fc7/macholib-1.16.4-py2.py3-none-any.whl", hash = "sha256:da1a3fa8266e30f0ce7e97c6a54eefaae8edd1e5f86f3eb8b95457cae90265ea", size = 38117, upload-time = "2025-11-22T08:28:36.939Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d1/a9f36f8ecdf0fb7c9b1e78c8d7af12b8c8754e74851ac7b94a8305540fc7/macholib-1.16.4-py2.py3-none-any.whl", hash = "sha256:da1a3fa8266e30f0ce7e97c6a54eefaae8edd1e5f86f3eb8b95457cae90265ea", size = 38117 }, ] [[package]] name = "magika" version = "0.6.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "numpy" }, { name = "onnxruntime" }, { name = "python-dotenv" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/b6/8fdd991142ad3e037179a494b153f463024e5a211ef3ad948b955c26b4de/magika-0.6.2.tar.gz", hash = "sha256:37eb6ae8020f6e68f231bc06052c0a0cbe8e6fa27492db345e8dc867dbceb067", size = 3036634, upload-time = "2025-05-02T14:54:18.88Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/b6/8fdd991142ad3e037179a494b153f463024e5a211ef3ad948b955c26b4de/magika-0.6.2.tar.gz", hash = "sha256:37eb6ae8020f6e68f231bc06052c0a0cbe8e6fa27492db345e8dc867dbceb067", size = 3036634 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/07/4f7748f34279f2852068256992377474f9700b6fbad6735d6be58605178f/magika-0.6.2-py3-none-any.whl", hash = "sha256:5ef72fbc07723029b3684ef81454bc224ac5f60986aa0fc5a28f4456eebcb5b2", size = 2967609, upload-time = "2025-05-02T14:54:09.696Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/6d/0783af677e601d8a42258f0fbc47663abf435f927e58a8d2928296743099/magika-0.6.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9109309328a1553886c8ff36c2ee9a5e9cfd36893ad81b65bf61a57debdd9d0e", size = 12404787, upload-time = "2025-05-02T14:54:16.963Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8a/ad/42e39748ddc4bbe55c2dc1093ce29079c04d096ac0d844f8ae66178bc3ed/magika-0.6.2-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:57cd1d64897634d15de552bd6b3ae9c6ff6ead9c60d384dc46497c08288e4559", size = 15091089, upload-time = "2025-05-02T14:54:11.59Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/1f/28e412d0ccedc068fbccdae6a6233faaa97ec3e5e2ffd242e49655b10064/magika-0.6.2-py3-none-win_amd64.whl", hash = "sha256:711f427a633e0182737dcc2074748004842f870643585813503ff2553b973b9f", size = 12385740, upload-time = "2025-05-02T14:54:14.096Z" }, + { url = "https://files.pythonhosted.org/packages/c2/07/4f7748f34279f2852068256992377474f9700b6fbad6735d6be58605178f/magika-0.6.2-py3-none-any.whl", hash = "sha256:5ef72fbc07723029b3684ef81454bc224ac5f60986aa0fc5a28f4456eebcb5b2", size = 2967609 }, + { url = "https://files.pythonhosted.org/packages/64/6d/0783af677e601d8a42258f0fbc47663abf435f927e58a8d2928296743099/magika-0.6.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9109309328a1553886c8ff36c2ee9a5e9cfd36893ad81b65bf61a57debdd9d0e", size = 12404787 }, + { url = "https://files.pythonhosted.org/packages/8a/ad/42e39748ddc4bbe55c2dc1093ce29079c04d096ac0d844f8ae66178bc3ed/magika-0.6.2-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:57cd1d64897634d15de552bd6b3ae9c6ff6ead9c60d384dc46497c08288e4559", size = 15091089 }, + { url = "https://files.pythonhosted.org/packages/b0/1f/28e412d0ccedc068fbccdae6a6233faaa97ec3e5e2ffd242e49655b10064/magika-0.6.2-py3-none-win_amd64.whl", hash = "sha256:711f427a633e0182737dcc2074748004842f870643585813503ff2553b973b9f", size = 12385740 }, ] [[package]] name = "mako" version = "1.3.12" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/62/791b31e69ae182791ec67f04850f2f062716bbd205483d63a215f3e062d3/mako-1.3.12.tar.gz", hash = "sha256:9f778e93289bd410bb35daadeb4fc66d95a746f0b75777b942088b7fd7af550a", size = 400219, upload-time = "2026-04-28T19:01:08.512Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/62/791b31e69ae182791ec67f04850f2f062716bbd205483d63a215f3e062d3/mako-1.3.12.tar.gz", hash = "sha256:9f778e93289bd410bb35daadeb4fc66d95a746f0b75777b942088b7fd7af550a", size = 400219 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/b1/a0ec7a5a9db730a08daef1fdfb8090435b82465abbf758a596f0ea88727e/mako-1.3.12-py3-none-any.whl", hash = "sha256:8f61569480282dbf557145ce441e4ba888be453c30989f879f0d652e39f53ea9", size = 78521, upload-time = "2026-04-28T19:01:10.393Z" }, + { url = "https://files.pythonhosted.org/packages/bc/b1/a0ec7a5a9db730a08daef1fdfb8090435b82465abbf758a596f0ea88727e/mako-1.3.12-py3-none-any.whl", hash = "sha256:8f61569480282dbf557145ce441e4ba888be453c30989f879f0d652e39f53ea9", size = 78521 }, ] [[package]] name = "markdown" version = "3.10.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, + { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180 }, ] [[package]] name = "markdown-it-py" version = "4.2.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687 }, ] [[package]] name = "markdown2" version = "2.5.5" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/ae/07d4a5fcaa5509221287d289323d75ac8eda5a5a4ac9de2accf7bbcc2b88/markdown2-2.5.5.tar.gz", hash = "sha256:001547e68f6e7fcf0f1cb83f7e82f48aa7d48b2c6a321f0cd20a853a8a2d1664", size = 157249, upload-time = "2026-03-02T20:46:53.411Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/ae/07d4a5fcaa5509221287d289323d75ac8eda5a5a4ac9de2accf7bbcc2b88/markdown2-2.5.5.tar.gz", hash = "sha256:001547e68f6e7fcf0f1cb83f7e82f48aa7d48b2c6a321f0cd20a853a8a2d1664", size = 157249 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/af/4b3891eb0a49d6cfd5cbf3e9bf514c943afc2b0f13e2c57cc57cd88ecc21/markdown2-2.5.5-py3-none-any.whl", hash = "sha256:be798587e09d1f52d2e4d96a649c4b82a778c75f9929aad52a2c95747fa26941", size = 56250, upload-time = "2026-03-02T20:46:52.032Z" }, + { url = "https://files.pythonhosted.org/packages/43/af/4b3891eb0a49d6cfd5cbf3e9bf514c943afc2b0f13e2c57cc57cd88ecc21/markdown2-2.5.5-py3-none-any.whl", hash = "sha256:be798587e09d1f52d2e4d96a649c4b82a778c75f9929aad52a2c95747fa26941", size = 56250 }, ] [[package]] name = "markdownify" version = "1.2.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beautifulsoup4" }, { name = "six" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/ab/d1297139c0e2ceb151ae564c8c4f57ac0155d8f1f8b4cbd5d6523c82ea36/markdownify-1.2.3.tar.gz", hash = "sha256:1a176f05522c8a2cb1dd3ab9d307dcdadbed5c26ae717855bfc42b3b6d38d937", size = 18852, upload-time = "2026-06-30T20:27:39.06Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ab/d1297139c0e2ceb151ae564c8c4f57ac0155d8f1f8b4cbd5d6523c82ea36/markdownify-1.2.3.tar.gz", hash = "sha256:1a176f05522c8a2cb1dd3ab9d307dcdadbed5c26ae717855bfc42b3b6d38d937", size = 18852 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/10/fa543d484e8b1199243fe20eedd02cc5af050edebce98a7293a5773df592/markdownify-1.2.3-py3-none-any.whl", hash = "sha256:a189a0bedfd14009030fde5f85bb6f77c56897cb839b5c25315dd7d4e3e290ba", size = 15732, upload-time = "2026-06-30T20:27:38.094Z" }, + { url = "https://files.pythonhosted.org/packages/04/10/fa543d484e8b1199243fe20eedd02cc5af050edebce98a7293a5773df592/markdownify-1.2.3-py3-none-any.whl", hash = "sha256:a189a0bedfd14009030fde5f85bb6f77c56897cb839b5c25315dd7d4e3e290ba", size = 15732 }, ] [[package]] name = "markitdown" version = "0.1.6" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beautifulsoup4" }, { name = "charset-normalizer" }, @@ -2583,57 +2286,57 @@ dependencies = [ { name = "markdownify" }, { name = "requests" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/b7/91fe0e2df07107ab701a15c8ad3213135707e4d6206ae9bd8f457a7ad86a/markitdown-0.1.6.tar.gz", hash = "sha256:e5bdbaffd971b29598c7c39ef0e9afce2f08c0751fbfa4e4257678ebaf8cfc7e", size = 50795, upload-time = "2026-05-26T22:43:59.318Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/b7/91fe0e2df07107ab701a15c8ad3213135707e4d6206ae9bd8f457a7ad86a/markitdown-0.1.6.tar.gz", hash = "sha256:e5bdbaffd971b29598c7c39ef0e9afce2f08c0751fbfa4e4257678ebaf8cfc7e", size = 50795 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/30/8031f183ee86ea8ac4e7ea1296bab4cca1bee2fd036a26df69764eb7ca74/markitdown-0.1.6-py3-none-any.whl", hash = "sha256:07b2d5bf87b5c53e13a9f2fdc440df8ccc85e26f40c1e557781727b700049775", size = 70032, upload-time = "2026-05-26T22:44:03.209Z" }, + { url = "https://files.pythonhosted.org/packages/9e/30/8031f183ee86ea8ac4e7ea1296bab4cca1bee2fd036a26df69764eb7ca74/markitdown-0.1.6-py3-none-any.whl", hash = "sha256:07b2d5bf87b5c53e13a9f2fdc440df8ccc85e26f40c1e557781727b700049775", size = 70032 }, ] [[package]] name = "markupsafe" version = "3.0.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622 }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029 }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374 }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980 }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990 }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784 }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588 }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041 }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543 }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113 }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911 }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658 }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066 }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639 }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569 }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284 }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801 }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769 }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642 }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612 }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200 }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973 }, ] [[package]] name = "marshmallow" version = "3.26.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/79/de6c16cc902f4fc372236926b0ce2ab7845268dcc30fb2fbb7f71b418631/marshmallow-3.26.2.tar.gz", hash = "sha256:bbe2adb5a03e6e3571b573f42527c6fe926e17467833660bebd11593ab8dfd57", size = 222095, upload-time = "2025-12-22T06:53:53.309Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/79/de6c16cc902f4fc372236926b0ce2ab7845268dcc30fb2fbb7f71b418631/marshmallow-3.26.2.tar.gz", hash = "sha256:bbe2adb5a03e6e3571b573f42527c6fe926e17467833660bebd11593ab8dfd57", size = 222095 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/be/2f/5108cb3ee4ba6501748c4908b908e55f42a5b66245b4cfe0c99326e1ef6e/marshmallow-3.26.2-py3-none-any.whl", hash = "sha256:013fa8a3c4c276c24d26d84ce934dc964e2aa794345a0f8c7e5a7191482c8a73", size = 50964, upload-time = "2025-12-22T06:53:51.801Z" }, + { url = "https://files.pythonhosted.org/packages/be/2f/5108cb3ee4ba6501748c4908b908e55f42a5b66245b4cfe0c99326e1ef6e/marshmallow-3.26.2-py3-none-any.whl", hash = "sha256:013fa8a3c4c276c24d26d84ce934dc964e2aa794345a0f8c7e5a7191482c8a73", size = 50964 }, ] [[package]] name = "mcp" version = "1.28.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "httpx" }, @@ -2650,92 +2353,92 @@ dependencies = [ { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6e/77/9450b8f251a13affb6281997d0523c4615f8a8b35d0b21ff30db3a5aac9d/mcp-1.28.1.tar.gz", hash = "sha256:d51e36a5f5644faea4f85ea649bfffa6bc6c26770d42798ad6a3de3d2ba69683", size = 638501, upload-time = "2026-06-26T12:57:29.093Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/77/9450b8f251a13affb6281997d0523c4615f8a8b35d0b21ff30db3a5aac9d/mcp-1.28.1.tar.gz", hash = "sha256:d51e36a5f5644faea4f85ea649bfffa6bc6c26770d42798ad6a3de3d2ba69683", size = 638501 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/5e/d118fce19f87a2e7d8101c35c8ae0ec289098a4df0ff244cec23e415aca0/mcp-1.28.1-py3-none-any.whl", hash = "sha256:2726bca5e7193f61c5dde8b12500a6de2d9acf6d1a1c0be9e8c2e706437991df", size = 222620, upload-time = "2026-06-26T12:57:27.218Z" }, + { url = "https://files.pythonhosted.org/packages/e2/5e/d118fce19f87a2e7d8101c35c8ae0ec289098a4df0ff244cec23e415aca0/mcp-1.28.1-py3-none-any.whl", hash = "sha256:2726bca5e7193f61c5dde8b12500a6de2d9acf6d1a1c0be9e8c2e706437991df", size = 222620 }, ] [[package]] name = "mcp-run" version = "0.5.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "extism" }, { name = "mcp" }, { name = "requests" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/5e/99422329beb04d4a4b7d150e469e7ae1d85e68d09888e077dee57ff5a509/mcp_run-0.5.0.tar.gz", hash = "sha256:f6270283dcb51328dfd97b984a4d1264d5d04853340d94dd0abaf7b53ad25f75", size = 13366, upload-time = "2025-05-08T22:12:33.562Z" } +sdist = { url = "https://files.pythonhosted.org/packages/27/5e/99422329beb04d4a4b7d150e469e7ae1d85e68d09888e077dee57ff5a509/mcp_run-0.5.0.tar.gz", hash = "sha256:f6270283dcb51328dfd97b984a4d1264d5d04853340d94dd0abaf7b53ad25f75", size = 13366 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/d4/b4f925a6f57c680e10fc4766af607de62cca8cfd28664a5cd67e3f0351a1/mcp_run-0.5.0-py3-none-any.whl", hash = "sha256:ba30756d7e6feb872e82d08fd0267638b9bd88c2c326bcd6ac5cb51cf59a3969", size = 14038, upload-time = "2025-05-08T22:12:32.365Z" }, + { url = "https://files.pythonhosted.org/packages/02/d4/b4f925a6f57c680e10fc4766af607de62cca8cfd28664a5cd67e3f0351a1/mcp_run-0.5.0-py3-none-any.whl", hash = "sha256:ba30756d7e6feb872e82d08fd0267638b9bd88c2c326bcd6ac5cb51cf59a3969", size = 14038 }, ] [[package]] name = "mcpx-py" version = "0.7.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mcpx-pydantic-ai" }, { name = "psutil" }, { name = "python-dotenv" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/86/05715a4edf13f591e6b8f9925e691abbadcaadabb9c1db176355995e510b/mcpx_py-0.7.0.tar.gz", hash = "sha256:f6726b6606debacbc86a6c2d76083179ebc530264d41e4c451db96000f7b3347", size = 8120, upload-time = "2025-05-08T22:17:43.698Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/86/05715a4edf13f591e6b8f9925e691abbadcaadabb9c1db176355995e510b/mcpx_py-0.7.0.tar.gz", hash = "sha256:f6726b6606debacbc86a6c2d76083179ebc530264d41e4c451db96000f7b3347", size = 8120 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/1d/92b95bb02f8e39f0e31d6786edbf60ecfad4acb833a9804861bbef61de39/mcpx_py-0.7.0-py3-none-any.whl", hash = "sha256:72501095019401cffe6821466a8ebf585aa3f82a8e4f6130b31cedc9c61844dc", size = 7175, upload-time = "2025-05-08T22:17:42.471Z" }, + { url = "https://files.pythonhosted.org/packages/79/1d/92b95bb02f8e39f0e31d6786edbf60ecfad4acb833a9804861bbef61de39/mcpx_py-0.7.0-py3-none-any.whl", hash = "sha256:72501095019401cffe6821466a8ebf585aa3f82a8e4f6130b31cedc9c61844dc", size = 7175 }, ] [[package]] name = "mcpx-pydantic-ai" version = "0.7.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mcp-run" }, { name = "pydantic" }, { name = "pydantic-ai" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/ce/a4587c7f41960eb243aa7298f0ba4eda357cdd20f843640dae2949f053dd/mcpx_pydantic_ai-0.7.0.tar.gz", hash = "sha256:c7d951c96fd8bc1ea2731562d6e1b76c5d274d3b84afc3fc8524be669ce3c81d", size = 2720, upload-time = "2025-05-08T22:15:45.303Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/ce/a4587c7f41960eb243aa7298f0ba4eda357cdd20f843640dae2949f053dd/mcpx_pydantic_ai-0.7.0.tar.gz", hash = "sha256:c7d951c96fd8bc1ea2731562d6e1b76c5d274d3b84afc3fc8524be669ce3c81d", size = 2720 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/46/d9/cda159c1d06cb4a31bf38027492fcae91d44f026a3a813c9772ba0169106/mcpx_pydantic_ai-0.7.0-py3-none-any.whl", hash = "sha256:e50cc29a4219e33c4eba3737cf0106ded18c748590a2fa79264d97decd6a80bd", size = 2128, upload-time = "2025-05-08T22:15:44.31Z" }, + { url = "https://files.pythonhosted.org/packages/46/d9/cda159c1d06cb4a31bf38027492fcae91d44f026a3a813c9772ba0169106/mcpx_pydantic_ai-0.7.0-py3-none-any.whl", hash = "sha256:e50cc29a4219e33c4eba3737cf0106ded18c748590a2fa79264d97decd6a80bd", size = 2128 }, ] [[package]] name = "mdurl" version = "0.1.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, ] [[package]] name = "mergedeep" version = "1.3.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354 }, ] [[package]] name = "miniaudio" version = "1.71" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d8/d5/e5439dc08561f73656bfeb3340fc64ab63163e101426593d8fb9a025ff1e/miniaudio-1.71.tar.gz", hash = "sha256:ff51e2887bb673e2e757752b586b3dc924d59aa5fbcae9bbc45f4a111bd3262b", size = 1116480, upload-time = "2026-04-29T21:20:38.182Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/d5/e5439dc08561f73656bfeb3340fc64ab63163e101426593d8fb9a025ff1e/miniaudio-1.71.tar.gz", hash = "sha256:ff51e2887bb673e2e757752b586b3dc924d59aa5fbcae9bbc45f4a111bd3262b", size = 1116480 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/85/44545f767ec21142ffed5f9108406d11dc8a19aafed9bd57621a0892bb60/miniaudio-1.71-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:61b86f26d653040db32d9d15b05446321dd10e45beba25b44f841e26935213d5", size = 377184, upload-time = "2026-04-29T21:20:24.109Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bd/d1/071a560000c8ce903dc919968ecce40fbe7a73213ac399051b887184f8a3/miniaudio-1.71-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d9dc15eff711bcfc62a9d05e0c78e4bc34821a455595e049629f2fea7491a523", size = 351488, upload-time = "2026-04-29T21:20:25.183Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/46/24/5873a569451cae5686fb656ebd78ffe0b5eebe48ca21ef61e227d237d20a/miniaudio-1.71-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12bc33e7e61072b4b541c14e10ef76119d5643e6bbb98e2dec0c0738889438fb", size = 643552, upload-time = "2026-04-29T21:20:26.211Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/9b/25785525e6b5ff9afd7f4c4279215dc09c3317ea4d837275b1ae17912b36/miniaudio-1.71-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70fa2ea5353e6919aca59b8c5768144af009d18c3bca251749d66fb497424563", size = 645171, upload-time = "2026-04-29T21:20:27.494Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/6d/cbfd55fdc40256231f7b0c861e2bf79cc289bfbbe5e15869317944e6d673/miniaudio-1.71-cp313-cp313-win32.whl", hash = "sha256:1bf93aeede652926f27f430f0fd69ef0cf8a949c07b537d6a2f295602c747037", size = 235088, upload-time = "2026-04-29T21:20:29.031Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8d/8d/d5059c04b247b1079c0e48914a9ec20352910a3b9373060fb258dfd194ab/miniaudio-1.71-cp313-cp313-win_amd64.whl", hash = "sha256:4c849ccb1349f7b3553a77a66fe7e972315185f5c4c44a0bbda7ebcdd224db37", size = 274247, upload-time = "2026-04-29T21:20:29.96Z" }, + { url = "https://files.pythonhosted.org/packages/3a/85/44545f767ec21142ffed5f9108406d11dc8a19aafed9bd57621a0892bb60/miniaudio-1.71-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:61b86f26d653040db32d9d15b05446321dd10e45beba25b44f841e26935213d5", size = 377184 }, + { url = "https://files.pythonhosted.org/packages/bd/d1/071a560000c8ce903dc919968ecce40fbe7a73213ac399051b887184f8a3/miniaudio-1.71-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d9dc15eff711bcfc62a9d05e0c78e4bc34821a455595e049629f2fea7491a523", size = 351488 }, + { url = "https://files.pythonhosted.org/packages/46/24/5873a569451cae5686fb656ebd78ffe0b5eebe48ca21ef61e227d237d20a/miniaudio-1.71-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12bc33e7e61072b4b541c14e10ef76119d5643e6bbb98e2dec0c0738889438fb", size = 643552 }, + { url = "https://files.pythonhosted.org/packages/90/9b/25785525e6b5ff9afd7f4c4279215dc09c3317ea4d837275b1ae17912b36/miniaudio-1.71-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70fa2ea5353e6919aca59b8c5768144af009d18c3bca251749d66fb497424563", size = 645171 }, + { url = "https://files.pythonhosted.org/packages/b1/6d/cbfd55fdc40256231f7b0c861e2bf79cc289bfbbe5e15869317944e6d673/miniaudio-1.71-cp313-cp313-win32.whl", hash = "sha256:1bf93aeede652926f27f430f0fd69ef0cf8a949c07b537d6a2f295602c747037", size = 235088 }, + { url = "https://files.pythonhosted.org/packages/8d/8d/d5059c04b247b1079c0e48914a9ec20352910a3b9373060fb258dfd194ab/miniaudio-1.71-cp313-cp313-win_amd64.whl", hash = "sha256:4c849ccb1349f7b3553a77a66fe7e972315185f5c4c44a0bbda7ebcdd224db37", size = 274247 }, ] [[package]] name = "mistralai" version = "2.7.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "eval-type-backport" }, { name = "httpx" }, @@ -2746,15 +2449,15 @@ dependencies = [ { name = "python-dateutil" }, { name = "typing-inspection" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/f2/5a2fdcbee80e83674fab398cedbfa97e0b35f316fadd6ff85c37c8054e84/mistralai-2.7.2.tar.gz", hash = "sha256:184b7a502e69cc7cdeb0b095020d7e9407a9544c4496f0317984263dac3d7939", size = 535414, upload-time = "2026-07-24T13:06:55.577Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/f2/5a2fdcbee80e83674fab398cedbfa97e0b35f316fadd6ff85c37c8054e84/mistralai-2.7.2.tar.gz", hash = "sha256:184b7a502e69cc7cdeb0b095020d7e9407a9544c4496f0317984263dac3d7939", size = 535414 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/40/e2c0cca6da63716a384776a9e348ebcdb693e04a06e3c9db189439d0077c/mistralai-2.7.2-py3-none-any.whl", hash = "sha256:b2b26fa43670d6247ea352c23fe821605ecbbcf305755b629e804dbd3f6fd439", size = 1273387, upload-time = "2026-07-24T13:06:53.649Z" }, + { url = "https://files.pythonhosted.org/packages/82/40/e2c0cca6da63716a384776a9e348ebcdb693e04a06e3c9db189439d0077c/mistralai-2.7.2-py3-none-any.whl", hash = "sha256:b2b26fa43670d6247ea352c23fe821605ecbbcf305755b629e804dbd3f6fd439", size = 1273387 }, ] [[package]] name = "mkdocs" version = "1.6.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -2770,43 +2473,43 @@ dependencies = [ { name = "pyyaml-env-tag" }, { name = "watchdog" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451 }, ] [[package]] name = "mkdocs-autorefs" version = "1.4.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "markupsafe" }, { name = "mkdocs" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/52/c0/f641843de3f612a6b48253f39244165acff36657a91cc903633d456ae1ac/mkdocs_autorefs-1.4.4.tar.gz", hash = "sha256:d54a284f27a7346b9c38f1f852177940c222da508e66edc816a0fa55fc6da197", size = 56588, upload-time = "2026-02-10T15:23:55.105Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/c0/f641843de3f612a6b48253f39244165acff36657a91cc903633d456ae1ac/mkdocs_autorefs-1.4.4.tar.gz", hash = "sha256:d54a284f27a7346b9c38f1f852177940c222da508e66edc816a0fa55fc6da197", size = 56588 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl", hash = "sha256:834ef5408d827071ad1bc69e0f39704fa34c7fc05bc8e1c72b227dfdc5c76089", size = 25530, upload-time = "2026-02-10T15:23:53.817Z" }, + { url = "https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl", hash = "sha256:834ef5408d827071ad1bc69e0f39704fa34c7fc05bc8e1c72b227dfdc5c76089", size = 25530 }, ] [[package]] name = "mkdocs-get-deps" version = "0.2.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mergedeep" }, { name = "platformdirs" }, { name = "pyyaml" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/25/b3cccb187655b9393572bde9b09261d267c3bf2f2cdabe347673be5976a6/mkdocs_get_deps-0.2.2.tar.gz", hash = "sha256:8ee8d5f316cdbbb2834bc1df6e69c08fe769a83e040060de26d3c19fad3599a1", size = 11047, upload-time = "2026-03-10T02:46:33.632Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/25/b3cccb187655b9393572bde9b09261d267c3bf2f2cdabe347673be5976a6/mkdocs_get_deps-0.2.2.tar.gz", hash = "sha256:8ee8d5f316cdbbb2834bc1df6e69c08fe769a83e040060de26d3c19fad3599a1", size = 11047 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/29/744136411e785c4b0b744d5413e56555265939ab3a104c6a4b719dad33fd/mkdocs_get_deps-0.2.2-py3-none-any.whl", hash = "sha256:e7878cbeac04860b8b5e0ca31d3abad3df9411a75a32cde82f8e44b6c16ff650", size = 9555, upload-time = "2026-03-10T02:46:32.256Z" }, + { url = "https://files.pythonhosted.org/packages/88/29/744136411e785c4b0b744d5413e56555265939ab3a104c6a4b719dad33fd/mkdocs_get_deps-0.2.2-py3-none-any.whl", hash = "sha256:e7878cbeac04860b8b5e0ca31d3abad3df9411a75a32cde82f8e44b6c16ff650", size = 9555 }, ] [[package]] name = "mkdocs-material" version = "9.7.7" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, { name = "backrefs" }, @@ -2820,24 +2523,24 @@ dependencies = [ { name = "pymdown-extensions" }, { name = "requests" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/cd/c05d3a530ba7934f144fb45f7203cd236adc25c7bdcc34673d202f4b0278/mkdocs_material-9.7.7.tar.gz", hash = "sha256:c0649c065b1b0512d60aad8c10f947f8e455284475239b364b610f2deb4d0855", size = 4097923, upload-time = "2026-07-17T16:21:33.156Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/cd/c05d3a530ba7934f144fb45f7203cd236adc25c7bdcc34673d202f4b0278/mkdocs_material-9.7.7.tar.gz", hash = "sha256:c0649c065b1b0512d60aad8c10f947f8e455284475239b364b610f2deb4d0855", size = 4097923 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ad/21/17c1bc9e6f47c972ad66fb2ac2568f99f90f1207eeb6fc3b34d094dba7b5/mkdocs_material-9.7.7-py3-none-any.whl", hash = "sha256:8ea9bb1737a5b524a5f9dcf2e1b4ebda8274ae3008aa7845720a97083bef708f", size = 9305438, upload-time = "2026-07-17T16:21:30.017Z" }, + { url = "https://files.pythonhosted.org/packages/ad/21/17c1bc9e6f47c972ad66fb2ac2568f99f90f1207eeb6fc3b34d094dba7b5/mkdocs_material-9.7.7-py3-none-any.whl", hash = "sha256:8ea9bb1737a5b524a5f9dcf2e1b4ebda8274ae3008aa7845720a97083bef708f", size = 9305438 }, ] [[package]] name = "mkdocs-material-extensions" version = "1.3.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31" }, + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728 }, ] [[package]] name = "mkdocstrings" version = "1.0.6" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, { name = "markdown" }, @@ -2846,9 +2549,9 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "pymdown-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/71/f85bdf13355073ae15a7375f09879375a830553552e58c1c4b7e0bbc5c8b/mkdocstrings-1.0.6.tar.gz", hash = "sha256:a0b8c2bdd29a6416c80d717aa369bbf7831946bd9f23c2a66db1b1dbe7693dbd", size = 100649, upload-time = "2026-07-11T19:38:05.732Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/71/f85bdf13355073ae15a7375f09879375a830553552e58c1c4b7e0bbc5c8b/mkdocstrings-1.0.6.tar.gz", hash = "sha256:a0b8c2bdd29a6416c80d717aa369bbf7831946bd9f23c2a66db1b1dbe7693dbd", size = 100649 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/5b/4c1902e8bdd5c4db63284e9d101dece4038d4025d6d88850ffe0a1578980/mkdocstrings-1.0.6-py3-none-any.whl", hash = "sha256:2703708697487d1b6d6d7b412e176fa436edf120c1bf81dc9e126b12d00893c7", size = 35787, upload-time = "2026-07-11T19:38:04.417Z" }, + { url = "https://files.pythonhosted.org/packages/5d/5b/4c1902e8bdd5c4db63284e9d101dece4038d4025d6d88850ffe0a1578980/mkdocstrings-1.0.6-py3-none-any.whl", hash = "sha256:2703708697487d1b6d6d7b412e176fa436edf120c1bf81dc9e126b12d00893c7", size = 35787 }, ] [package.optional-dependencies] @@ -2859,38 +2562,37 @@ python = [ [[package]] name = "mkdocstrings-python" version = "2.0.5" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "griffelib" }, { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/b6/e858701499d57eee8b3fd8e78168083956c6683ddbe727b46758b19e1119/mkdocstrings_python-2.0.5.tar.gz", hash = "sha256:3a4d92556ad39637e88af94a5374213af9a8e3040c3824ceaed04b486c017594", size = 199578, upload-time = "2026-06-19T10:41:08.868Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/b6/e858701499d57eee8b3fd8e78168083956c6683ddbe727b46758b19e1119/mkdocstrings_python-2.0.5.tar.gz", hash = "sha256:3a4d92556ad39637e88af94a5374213af9a8e3040c3824ceaed04b486c017594", size = 199578 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/fc/10ab7e80650a9c9e8f4f1105f8c8e73567f88ed0c06ada589ab81d38687c/mkdocstrings_python-2.0.5-py3-none-any.whl", hash = "sha256:30c837bbff016549f659fcba6539ac351303f0fd7e713c89a040611072236e9d", size = 104951, upload-time = "2026-06-19T10:41:07.378Z" }, + { url = "https://files.pythonhosted.org/packages/d1/fc/10ab7e80650a9c9e8f4f1105f8c8e73567f88ed0c06ada589ab81d38687c/mkdocstrings_python-2.0.5-py3-none-any.whl", hash = "sha256:30c837bbff016549f659fcba6539ac351303f0fd7e713c89a040611072236e9d", size = 104951 }, ] [[package]] name = "mkdown" version = "1.0.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyenv" }, { name = "pydantic" }, { name = "schemez" }, { name = "upathtools" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/2f/7c01c56d2ece11838505baeb7169b1d37593be8dbc9958a665660e401ce1/mkdown-1.0.1.tar.gz", hash = "sha256:3d0591f1ff16d513eefa36e3f9de4e52121e2c5dccc35b583a803e994d9f7125", size = 16373, upload-time = "2025-10-07T20:15:17.771Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/2f/7c01c56d2ece11838505baeb7169b1d37593be8dbc9958a665660e401ce1/mkdown-1.0.1.tar.gz", hash = "sha256:3d0591f1ff16d513eefa36e3f9de4e52121e2c5dccc35b583a803e994d9f7125", size = 16373 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/34/29cac5028652780cb9709944c5244660c30011812ade255cd4d7104402c8/mkdown-1.0.1-py3-none-any.whl", hash = "sha256:5d027f59f333670617e7f500c79377f4c022ec28be4500732f2a5750113da7e9", size = 18086, upload-time = "2025-10-07T20:15:16.512Z" }, + { url = "https://files.pythonhosted.org/packages/0d/34/29cac5028652780cb9709944c5244660c30011812ade255cd4d7104402c8/mkdown-1.0.1-py3-none-any.whl", hash = "sha256:5d027f59f333670617e7f500c79377f4c022ec28be4500732f2a5750113da7e9", size = 18086 }, ] [[package]] name = "mknodes" version = "2.2.14" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "agentpool" }, { name = "anybadge" }, { name = "anyenv", extra = ["httpx"] }, { name = "clinspector" }, @@ -2915,120 +2617,121 @@ dependencies = [ { name = "typer" }, { name = "universal-pathlib" }, { name = "upathtools", extra = ["httpx"] }, + { name = "wolfharness" }, { name = "yamling" }, { name = "zensical" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/4d/0fc0269801c55d3d434b391cd99b518a7e5a59739376b3db23ff6037cd55/mknodes-2.2.14.tar.gz", hash = "sha256:ab572a394121b309c05f572ad96f14e9c6defab5a3f7dfe7e8d95ea8168be4c6", size = 342702, upload-time = "2026-03-06T00:53:15.047Z" } +sdist = { url = "https://files.pythonhosted.org/packages/12/4d/0fc0269801c55d3d434b391cd99b518a7e5a59739376b3db23ff6037cd55/mknodes-2.2.14.tar.gz", hash = "sha256:ab572a394121b309c05f572ad96f14e9c6defab5a3f7dfe7e8d95ea8168be4c6", size = 342702 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/65/8e0828b326c2b50e95ba5d2dd5e9fe807acf45bdf96482e0d6d09deee8be/mknodes-2.2.14-py3-none-any.whl", hash = "sha256:ce544198ff5fcd29ad6b258877e8cbe76ea86cd9e4fde4fbb3f6afb843681baa", size = 472582, upload-time = "2026-03-06T00:53:11.905Z" }, + { url = "https://files.pythonhosted.org/packages/83/65/8e0828b326c2b50e95ba5d2dd5e9fe807acf45bdf96482e0d6d09deee8be/mknodes-2.2.14-py3-none-any.whl", hash = "sha256:ce544198ff5fcd29ad6b258877e8cbe76ea86cd9e4fde4fbb3f6afb843681baa", size = 472582 }, ] [[package]] name = "mmh3" version = "5.2.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/1a/edb23803a168f070ded7a3014c6d706f63b90c84ccc024f89d794a3b7a6d/mmh3-5.2.1.tar.gz", hash = "sha256:bbea5b775f0ac84945191fb83f845a6fd9a21a03ea7f2e187defac7e401616ad", size = 33775, upload-time = "2026-03-05T15:55:57.716Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/25/a5/9daa0508a1569a54130f6198d5462a92deda870043624aa3ea72721aa765/mmh3-5.2.1-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:723b2681ed4cc07d3401bbea9c201ad4f2a4ca6ba8cddaff6789f715dd2b391e", size = 40832, upload-time = "2026-03-05T15:54:43.212Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/6b/3230c6d80c1f4b766dedf280a92c2241e99f87c1504ff74205ec8cebe451/mmh3-5.2.1-cp313-cp313-android_21_x86_64.whl", hash = "sha256:3619473a0e0d329fd4aec8075628f8f616be2da41605300696206d6f36920c3d", size = 41964, upload-time = "2026-03-05T15:54:44.204Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/fb/648bfddb74a872004b6ee751551bfdda783fe6d70d2e9723bad84dbe5311/mmh3-5.2.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:e48d4dbe0f88e53081da605ae68644e5182752803bbc2beb228cca7f1c4454d6", size = 39114, upload-time = "2026-03-05T15:54:45.205Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/c2/ab7901f87af438468b496728d11264cb397b3574d41506e71b92128e0373/mmh3-5.2.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a482ac121de6973897c92c2f31defc6bafb11c83825109275cffce54bb64933f", size = 39819, upload-time = "2026-03-05T15:54:46.509Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/ed/6f88dda0df67de1612f2e130ffea34cf84aaee5bff5b0aff4dbff2babe34/mmh3-5.2.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:17fbb47f0885ace8327ce1235d0416dc86a211dcd8cc1e703f41523be32cfec8", size = 40330, upload-time = "2026-03-05T15:54:47.864Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/66/7516d23f53cdf90f43fce24ab80c28f45e6851d78b46bef8c02084edf583/mmh3-5.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d51fde50a77f81330523562e3c2734ffdca9c4c9e9d355478117905e1cfe16c6", size = 56078, upload-time = "2026-03-05T15:54:48.9Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/34/4d152fdf4a91a132cb226b671f11c6b796eada9ab78080fb5ce1e95adaab/mmh3-5.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:19bbd3b841174ae6ed588536ab5e1b1fe83d046e668602c20266547298d939a9", size = 40498, upload-time = "2026-03-05T15:54:49.942Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/4c/8e3af1b6d85a299767ec97bd923f12b06267089c1472c27c1696870d1175/mmh3-5.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be77c402d5e882b6fbacfd90823f13da8e0a69658405a39a569c6b58fdb17b03", size = 40033, upload-time = "2026-03-05T15:54:50.994Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/f2/966ea560e32578d453c9e9db53d602cbb1d0da27317e232afa7c38ceba11/mmh3-5.2.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fd96476f04db5ceba1cfa0f21228f67c1f7402296f0e73fee3513aa680ad237b", size = 97320, upload-time = "2026-03-05T15:54:52.072Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bb/0d/2c5f9893b38aeb6b034d1a44ecd55a010148054f6a516abe53b5e4057297/mmh3-5.2.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:707151644085dd0f20fe4f4b573d28e5130c4aaa5f587e95b60989c5926653b5", size = 103299, upload-time = "2026-03-05T15:54:53.569Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/fc/2ebaef4a4d4376f89761274dc274035ffd96006ab496b4ee5af9b08f21a9/mmh3-5.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3737303ca9ea0f7cb83028781148fcda4f1dac7821db0c47672971dabcf63593", size = 106222, upload-time = "2026-03-05T15:54:55.092Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/09/ea7ffe126d0ba0406622602a2d05e1e1a6841cc92fc322eb576c95b27fad/mmh3-5.2.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2778fed822d7db23ac5008b181441af0c869455b2e7d001f4019636ac31b6fe4", size = 113048, upload-time = "2026-03-05T15:54:56.305Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/85/57/9447032edf93a64aa9bef4d9aa596400b1756f40411890f77a284f6293ca/mmh3-5.2.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d57dea657357230cc780e13920d7fa7db059d58fe721c80020f94476da4ca0a1", size = 120742, upload-time = "2026-03-05T15:54:57.453Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/82/a86cc87cc88c92e9e1a598fee509f0409435b57879a6129bf3b3e40513c7/mmh3-5.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:169e0d178cb59314456ab30772429a802b25d13227088085b0d49b9fe1533104", size = 99132, upload-time = "2026-03-05T15:54:58.583Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/54/f7/6b16eb1b40ee89bb740698735574536bc20d6cdafc65ae702ea235578e05/mmh3-5.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7e4e1f580033335c6f76d1e0d6b56baf009d1a64d6a4816347e4271ba951f46d", size = 98686, upload-time = "2026-03-05T15:55:00.078Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/88/a601e9f32ad1410f438a6d0544298ea621f989bd34a0731a7190f7dec799/mmh3-5.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2bd9f19f7f1fcebd74e830f4af0f28adad4975d40d80620be19ffb2b2af56c9f", size = 106479, upload-time = "2026-03-05T15:55:01.532Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/5c/ce29ae3dfc4feec4007a437a1b7435fb9507532a25147602cd5b52be86db/mmh3-5.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c88653877aeb514c089d1b3d473451677b8b9a6d1497dbddf1ae7934518b06d2", size = 110030, upload-time = "2026-03-05T15:55:02.934Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/30/ae444ef2ff87c805d525da4fa63d27cda4fe8a48e77003a036b8461cfd5c/mmh3-5.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fceef7fe67c81e1585198215e42ad3fdba3a25644beda8fbdaf85f4d7b93175a", size = 97536, upload-time = "2026-03-05T15:55:04.135Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4b/f9/dc3787ee5c813cc27fe79f45ad4500d9b5437f23a7402435cc34e07c7718/mmh3-5.2.1-cp313-cp313-win32.whl", hash = "sha256:54b64fb2433bc71488e7a449603bf8bd31fbcf9cb56fbe1eb6d459e90b86c37b", size = 40769, upload-time = "2026-03-05T15:55:05.277Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/67/850e0b5a1e97799822ebfc4ca0e8c6ece3ed8baf7dcdf64de817dfdda2ca/mmh3-5.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:cae6383181f1e345317742d2ddd88f9e7d2682fa4c9432e3a74e47d92dce0229", size = 41563, upload-time = "2026-03-05T15:55:06.283Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/cc/98c90b28e1da5458e19fbfaf4adb5289208d3bfccd45dd14eab216a2f0bb/mmh3-5.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:022aa1a528604e6c83d0a7705fdef0b5355d897a9e0fa3a8d26709ceaa06965d", size = 39310, upload-time = "2026-03-05T15:55:07.323Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/1a/edb23803a168f070ded7a3014c6d706f63b90c84ccc024f89d794a3b7a6d/mmh3-5.2.1.tar.gz", hash = "sha256:bbea5b775f0ac84945191fb83f845a6fd9a21a03ea7f2e187defac7e401616ad", size = 33775 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/a5/9daa0508a1569a54130f6198d5462a92deda870043624aa3ea72721aa765/mmh3-5.2.1-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:723b2681ed4cc07d3401bbea9c201ad4f2a4ca6ba8cddaff6789f715dd2b391e", size = 40832 }, + { url = "https://files.pythonhosted.org/packages/0a/6b/3230c6d80c1f4b766dedf280a92c2241e99f87c1504ff74205ec8cebe451/mmh3-5.2.1-cp313-cp313-android_21_x86_64.whl", hash = "sha256:3619473a0e0d329fd4aec8075628f8f616be2da41605300696206d6f36920c3d", size = 41964 }, + { url = "https://files.pythonhosted.org/packages/62/fb/648bfddb74a872004b6ee751551bfdda783fe6d70d2e9723bad84dbe5311/mmh3-5.2.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:e48d4dbe0f88e53081da605ae68644e5182752803bbc2beb228cca7f1c4454d6", size = 39114 }, + { url = "https://files.pythonhosted.org/packages/95/c2/ab7901f87af438468b496728d11264cb397b3574d41506e71b92128e0373/mmh3-5.2.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a482ac121de6973897c92c2f31defc6bafb11c83825109275cffce54bb64933f", size = 39819 }, + { url = "https://files.pythonhosted.org/packages/2f/ed/6f88dda0df67de1612f2e130ffea34cf84aaee5bff5b0aff4dbff2babe34/mmh3-5.2.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:17fbb47f0885ace8327ce1235d0416dc86a211dcd8cc1e703f41523be32cfec8", size = 40330 }, + { url = "https://files.pythonhosted.org/packages/3d/66/7516d23f53cdf90f43fce24ab80c28f45e6851d78b46bef8c02084edf583/mmh3-5.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d51fde50a77f81330523562e3c2734ffdca9c4c9e9d355478117905e1cfe16c6", size = 56078 }, + { url = "https://files.pythonhosted.org/packages/bc/34/4d152fdf4a91a132cb226b671f11c6b796eada9ab78080fb5ce1e95adaab/mmh3-5.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:19bbd3b841174ae6ed588536ab5e1b1fe83d046e668602c20266547298d939a9", size = 40498 }, + { url = "https://files.pythonhosted.org/packages/d4/4c/8e3af1b6d85a299767ec97bd923f12b06267089c1472c27c1696870d1175/mmh3-5.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be77c402d5e882b6fbacfd90823f13da8e0a69658405a39a569c6b58fdb17b03", size = 40033 }, + { url = "https://files.pythonhosted.org/packages/8b/f2/966ea560e32578d453c9e9db53d602cbb1d0da27317e232afa7c38ceba11/mmh3-5.2.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fd96476f04db5ceba1cfa0f21228f67c1f7402296f0e73fee3513aa680ad237b", size = 97320 }, + { url = "https://files.pythonhosted.org/packages/bb/0d/2c5f9893b38aeb6b034d1a44ecd55a010148054f6a516abe53b5e4057297/mmh3-5.2.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:707151644085dd0f20fe4f4b573d28e5130c4aaa5f587e95b60989c5926653b5", size = 103299 }, + { url = "https://files.pythonhosted.org/packages/1c/fc/2ebaef4a4d4376f89761274dc274035ffd96006ab496b4ee5af9b08f21a9/mmh3-5.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3737303ca9ea0f7cb83028781148fcda4f1dac7821db0c47672971dabcf63593", size = 106222 }, + { url = "https://files.pythonhosted.org/packages/57/09/ea7ffe126d0ba0406622602a2d05e1e1a6841cc92fc322eb576c95b27fad/mmh3-5.2.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2778fed822d7db23ac5008b181441af0c869455b2e7d001f4019636ac31b6fe4", size = 113048 }, + { url = "https://files.pythonhosted.org/packages/85/57/9447032edf93a64aa9bef4d9aa596400b1756f40411890f77a284f6293ca/mmh3-5.2.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d57dea657357230cc780e13920d7fa7db059d58fe721c80020f94476da4ca0a1", size = 120742 }, + { url = "https://files.pythonhosted.org/packages/53/82/a86cc87cc88c92e9e1a598fee509f0409435b57879a6129bf3b3e40513c7/mmh3-5.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:169e0d178cb59314456ab30772429a802b25d13227088085b0d49b9fe1533104", size = 99132 }, + { url = "https://files.pythonhosted.org/packages/54/f7/6b16eb1b40ee89bb740698735574536bc20d6cdafc65ae702ea235578e05/mmh3-5.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7e4e1f580033335c6f76d1e0d6b56baf009d1a64d6a4816347e4271ba951f46d", size = 98686 }, + { url = "https://files.pythonhosted.org/packages/e8/88/a601e9f32ad1410f438a6d0544298ea621f989bd34a0731a7190f7dec799/mmh3-5.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2bd9f19f7f1fcebd74e830f4af0f28adad4975d40d80620be19ffb2b2af56c9f", size = 106479 }, + { url = "https://files.pythonhosted.org/packages/d6/5c/ce29ae3dfc4feec4007a437a1b7435fb9507532a25147602cd5b52be86db/mmh3-5.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c88653877aeb514c089d1b3d473451677b8b9a6d1497dbddf1ae7934518b06d2", size = 110030 }, + { url = "https://files.pythonhosted.org/packages/13/30/ae444ef2ff87c805d525da4fa63d27cda4fe8a48e77003a036b8461cfd5c/mmh3-5.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fceef7fe67c81e1585198215e42ad3fdba3a25644beda8fbdaf85f4d7b93175a", size = 97536 }, + { url = "https://files.pythonhosted.org/packages/4b/f9/dc3787ee5c813cc27fe79f45ad4500d9b5437f23a7402435cc34e07c7718/mmh3-5.2.1-cp313-cp313-win32.whl", hash = "sha256:54b64fb2433bc71488e7a449603bf8bd31fbcf9cb56fbe1eb6d459e90b86c37b", size = 40769 }, + { url = "https://files.pythonhosted.org/packages/43/67/850e0b5a1e97799822ebfc4ca0e8c6ece3ed8baf7dcdf64de817dfdda2ca/mmh3-5.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:cae6383181f1e345317742d2ddd88f9e7d2682fa4c9432e3a74e47d92dce0229", size = 41563 }, + { url = "https://files.pythonhosted.org/packages/c0/cc/98c90b28e1da5458e19fbfaf4adb5289208d3bfccd45dd14eab216a2f0bb/mmh3-5.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:022aa1a528604e6c83d0a7705fdef0b5355d897a9e0fa3a8d26709ceaa06965d", size = 39310 }, ] [[package]] name = "more-itertools" version = "11.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", size = 145772, upload-time = "2026-05-22T14:14:29.909Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", size = 145772 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", size = 72226, upload-time = "2026-05-22T14:14:28.824Z" }, + { url = "https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", size = 72226 }, ] [[package]] name = "msgpack" version = "1.2.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960, upload-time = "2026-06-18T16:13:52.594Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/ac/dcddcab6f6c20ecb387ca5e980371cdb3f87ff69aeca388be97eebc4c074/msgpack-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a70e3cf2804a300d921bb0940426e35f4e489a23adfb77a808892241db0a064", size = 83151, upload-time = "2026-06-18T16:13:12.173Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/71/fbcfa83a1d6a9c6091942d1cfd070962244664b87427a9a49a6897b1b219/msgpack-1.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:491cc39455ca765fad51fb451bf2915eb2cf41192ab5801ce8d67c1d614fe056", size = 82351, upload-time = "2026-06-18T16:13:13.194Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/10/ddf7b06db879e8792d13934ddda09ff20bd2a583fd84c9b59aae9b0e650b/msgpack-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f310233ef7fb9c14e201c93639fe5f5260b005f56f0b29048e999c30935596cc", size = 407518, upload-time = "2026-06-18T16:13:14.233Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/d3/36a46a8ed992b781acbc05928bd5bee3c810cb0c3563bf81a7b0c04a1a76/msgpack-1.2.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787c9bebb5833e8f6fc8abca3c0597683d8d87f56a8842b6b89c75a5f3176e2d", size = 416405, upload-time = "2026-06-18T16:13:15.435Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/84/e8e9598b557c0ba6ddae901a73780a4c75ac667dddf59414b1e56a42fb34/msgpack-1.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc871b997a9370d855b7394465f2f350e847a5b806dd38dcc9c989e7d87da155", size = 376257, upload-time = "2026-06-18T16:13:17.022Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/16/738fe6d875ad7e2a9429c165322a4ec088f4f273cdfae63d96a89c467961/msgpack-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85f57e960d877f2977f6430896191b04a21f8901b3b4baf2e4604329f4db5402", size = 397469, upload-time = "2026-06-18T16:13:18.287Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/be/6d5952df75a7f24f35833af764c3a6860780364cb3a0030beb8099e1b2b4/msgpack-1.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1233ee2dd0cefba127583de50ea654677277047d238303521db35def3d7b2e7c", size = 372802, upload-time = "2026-06-18T16:13:19.685Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/39/e2ef7dbf0473bcb8dc7c50bf782a892d67414877b63e47fc88eb189ef5e6/msgpack-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e3dc2feb0876209d9c38aa56cb1de169bd6c4348f1aa48271f241226590993e6", size = 411273, upload-time = "2026-06-18T16:13:21.028Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ef/c5/133f4512a56e983a93445c836c9d94d88f3bc2e0980ff4b9e577bd8416ce/msgpack-1.2.1-cp313-cp313-win32.whl", hash = "sha256:6d09badf350af2be9d189184e04e64cf54ad93569ab3d96fca58bd3e84aad707", size = 64471, upload-time = "2026-06-18T16:13:22.293Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/98/577e10b055096a7dd40732358cabaf7180a20c79ed1dcdbb618e4b9deac7/msgpack-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:33f14fba63278b714efe6ad07e50ea5f03d91537aa6a1c5f1ceca4cf44013ca9", size = 71274, upload-time = "2026-06-18T16:13:23.455Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/ee/0c0048e7cfbef23c6a94791b8959ab28155232e7956de8a305b5ff588f05/msgpack-1.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc5febcd4c99effbc02b528e49d6fd0760b2b7d48c05239e345a5fa6e743d9a", size = 64795, upload-time = "2026-06-18T16:13:24.687Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ac/dcddcab6f6c20ecb387ca5e980371cdb3f87ff69aeca388be97eebc4c074/msgpack-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a70e3cf2804a300d921bb0940426e35f4e489a23adfb77a808892241db0a064", size = 83151 }, + { url = "https://files.pythonhosted.org/packages/64/71/fbcfa83a1d6a9c6091942d1cfd070962244664b87427a9a49a6897b1b219/msgpack-1.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:491cc39455ca765fad51fb451bf2915eb2cf41192ab5801ce8d67c1d614fe056", size = 82351 }, + { url = "https://files.pythonhosted.org/packages/e3/10/ddf7b06db879e8792d13934ddda09ff20bd2a583fd84c9b59aae9b0e650b/msgpack-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f310233ef7fb9c14e201c93639fe5f5260b005f56f0b29048e999c30935596cc", size = 407518 }, + { url = "https://files.pythonhosted.org/packages/79/d3/36a46a8ed992b781acbc05928bd5bee3c810cb0c3563bf81a7b0c04a1a76/msgpack-1.2.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787c9bebb5833e8f6fc8abca3c0597683d8d87f56a8842b6b89c75a5f3176e2d", size = 416405 }, + { url = "https://files.pythonhosted.org/packages/f9/84/e8e9598b557c0ba6ddae901a73780a4c75ac667dddf59414b1e56a42fb34/msgpack-1.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc871b997a9370d855b7394465f2f350e847a5b806dd38dcc9c989e7d87da155", size = 376257 }, + { url = "https://files.pythonhosted.org/packages/40/16/738fe6d875ad7e2a9429c165322a4ec088f4f273cdfae63d96a89c467961/msgpack-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85f57e960d877f2977f6430896191b04a21f8901b3b4baf2e4604329f4db5402", size = 397469 }, + { url = "https://files.pythonhosted.org/packages/ca/be/6d5952df75a7f24f35833af764c3a6860780364cb3a0030beb8099e1b2b4/msgpack-1.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1233ee2dd0cefba127583de50ea654677277047d238303521db35def3d7b2e7c", size = 372802 }, + { url = "https://files.pythonhosted.org/packages/e1/39/e2ef7dbf0473bcb8dc7c50bf782a892d67414877b63e47fc88eb189ef5e6/msgpack-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e3dc2feb0876209d9c38aa56cb1de169bd6c4348f1aa48271f241226590993e6", size = 411273 }, + { url = "https://files.pythonhosted.org/packages/ef/c5/133f4512a56e983a93445c836c9d94d88f3bc2e0980ff4b9e577bd8416ce/msgpack-1.2.1-cp313-cp313-win32.whl", hash = "sha256:6d09badf350af2be9d189184e04e64cf54ad93569ab3d96fca58bd3e84aad707", size = 64471 }, + { url = "https://files.pythonhosted.org/packages/e2/98/577e10b055096a7dd40732358cabaf7180a20c79ed1dcdbb618e4b9deac7/msgpack-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:33f14fba63278b714efe6ad07e50ea5f03d91537aa6a1c5f1ceca4cf44013ca9", size = 71274 }, + { url = "https://files.pythonhosted.org/packages/ba/ee/0c0048e7cfbef23c6a94791b8959ab28155232e7956de8a305b5ff588f05/msgpack-1.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc5febcd4c99effbc02b528e49d6fd0760b2b7d48c05239e345a5fa6e743d9a", size = 64795 }, ] [[package]] name = "multidict" version = "6.7.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174 }, + { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116 }, + { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524 }, + { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368 }, + { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952 }, + { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317 }, + { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132 }, + { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140 }, + { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277 }, + { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291 }, + { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156 }, + { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742 }, + { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221 }, + { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664 }, + { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490 }, + { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695 }, + { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884 }, + { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122 }, + { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175 }, + { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460 }, + { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930 }, + { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582 }, + { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031 }, + { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596 }, + { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492 }, + { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899 }, + { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970 }, + { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060 }, + { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888 }, + { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554 }, + { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341 }, + { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391 }, + { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422 }, + { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770 }, + { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109 }, + { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573 }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319 }, ] [[package]] name = "mypy" version = "2.3.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ast-serialize" }, { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, @@ -3036,16 +2739,16 @@ dependencies = [ { name = "pathspec" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/af/4e516a05d3ca2eb9283e9ec45b2c02225c1514dd6da49fd3c9eaa6639370/mypy-2.3.0.tar.gz", hash = "sha256:465965d41cd9a2726694e983e8ce7113259327bec798115d1e1dfa2a52fb666e", size = 3988104, upload-time = "2026-07-13T11:34:53.387Z" } +sdist = { url = "https://files.pythonhosted.org/packages/12/af/4e516a05d3ca2eb9283e9ec45b2c02225c1514dd6da49fd3c9eaa6639370/mypy-2.3.0.tar.gz", hash = "sha256:465965d41cd9a2726694e983e8ce7113259327bec798115d1e1dfa2a52fb666e", size = 3988104 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6e/ae/f7d056eb0294586a572d0d0d89580ec633c064db520f11d37d5a2fb833bd/mypy-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:91ad22a52ae2c7e621c2f67c94d5a17f66b3209a4cff5cf8a573579835c69e97", size = 14947298, upload-time = "2026-07-13T11:27:47.734Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/32/d5/db3e7af01e7844d21662c6ddc1f7825ec7cb4053f0391ac02faf3638396f/mypy-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:99ac767cc5d3b64c8d0ae226ead10c96694f94e4e7da1668642225dcd4e75aac", size = 13950768, upload-time = "2026-07-13T11:27:57.726Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/fb/43c031f0190513d1ec248ed037eceb742ddd2a4d74bbf406658a28173837/mypy-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de6d2c484742a4d7b0ed6d07b143375624d3b899c5749c7b3c947f56261f48a6", size = 14151586, upload-time = "2026-07-13T11:29:18.615Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/c3/f8b2ffc60883084da91be51af58e88a7ffd4ff9795acb7d902ff88d31eb1/mypy-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7da939dd335cfd2ad788bdfd081c9f4e47634ab995e5a45eb15fd1e5bc052f8b", size = 15227411, upload-time = "2026-07-13T11:30:29.904Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/2e/16b917fc7adcf03f1aadddfc93aab804ffb234b1ab09c0ffd6d92a5d34a2/mypy-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7247eb2824f996722a949530183394921ca71deb9680052a338cf53cff7925c2", size = 15478790, upload-time = "2026-07-13T11:33:14.686Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/88/aaa65a93c73d0cdae7e42f8adb302bf6885bb281302084f99d0290a35347/mypy-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:75b0984bb3cbd76bb5c9291a8671f7ae66ca3b51c7584c358fc2e923259f0757", size = 11234919, upload-time = "2026-07-13T11:33:39.28Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/35/19/b40de63f1a80e63bc2d40f0679a6a8dbd34e95176c8122119bdf406aa552/mypy-2.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:d78fcf900b59cb7e82cb7e3a235e31b462d9333d92285bd1e4952d355b8ffba1", size = 10201510, upload-time = "2026-07-13T11:31:52.619Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/fa/fdc54fe583ba3cafbcedfb70eeeaf03849f75b1827a07096c7bd996f582d/mypy-2.3.0-py3-none-any.whl", hash = "sha256:6b1cdb579446b60432432b2b2403a6201b4b475a004d7f488511c9ba177c9e88", size = 2753292, upload-time = "2026-07-13T11:33:18.48Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ae/f7d056eb0294586a572d0d0d89580ec633c064db520f11d37d5a2fb833bd/mypy-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:91ad22a52ae2c7e621c2f67c94d5a17f66b3209a4cff5cf8a573579835c69e97", size = 14947298 }, + { url = "https://files.pythonhosted.org/packages/32/d5/db3e7af01e7844d21662c6ddc1f7825ec7cb4053f0391ac02faf3638396f/mypy-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:99ac767cc5d3b64c8d0ae226ead10c96694f94e4e7da1668642225dcd4e75aac", size = 13950768 }, + { url = "https://files.pythonhosted.org/packages/d9/fb/43c031f0190513d1ec248ed037eceb742ddd2a4d74bbf406658a28173837/mypy-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de6d2c484742a4d7b0ed6d07b143375624d3b899c5749c7b3c947f56261f48a6", size = 14151586 }, + { url = "https://files.pythonhosted.org/packages/ec/c3/f8b2ffc60883084da91be51af58e88a7ffd4ff9795acb7d902ff88d31eb1/mypy-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7da939dd335cfd2ad788bdfd081c9f4e47634ab995e5a45eb15fd1e5bc052f8b", size = 15227411 }, + { url = "https://files.pythonhosted.org/packages/83/2e/16b917fc7adcf03f1aadddfc93aab804ffb234b1ab09c0ffd6d92a5d34a2/mypy-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7247eb2824f996722a949530183394921ca71deb9680052a338cf53cff7925c2", size = 15478790 }, + { url = "https://files.pythonhosted.org/packages/c0/88/aaa65a93c73d0cdae7e42f8adb302bf6885bb281302084f99d0290a35347/mypy-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:75b0984bb3cbd76bb5c9291a8671f7ae66ca3b51c7584c358fc2e923259f0757", size = 11234919 }, + { url = "https://files.pythonhosted.org/packages/35/19/b40de63f1a80e63bc2d40f0679a6a8dbd34e95176c8122119bdf406aa552/mypy-2.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:d78fcf900b59cb7e82cb7e3a235e31b462d9333d92285bd1e4952d355b8ffba1", size = 10201510 }, + { url = "https://files.pythonhosted.org/packages/2c/fa/fdc54fe583ba3cafbcedfb70eeeaf03849f75b1827a07096c7bd996f582d/mypy-2.3.0-py3-none-any.whl", hash = "sha256:6b1cdb579446b60432432b2b2403a6201b4b475a004d7f488511c9ba177c9e88", size = 2753292 }, ] [package.optional-dependencies] @@ -3056,31 +2759,31 @@ faster-cache = [ [[package]] name = "mypy-extensions" version = "1.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 }, ] [[package]] name = "nab-index" version = "0.0.11" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "truststore" }, { name = "typing-extensions" }, { name = "urllib3" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/26/df8082b11169a8aa0169f67a00085c978f05d5f1a9f0e9895d13085e0220/nab_index-0.0.11.tar.gz", hash = "sha256:cdf3d3868c840896bba56bfc180c5ff5e6f6801ab9697def799208e37b4cf23e", size = 35229, upload-time = "2026-07-19T21:22:15.143Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/26/df8082b11169a8aa0169f67a00085c978f05d5f1a9f0e9895d13085e0220/nab_index-0.0.11.tar.gz", hash = "sha256:cdf3d3868c840896bba56bfc180c5ff5e6f6801ab9697def799208e37b4cf23e", size = 35229 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/00/0816a27374957bc87468e77b9c5f224a8e6d546939d8d672589f7240785e/nab_index-0.0.11-py3-none-any.whl", hash = "sha256:34c7f73f02a714aa3774767ebbf278e4560d50863fc81252f1aab148bd3061fd", size = 41617, upload-time = "2026-07-19T21:22:14.136Z" }, + { url = "https://files.pythonhosted.org/packages/fe/00/0816a27374957bc87468e77b9c5f224a8e6d546939d8d672589f7240785e/nab_index-0.0.11-py3-none-any.whl", hash = "sha256:34c7f73f02a714aa3774767ebbf278e4560d50863fc81252f1aab148bd3061fd", size = 41617 }, ] [[package]] name = "nab-python" version = "0.0.11" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "build" }, { name = "installer" }, @@ -3091,73 +2794,73 @@ dependencies = [ { name = "tomli-w" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bf/74/6cc630e82b80e255db1d293b1f053ba25d4985d4d8332ca2efb9fac02f78/nab_python-0.0.11.tar.gz", hash = "sha256:c034a432228150afe99c7280d64d4ef738f6182b9079532bc04a2fce94daa2f2", size = 663230, upload-time = "2026-07-19T21:22:23.351Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/74/6cc630e82b80e255db1d293b1f053ba25d4985d4d8332ca2efb9fac02f78/nab_python-0.0.11.tar.gz", hash = "sha256:c034a432228150afe99c7280d64d4ef738f6182b9079532bc04a2fce94daa2f2", size = 663230 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/3f/79932bac990c85a1cf85fa34db9b2a0b98e9bc467203ad233f982ebeeb76/nab_python-0.0.11-py3-none-any.whl", hash = "sha256:92caea881a68862e941533f516f2cae2347c5f3f911ac4cb6fe73ab16dc4f352", size = 350925, upload-time = "2026-07-19T21:22:21.786Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3f/79932bac990c85a1cf85fa34db9b2a0b98e9bc467203ad233f982ebeeb76/nab_python-0.0.11-py3-none-any.whl", hash = "sha256:92caea881a68862e941533f516f2cae2347c5f3f911ac4cb6fe73ab16dc4f352", size = 350925 }, ] [[package]] name = "nab-resolver" version = "0.0.11" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/25/e4/1c802661870ea6e677b3f48f5751970d5ec4218fe867fe09c9563b13e275/nab_resolver-0.0.11.tar.gz", hash = "sha256:9b32dc5b9936964d00c95e5b5e01ce85a9533b2aa95bd4ed96dd793bac61759c", size = 95136, upload-time = "2026-07-19T21:22:07.389Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/e4/1c802661870ea6e677b3f48f5751970d5ec4218fe867fe09c9563b13e275/nab_resolver-0.0.11.tar.gz", hash = "sha256:9b32dc5b9936964d00c95e5b5e01ce85a9533b2aa95bd4ed96dd793bac61759c", size = 95136 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/17/cb/e49eed4c8b31daa70b2bb7ab98a56738611fc2e7a82031513144a4eebe5a/nab_resolver-0.0.11-py3-none-any.whl", hash = "sha256:557862e8414658516ae3b3ae4f660dd40dbe13b9c5a16becaed49916bcdc339d", size = 34627, upload-time = "2026-07-19T21:22:06.183Z" }, + { url = "https://files.pythonhosted.org/packages/17/cb/e49eed4c8b31daa70b2bb7ab98a56738611fc2e7a82031513144a4eebe5a/nab_resolver-0.0.11-py3-none-any.whl", hash = "sha256:557862e8414658516ae3b3ae4f660dd40dbe13b9c5a16becaed49916bcdc339d", size = 34627 }, ] [[package]] name = "natsort" version = "8.4.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/a9/a0c57aee75f77794adaf35322f8b6404cbd0f89ad45c87197a937764b7d0/natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/a9/a0c57aee75f77794adaf35322f8b6404cbd0f89ad45c87197a937764b7d0/natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581", size = 76575 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ef/82/7a9d0550484a62c6da82858ee9419f3dd1ccc9aa1c26a1e43da3ecd20b0d/natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c" }, + { url = "https://files.pythonhosted.org/packages/ef/82/7a9d0550484a62c6da82858ee9419f3dd1ccc9aa1c26a1e43da3ecd20b0d/natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c", size = 38268 }, ] [[package]] name = "nest-asyncio" version = "1.6.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, ] [[package]] name = "numpy" version = "2.5.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/07/ec2a3f0c91761581d4b7104a740791800025983f9a4dc4e73f91a99aeac4/numpy-2.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bfebd8695f9863592fe744be833a258120b14a9f39da255e8aa8fade2c0ddd1", size = 16796419, upload-time = "2026-07-04T17:06:40.37Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ab/ab/ddb499fc4f8780354395face5b65c7fd107bcd6e1d667a5f07d046956f6f/numpy-2.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30b44a6b53a7ae63c54c089a8726e5563ed302716c5b7ccc85afade40b0e7ff6", size = 11765832, upload-time = "2026-07-04T17:06:42.768Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/b3/3c28c558a09fc72100c646dac6d2fce8e834c471b0edca01a29996706117/numpy-2.5.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6165343f81b56ef8f514f396989e529b61d9dc709b99421b07e9f3e698e2287d", size = 5325143, upload-time = "2026-07-04T17:06:45.466Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5e/0e/ce19b985bb15c596f4f05954e76cccc77c845083b3b8f938a6c68e523128/numpy-2.5.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4939237038ada79308dda3204ac6462df056b5672b2e25db1149cf873668b3e1", size = 6659749, upload-time = "2026-07-04T17:06:47.288Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", size = 15164716, upload-time = "2026-07-04T17:06:49.494Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/a7/2bcd3fdbb87804755c35b729bf8709d62025c5f4cfd7d5b2415997097515/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", size = 16661440, upload-time = "2026-07-04T17:06:52.061Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/d7/a41e3310c886fe457d36e670bbf24fae411aca8a7b6ad92a32afd924077c/numpy-2.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3935f3b419b244a02732676fa5317a9193cc596a4c0646db07e5b421229ac9f7", size = 16526305, upload-time = "2026-07-04T17:06:54.605Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/75/4333a9a707c1edd3a4e1a0c58eca52c0f31e55089fa80db02b5565b24df7/numpy-2.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc932a65ded7ce9013d120845a2514dcccb1a67bfc8deb8d37633762951904a6", size = 18423008, upload-time = "2026-07-04T17:06:57.54Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/90/e314a32b1c11a2ffe818ddad3a57b50b4b6e1b6c487192eb50cdef0415d0/numpy-2.5.1-cp313-cp313-win32.whl", hash = "sha256:4b4ff1608417eb7a59da7b967bbb798cacfe071d2caf526a24281cd562072ed9", size = 6063885, upload-time = "2026-07-04T17:07:00.14Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/70/800b3fca480af32df9e8ea9f3d4a0c8feb4b32d7f195d174eabbda4829ad/numpy-2.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:6c3fe51bc6a16453d452997053454f309e8e0ed7b42d6b361ce4ac8c32913d74", size = 12425674, upload-time = "2026-07-04T17:07:02.387Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/0b/196350c122f50f6ca56846f2d71efd5e0d24b7b2e07355e019b2e2c7a11e/numpy-2.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f7feb014281029e628ba2d5a007407443b06e418b6fe451d1e2adcbc8eba0107", size = 10350256, upload-time = "2026-07-04T17:07:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/eb/07/ec2a3f0c91761581d4b7104a740791800025983f9a4dc4e73f91a99aeac4/numpy-2.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bfebd8695f9863592fe744be833a258120b14a9f39da255e8aa8fade2c0ddd1", size = 16796419 }, + { url = "https://files.pythonhosted.org/packages/ab/ab/ddb499fc4f8780354395face5b65c7fd107bcd6e1d667a5f07d046956f6f/numpy-2.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30b44a6b53a7ae63c54c089a8726e5563ed302716c5b7ccc85afade40b0e7ff6", size = 11765832 }, + { url = "https://files.pythonhosted.org/packages/88/b3/3c28c558a09fc72100c646dac6d2fce8e834c471b0edca01a29996706117/numpy-2.5.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6165343f81b56ef8f514f396989e529b61d9dc709b99421b07e9f3e698e2287d", size = 5325143 }, + { url = "https://files.pythonhosted.org/packages/5e/0e/ce19b985bb15c596f4f05954e76cccc77c845083b3b8f938a6c68e523128/numpy-2.5.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4939237038ada79308dda3204ac6462df056b5672b2e25db1149cf873668b3e1", size = 6659749 }, + { url = "https://files.pythonhosted.org/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", size = 15164716 }, + { url = "https://files.pythonhosted.org/packages/ed/a7/2bcd3fdbb87804755c35b729bf8709d62025c5f4cfd7d5b2415997097515/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", size = 16661440 }, + { url = "https://files.pythonhosted.org/packages/fc/d7/a41e3310c886fe457d36e670bbf24fae411aca8a7b6ad92a32afd924077c/numpy-2.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3935f3b419b244a02732676fa5317a9193cc596a4c0646db07e5b421229ac9f7", size = 16526305 }, + { url = "https://files.pythonhosted.org/packages/53/75/4333a9a707c1edd3a4e1a0c58eca52c0f31e55089fa80db02b5565b24df7/numpy-2.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc932a65ded7ce9013d120845a2514dcccb1a67bfc8deb8d37633762951904a6", size = 18423008 }, + { url = "https://files.pythonhosted.org/packages/ee/90/e314a32b1c11a2ffe818ddad3a57b50b4b6e1b6c487192eb50cdef0415d0/numpy-2.5.1-cp313-cp313-win32.whl", hash = "sha256:4b4ff1608417eb7a59da7b967bbb798cacfe071d2caf526a24281cd562072ed9", size = 6063885 }, + { url = "https://files.pythonhosted.org/packages/10/70/800b3fca480af32df9e8ea9f3d4a0c8feb4b32d7f195d174eabbda4829ad/numpy-2.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:6c3fe51bc6a16453d452997053454f309e8e0ed7b42d6b361ce4ac8c32913d74", size = 12425674 }, + { url = "https://files.pythonhosted.org/packages/8b/0b/196350c122f50f6ca56846f2d71efd5e0d24b7b2e07355e019b2e2c7a11e/numpy-2.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f7feb014281029e628ba2d5a007407443b06e418b6fe451d1e2adcbc8eba0107", size = 10350256 }, ] [[package]] name = "oauthlib" version = "3.3.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, + { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065 }, ] [[package]] name = "onnxruntime" version = "1.27.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "flatbuffers" }, { name = "numpy" }, @@ -3165,19 +2868,19 @@ dependencies = [ { name = "protobuf" }, ] wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/2b/54208fd03ad410480bc17edf4869376362da8bbf46fe186ddf4cb5cc20fe/onnxruntime-1.27.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:b3e5b58b8c89c2b20e086e890aa9527377e5c240dc3ecc1640d18e07705eeb1c", size = 18432958, upload-time = "2026-06-15T22:42:53.105Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/88/24fc51fcbb126da6d032372314e47b55c3faad58f2aa78c0e199ccd20b9c/onnxruntime-1.27.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48b3d87eb560ff6a772240506f3c78d6d27c63cafedd5c775672e1194f968cfd", size = 16438180, upload-time = "2026-06-15T22:42:43.093Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/19/14929c3c2fe0b79b41cce24463062bf3afa4cdd3c19dccf00319caa92bff/onnxruntime-1.27.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6872443f236a554921cda6f318c900e2d0c226792cf3534d00e5057c6926e5d2", size = 18658445, upload-time = "2026-06-15T22:43:08.053Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/76/59ed932b0244acd7bbbd6449480053a6d958ea66357f022f932872e19287/onnxruntime-1.27.0-cp313-cp313-win_amd64.whl", hash = "sha256:760021bca514d64a811837820d351a08a41741f16f8b4c26450da708fecf14e6", size = 13357856, upload-time = "2026-06-15T22:43:37.315Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/51/d1ec60ec7b1e2ae2d7340ba52b8a13529140039cd4407ba8dddbbc046582/onnxruntime-1.27.0-cp313-cp313-win_arm64.whl", hash = "sha256:2fdfa9df40a0ded0028ce6f9cd863264237f3970559dea2b81456e9ac4622b94", size = 13104412, upload-time = "2026-06-15T22:43:27.457Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5e/7d/e6bb1c6445c94f708c38cd8fbb7bf0264108c33498b9445c93e60fe6d329/onnxruntime-1.27.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:54c0c4e9202c36c4ecdb1f3443f5dfbfd5ee3b54d1362c4b4c6134110e74fb32", size = 16443331, upload-time = "2026-06-15T22:42:45.649Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/1b/b18b31e806eabc41077810199fbbb36fbc2d5f19912416e5ccfbf73053d1/onnxruntime-1.27.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1b215aa662c8f983f7d6dedafe65a9be72c26e5338e0fe98b3e0422c32c85428", size = 18670967, upload-time = "2026-06-15T22:43:10.621Z" }, + { url = "https://files.pythonhosted.org/packages/fb/2b/54208fd03ad410480bc17edf4869376362da8bbf46fe186ddf4cb5cc20fe/onnxruntime-1.27.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:b3e5b58b8c89c2b20e086e890aa9527377e5c240dc3ecc1640d18e07705eeb1c", size = 18432958 }, + { url = "https://files.pythonhosted.org/packages/ce/88/24fc51fcbb126da6d032372314e47b55c3faad58f2aa78c0e199ccd20b9c/onnxruntime-1.27.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48b3d87eb560ff6a772240506f3c78d6d27c63cafedd5c775672e1194f968cfd", size = 16438180 }, + { url = "https://files.pythonhosted.org/packages/cb/19/14929c3c2fe0b79b41cce24463062bf3afa4cdd3c19dccf00319caa92bff/onnxruntime-1.27.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6872443f236a554921cda6f318c900e2d0c226792cf3534d00e5057c6926e5d2", size = 18658445 }, + { url = "https://files.pythonhosted.org/packages/7f/76/59ed932b0244acd7bbbd6449480053a6d958ea66357f022f932872e19287/onnxruntime-1.27.0-cp313-cp313-win_amd64.whl", hash = "sha256:760021bca514d64a811837820d351a08a41741f16f8b4c26450da708fecf14e6", size = 13357856 }, + { url = "https://files.pythonhosted.org/packages/79/51/d1ec60ec7b1e2ae2d7340ba52b8a13529140039cd4407ba8dddbbc046582/onnxruntime-1.27.0-cp313-cp313-win_arm64.whl", hash = "sha256:2fdfa9df40a0ded0028ce6f9cd863264237f3970559dea2b81456e9ac4622b94", size = 13104412 }, + { url = "https://files.pythonhosted.org/packages/5e/7d/e6bb1c6445c94f708c38cd8fbb7bf0264108c33498b9445c93e60fe6d329/onnxruntime-1.27.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:54c0c4e9202c36c4ecdb1f3443f5dfbfd5ee3b54d1362c4b4c6134110e74fb32", size = 16443331 }, + { url = "https://files.pythonhosted.org/packages/72/1b/b18b31e806eabc41077810199fbbb36fbc2d5f19912416e5ccfbf73053d1/onnxruntime-1.27.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1b215aa662c8f983f7d6dedafe65a9be72c26e5338e0fe98b3e0422c32c85428", size = 18670967 }, ] [[package]] name = "openai" version = "2.48.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "distro" }, @@ -3188,27 +2891,27 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/ae/d4d1835488c0350424009dac5095b9a3e173bee12fd2e421ee27e2142c42/openai-2.48.0.tar.gz", hash = "sha256:231b1e7661dda14574986c2f71451e9d584b7fe69e0ee6480e12ed090b48fc16", size = 1093427, upload-time = "2026-07-23T20:15:50.402Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/ae/d4d1835488c0350424009dac5095b9a3e173bee12fd2e421ee27e2142c42/openai-2.48.0.tar.gz", hash = "sha256:231b1e7661dda14574986c2f71451e9d584b7fe69e0ee6480e12ed090b48fc16", size = 1093427 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/2a/dcb891114e303c4379d4a498f10222e33eee540bcef4e1e493bd0af2b242/openai-2.48.0-py3-none-any.whl", hash = "sha256:c98df30aaaf93c51979f64d3e7c5b76464f8be0173368266229eb8fe6bd30f2c", size = 1648520, upload-time = "2026-07-23T20:15:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2a/dcb891114e303c4379d4a498f10222e33eee540bcef4e1e493bd0af2b242/openai-2.48.0-py3-none-any.whl", hash = "sha256:c98df30aaaf93c51979f64d3e7c5b76464f8be0173368266229eb8fe6bd30f2c", size = 1648520 }, ] [[package]] name = "openapi-pydantic" version = "0.5.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", size = 60892, upload-time = "2025-01-08T19:29:27.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", size = 60892 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", size = 96381, upload-time = "2025-01-08T19:29:25.275Z" }, + { url = "https://files.pythonhosted.org/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", size = 96381 }, ] [[package]] name = "openapi-schema-validator" version = "0.9.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonschema" }, { name = "jsonschema-specifications" }, @@ -3217,15 +2920,15 @@ dependencies = [ { name = "referencing" }, { name = "rfc3339-validator" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/e8/ab3f27dbca54ec645f7fab714b640907d5d36c2ebb07e87eebd30bd5c81b/openapi_schema_validator-0.9.0.tar.gz", hash = "sha256:b72db64315b89d21834cd3ffef37e3e6893bc876327be2d366e8424b1029afd3", size = 24686, upload-time = "2026-04-27T17:31:27.606Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/e8/ab3f27dbca54ec645f7fab714b640907d5d36c2ebb07e87eebd30bd5c81b/openapi_schema_validator-0.9.0.tar.gz", hash = "sha256:b72db64315b89d21834cd3ffef37e3e6893bc876327be2d366e8424b1029afd3", size = 24686 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/c0/5467967d95378b2cfce312e09cbd0c9ab64354a0922379b734f793edd04f/openapi_schema_validator-0.9.0-py3-none-any.whl", hash = "sha256:faa3bbe7c3aa8ca2087ad83f709dc3b7d920283153a570c03e24ea182558aa25", size = 19980, upload-time = "2026-04-27T17:31:25.965Z" }, + { url = "https://files.pythonhosted.org/packages/90/c0/5467967d95378b2cfce312e09cbd0c9ab64354a0922379b734f793edd04f/openapi_schema_validator-0.9.0-py3-none-any.whl", hash = "sha256:faa3bbe7c3aa8ca2087ad83f709dc3b7d920283153a570c03e24ea182558aa25", size = 19980 }, ] [[package]] name = "openapi-spec-validator" version = "0.9.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonschema" }, { name = "jsonschema-path" }, @@ -3234,40 +2937,40 @@ dependencies = [ { name = "pydantic" }, { name = "pydantic-settings" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/d2/640b5149cd5688bc0ad1fdbb4df6a2f7b84a093c8d787c27d566132f8b8b/openapi_spec_validator-0.9.0.tar.gz", hash = "sha256:6d648cff6490ebb799dcfe273792f2941c050158854c721f086599d845da78b8", size = 1756839, upload-time = "2026-05-20T09:23:18.871Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/d2/640b5149cd5688bc0ad1fdbb4df6a2f7b84a093c8d787c27d566132f8b8b/openapi_spec_validator-0.9.0.tar.gz", hash = "sha256:6d648cff6490ebb799dcfe273792f2941c050158854c721f086599d845da78b8", size = 1756839 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/d8/321ff889330acca2e3097f3d4f80a40bcc41b6d34d302978ab32c449520b/openapi_spec_validator-0.9.0-py3-none-any.whl", hash = "sha256:222fecffc7714f6d0a6ad62c0e4b66cc2b7dbfafb7b93acfc6c308abbdb51af8", size = 50328, upload-time = "2026-05-20T09:23:17.017Z" }, + { url = "https://files.pythonhosted.org/packages/95/d8/321ff889330acca2e3097f3d4f80a40bcc41b6d34d302978ab32c449520b/openapi_spec_validator-0.9.0-py3-none-any.whl", hash = "sha256:222fecffc7714f6d0a6ad62c0e4b66cc2b7dbfafb7b93acfc6c308abbdb51af8", size = 50328 }, ] [[package]] name = "opentelemetry-api" version = "1.39.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-metadata" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/97/b9/3161be15bb8e3ad01be8be5a968a9237c3027c5be504362ff800fca3e442/opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c", size = 65767, upload-time = "2025-12-11T13:32:39.182Z" } +sdist = { url = "https://files.pythonhosted.org/packages/97/b9/3161be15bb8e3ad01be8be5a968a9237c3027c5be504362ff800fca3e442/opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c", size = 65767 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cf/df/d3f1ddf4bb4cb50ed9b1139cc7b1c54c34a1e7ce8fd1b9a37c0d1551a6bd/opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950", size = 66356, upload-time = "2025-12-11T13:32:17.304Z" }, + { url = "https://files.pythonhosted.org/packages/cf/df/d3f1ddf4bb4cb50ed9b1139cc7b1c54c34a1e7ce8fd1b9a37c0d1551a6bd/opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950", size = 66356 }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-common" version = "1.39.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-proto" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/9d/22d241b66f7bbde88a3bfa6847a351d2c46b84de23e71222c6aae25c7050/opentelemetry_exporter_otlp_proto_common-1.39.1.tar.gz", hash = "sha256:763370d4737a59741c89a67b50f9e39271639ee4afc999dadfe768541c027464", size = 20409, upload-time = "2025-12-11T13:32:40.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/9d/22d241b66f7bbde88a3bfa6847a351d2c46b84de23e71222c6aae25c7050/opentelemetry_exporter_otlp_proto_common-1.39.1.tar.gz", hash = "sha256:763370d4737a59741c89a67b50f9e39271639ee4afc999dadfe768541c027464", size = 20409 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/02/ffc3e143d89a27ac21fd557365b98bd0653b98de8a101151d5805b5d4c33/opentelemetry_exporter_otlp_proto_common-1.39.1-py3-none-any.whl", hash = "sha256:08f8a5862d64cc3435105686d0216c1365dc5701f86844a8cd56597d0c764fde", size = 18366, upload-time = "2025-12-11T13:32:20.2Z" }, + { url = "https://files.pythonhosted.org/packages/8c/02/ffc3e143d89a27ac21fd557365b98bd0653b98de8a101151d5805b5d4c33/opentelemetry_exporter_otlp_proto_common-1.39.1-py3-none-any.whl", hash = "sha256:08f8a5862d64cc3435105686d0216c1365dc5701f86844a8cd56597d0c764fde", size = 18366 }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-http" version = "1.39.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos" }, { name = "opentelemetry-api" }, @@ -3277,30 +2980,30 @@ dependencies = [ { name = "requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/80/04/2a08fa9c0214ae38880df01e8bfae12b067ec0793446578575e5080d6545/opentelemetry_exporter_otlp_proto_http-1.39.1.tar.gz", hash = "sha256:31bdab9745c709ce90a49a0624c2bd445d31a28ba34275951a6a362d16a0b9cb", size = 17288, upload-time = "2025-12-11T13:32:42.029Z" } +sdist = { url = "https://files.pythonhosted.org/packages/80/04/2a08fa9c0214ae38880df01e8bfae12b067ec0793446578575e5080d6545/opentelemetry_exporter_otlp_proto_http-1.39.1.tar.gz", hash = "sha256:31bdab9745c709ce90a49a0624c2bd445d31a28ba34275951a6a362d16a0b9cb", size = 17288 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/f1/b27d3e2e003cd9a3592c43d099d2ed8d0a947c15281bf8463a256db0b46c/opentelemetry_exporter_otlp_proto_http-1.39.1-py3-none-any.whl", hash = "sha256:d9f5207183dd752a412c4cd564ca8875ececba13be6e9c6c370ffb752fd59985", size = 19641, upload-time = "2025-12-11T13:32:22.248Z" }, + { url = "https://files.pythonhosted.org/packages/95/f1/b27d3e2e003cd9a3592c43d099d2ed8d0a947c15281bf8463a256db0b46c/opentelemetry_exporter_otlp_proto_http-1.39.1-py3-none-any.whl", hash = "sha256:d9f5207183dd752a412c4cd564ca8875ececba13be6e9c6c370ffb752fd59985", size = 19641 }, ] [[package]] name = "opentelemetry-instrumentation" version = "0.60b1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-semantic-conventions" }, { name = "packaging" }, { name = "wrapt" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/41/0f/7e6b713ac117c1f5e4e3300748af699b9902a2e5e34c9cf443dde25a01fa/opentelemetry_instrumentation-0.60b1.tar.gz", hash = "sha256:57ddc7974c6eb35865af0426d1a17132b88b2ed8586897fee187fd5b8944bd6a", size = 31706, upload-time = "2025-12-11T13:36:42.515Z" } +sdist = { url = "https://files.pythonhosted.org/packages/41/0f/7e6b713ac117c1f5e4e3300748af699b9902a2e5e34c9cf443dde25a01fa/opentelemetry_instrumentation-0.60b1.tar.gz", hash = "sha256:57ddc7974c6eb35865af0426d1a17132b88b2ed8586897fee187fd5b8944bd6a", size = 31706 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/d2/6788e83c5c86a2690101681aeef27eeb2a6bf22df52d3f263a22cee20915/opentelemetry_instrumentation-0.60b1-py3-none-any.whl", hash = "sha256:04480db952b48fb1ed0073f822f0ee26012b7be7c3eac1a3793122737c78632d", size = 33096, upload-time = "2025-12-11T13:35:33.067Z" }, + { url = "https://files.pythonhosted.org/packages/77/d2/6788e83c5c86a2690101681aeef27eeb2a6bf22df52d3f263a22cee20915/opentelemetry_instrumentation-0.60b1-py3-none-any.whl", hash = "sha256:04480db952b48fb1ed0073f822f0ee26012b7be7c3eac1a3793122737c78632d", size = 33096 }, ] [[package]] name = "opentelemetry-instrumentation-asgi" version = "0.60b1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref" }, { name = "opentelemetry-api" }, @@ -3308,15 +3011,15 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/db/851fa88db7441da82d50bd80f2de5ee55213782e25dc858e04d0c9961d60/opentelemetry_instrumentation_asgi-0.60b1.tar.gz", hash = "sha256:16bfbe595cd24cda309a957456d0fc2523f41bc7b076d1f2d7e98a1ad9876d6f", size = 26107, upload-time = "2025-12-11T13:36:47.015Z" } +sdist = { url = "https://files.pythonhosted.org/packages/77/db/851fa88db7441da82d50bd80f2de5ee55213782e25dc858e04d0c9961d60/opentelemetry_instrumentation_asgi-0.60b1.tar.gz", hash = "sha256:16bfbe595cd24cda309a957456d0fc2523f41bc7b076d1f2d7e98a1ad9876d6f", size = 26107 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/76/1fb94367cef64420d2171157a6b9509582873bd09a6afe08a78a8d1f59d9/opentelemetry_instrumentation_asgi-0.60b1-py3-none-any.whl", hash = "sha256:d48def2dbed10294c99cfcf41ebbd0c414d390a11773a41f472d20000fcddc25", size = 16933, upload-time = "2025-12-11T13:35:40.462Z" }, + { url = "https://files.pythonhosted.org/packages/76/76/1fb94367cef64420d2171157a6b9509582873bd09a6afe08a78a8d1f59d9/opentelemetry_instrumentation_asgi-0.60b1-py3-none-any.whl", hash = "sha256:d48def2dbed10294c99cfcf41ebbd0c414d390a11773a41f472d20000fcddc25", size = 16933 }, ] [[package]] name = "opentelemetry-instrumentation-fastapi" version = "0.60b1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-instrumentation" }, @@ -3324,15 +3027,15 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9c/e7/e7e5e50218cf488377209d85666b182fa2d4928bf52389411ceeee1b2b60/opentelemetry_instrumentation_fastapi-0.60b1.tar.gz", hash = "sha256:de608955f7ff8eecf35d056578346a5365015fd7d8623df9b1f08d1c74769c01", size = 24958, upload-time = "2025-12-11T13:36:59.35Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/e7/e7e5e50218cf488377209d85666b182fa2d4928bf52389411ceeee1b2b60/opentelemetry_instrumentation_fastapi-0.60b1.tar.gz", hash = "sha256:de608955f7ff8eecf35d056578346a5365015fd7d8623df9b1f08d1c74769c01", size = 24958 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/cc/6e808328ba54662e50babdcab21138eae4250bc0fddf67d55526a615a2ca/opentelemetry_instrumentation_fastapi-0.60b1-py3-none-any.whl", hash = "sha256:af94b7a239ad1085fc3a820ecf069f67f579d7faf4c085aaa7bd9b64eafc8eaf", size = 13478, upload-time = "2025-12-11T13:36:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/7d/cc/6e808328ba54662e50babdcab21138eae4250bc0fddf67d55526a615a2ca/opentelemetry_instrumentation_fastapi-0.60b1-py3-none-any.whl", hash = "sha256:af94b7a239ad1085fc3a820ecf069f67f579d7faf4c085aaa7bd9b64eafc8eaf", size = 13478 }, ] [[package]] name = "opentelemetry-instrumentation-httpx" version = "0.60b1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-instrumentation" }, @@ -3340,269 +3043,269 @@ dependencies = [ { name = "opentelemetry-util-http" }, { name = "wrapt" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/08/11208bcfcab4fc2023252c3f322aa397fd9ad948355fea60f5fc98648603/opentelemetry_instrumentation_httpx-0.60b1.tar.gz", hash = "sha256:a506ebaf28c60112cbe70ad4f0338f8603f148938cb7b6794ce1051cd2b270ae", size = 20611, upload-time = "2025-12-11T13:37:01.661Z" } +sdist = { url = "https://files.pythonhosted.org/packages/86/08/11208bcfcab4fc2023252c3f322aa397fd9ad948355fea60f5fc98648603/opentelemetry_instrumentation_httpx-0.60b1.tar.gz", hash = "sha256:a506ebaf28c60112cbe70ad4f0338f8603f148938cb7b6794ce1051cd2b270ae", size = 20611 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/59/b98e84eebf745ffc75397eaad4763795bff8a30cbf2373a50ed4e70646c5/opentelemetry_instrumentation_httpx-0.60b1-py3-none-any.whl", hash = "sha256:f37636dd742ad2af83d896ba69601ed28da51fa4e25d1ab62fde89ce413e275b", size = 15701, upload-time = "2025-12-11T13:36:04.56Z" }, + { url = "https://files.pythonhosted.org/packages/43/59/b98e84eebf745ffc75397eaad4763795bff8a30cbf2373a50ed4e70646c5/opentelemetry_instrumentation_httpx-0.60b1-py3-none-any.whl", hash = "sha256:f37636dd742ad2af83d896ba69601ed28da51fa4e25d1ab62fde89ce413e275b", size = 15701 }, ] [[package]] name = "opentelemetry-proto" version = "1.39.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/1d/f25d76d8260c156c40c97c9ed4511ec0f9ce353f8108ca6e7561f82a06b2/opentelemetry_proto-1.39.1.tar.gz", hash = "sha256:6c8e05144fc0d3ed4d22c2289c6b126e03bcd0e6a7da0f16cedd2e1c2772e2c8", size = 46152, upload-time = "2025-12-11T13:32:48.681Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/1d/f25d76d8260c156c40c97c9ed4511ec0f9ce353f8108ca6e7561f82a06b2/opentelemetry_proto-1.39.1.tar.gz", hash = "sha256:6c8e05144fc0d3ed4d22c2289c6b126e03bcd0e6a7da0f16cedd2e1c2772e2c8", size = 46152 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/95/b40c96a7b5203005a0b03d8ce8cd212ff23f1793d5ba289c87a097571b18/opentelemetry_proto-1.39.1-py3-none-any.whl", hash = "sha256:22cdc78efd3b3765d09e68bfbd010d4fc254c9818afd0b6b423387d9dee46007", size = 72535, upload-time = "2025-12-11T13:32:33.866Z" }, + { url = "https://files.pythonhosted.org/packages/51/95/b40c96a7b5203005a0b03d8ce8cd212ff23f1793d5ba289c87a097571b18/opentelemetry_proto-1.39.1-py3-none-any.whl", hash = "sha256:22cdc78efd3b3765d09e68bfbd010d4fc254c9818afd0b6b423387d9dee46007", size = 72535 }, ] [[package]] name = "opentelemetry-sdk" version = "1.39.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-semantic-conventions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/fb/c76080c9ba07e1e8235d24cdcc4d125ef7aa3edf23eb4e497c2e50889adc/opentelemetry_sdk-1.39.1.tar.gz", hash = "sha256:cf4d4563caf7bff906c9f7967e2be22d0d6b349b908be0d90fb21c8e9c995cc6", size = 171460, upload-time = "2025-12-11T13:32:49.369Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/fb/c76080c9ba07e1e8235d24cdcc4d125ef7aa3edf23eb4e497c2e50889adc/opentelemetry_sdk-1.39.1.tar.gz", hash = "sha256:cf4d4563caf7bff906c9f7967e2be22d0d6b349b908be0d90fb21c8e9c995cc6", size = 171460 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/98/e91cf858f203d86f4eccdf763dcf01cf03f1dae80c3750f7e635bfa206b6/opentelemetry_sdk-1.39.1-py3-none-any.whl", hash = "sha256:4d5482c478513ecb0a5d938dcc61394e647066e0cc2676bee9f3af3f3f45f01c", size = 132565, upload-time = "2025-12-11T13:32:35.069Z" }, + { url = "https://files.pythonhosted.org/packages/7c/98/e91cf858f203d86f4eccdf763dcf01cf03f1dae80c3750f7e635bfa206b6/opentelemetry_sdk-1.39.1-py3-none-any.whl", hash = "sha256:4d5482c478513ecb0a5d938dcc61394e647066e0cc2676bee9f3af3f3f45f01c", size = 132565 }, ] [[package]] name = "opentelemetry-semantic-conventions" version = "0.60b1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/df/553f93ed38bf22f4b999d9be9c185adb558982214f33eae539d3b5cd0858/opentelemetry_semantic_conventions-0.60b1.tar.gz", hash = "sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953", size = 137935, upload-time = "2025-12-11T13:32:50.487Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/df/553f93ed38bf22f4b999d9be9c185adb558982214f33eae539d3b5cd0858/opentelemetry_semantic_conventions-0.60b1.tar.gz", hash = "sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953", size = 137935 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/5e/5958555e09635d09b75de3c4f8b9cae7335ca545d77392ffe7331534c402/opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl", hash = "sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb", size = 219982, upload-time = "2025-12-11T13:32:36.955Z" }, + { url = "https://files.pythonhosted.org/packages/7a/5e/5958555e09635d09b75de3c4f8b9cae7335ca545d77392ffe7331534c402/opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl", hash = "sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb", size = 219982 }, ] [[package]] name = "opentelemetry-util-http" version = "0.60b1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/fc/c47bb04a1d8a941a4061307e1eddfa331ed4d0ab13d8a9781e6db256940a/opentelemetry_util_http-0.60b1.tar.gz", hash = "sha256:0d97152ca8c8a41ced7172d29d3622a219317f74ae6bb3027cfbdcf22c3cc0d6", size = 11053, upload-time = "2025-12-11T13:37:25.115Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/50/fc/c47bb04a1d8a941a4061307e1eddfa331ed4d0ab13d8a9781e6db256940a/opentelemetry_util_http-0.60b1.tar.gz", hash = "sha256:0d97152ca8c8a41ced7172d29d3622a219317f74ae6bb3027cfbdcf22c3cc0d6", size = 11053 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/5c/d3f1733665f7cd582ef0842fb1d2ed0bc1fba10875160593342d22bba375/opentelemetry_util_http-0.60b1-py3-none-any.whl", hash = "sha256:66381ba28550c91bee14dcba8979ace443444af1ed609226634596b4b0faf199", size = 8947, upload-time = "2025-12-11T13:36:37.151Z" }, + { url = "https://files.pythonhosted.org/packages/16/5c/d3f1733665f7cd582ef0842fb1d2ed0bc1fba10875160593342d22bba375/opentelemetry_util_http-0.60b1-py3-none-any.whl", hash = "sha256:66381ba28550c91bee14dcba8979ace443444af1ed609226634596b4b0faf199", size = 8947 }, ] [[package]] name = "openviking-sdk" version = "0.1.5" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/9c/b75da8d956bbfaf39288dd3cf7c734ba9225fba34e44362d02fbdb9a871d/openviking_sdk-0.1.5.tar.gz", hash = "sha256:f017dec938267aaea659122165f2872e189933a5604ba6d9ec0ae867b558ecaf", size = 33652, upload-time = "2026-07-23T06:18:56.211Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/9c/b75da8d956bbfaf39288dd3cf7c734ba9225fba34e44362d02fbdb9a871d/openviking_sdk-0.1.5.tar.gz", hash = "sha256:f017dec938267aaea659122165f2872e189933a5604ba6d9ec0ae867b558ecaf", size = 33652 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/c0/481ec44e2f98cf1afd47d4c115756dd4b1fa674caa4b99b0f72723d6fc33/openviking_sdk-0.1.5-py3-none-any.whl", hash = "sha256:f29af1c56e1a4477c881d584fa5178b5a34600847926cfe21fddd333ccb576ec", size = 21740, upload-time = "2026-07-23T06:18:54.864Z" }, + { url = "https://files.pythonhosted.org/packages/53/c0/481ec44e2f98cf1afd47d4c115756dd4b1fa674caa4b99b0f72723d6fc33/openviking_sdk-0.1.5-py3-none-any.whl", hash = "sha256:f29af1c56e1a4477c881d584fa5178b5a34600847926cfe21fddd333ccb576ec", size = 21740 }, ] [[package]] name = "orjson" version = "3.11.9" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/0c/964746fcafbd16f8ff53219ad9f6b412b34f345c75f384ad434ceaadb538/orjson-3.11.9.tar.gz", hash = "sha256:4fef17e1f8722c11587a6ef18e35902450221da0028e65dbaaa543619e68e48f", size = 5599163, upload-time = "2026-05-06T15:11:08.309Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/32/33/93fcc25907235c344ae73122f8a4e01d2d393ef062b4af7d2e2487a32c37/orjson-3.11.9-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4bab1b2d6141fe7b32ae71dac905666ece4f94936efbfb13d55bb7739a3a6021", size = 228458, upload-time = "2026-05-06T15:10:20.079Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/27/b1e6dadb3c080313c03fdd8067b85e6a0460c7d8d6a1c3984ef77b904e4d/orjson-3.11.9-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:844417969855fc7a41be124aafe83dc424592a7f77cd4501900c67307122b92c", size = 128368, upload-time = "2026-05-06T15:10:21.549Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/0f/c9ede0bf052f6b4051e64a7d4fa91b725cccf8321a6a786e86eb03519f00/orjson-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe02797b5e9f3a9d8292ddcd289b474ad13e81ad83cd1891a240811f1d2cb81", size = 132070, upload-time = "2026-05-06T15:10:23.371Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/26/d398e28048dc18205bbe812f2c88cb9b40313db2470778e25964796458fe/orjson-3.11.9-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e4eed3b200023042814d2fc8a5d2e880f13b52e1ed2485e83da4f3962f7dc1a", size = 127892, upload-time = "2026-05-06T15:10:24.714Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/60/52b0054c4c700d5aa7fc5b7ca96917400d8f061307778578e67a10e25852/orjson-3.11.9-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aff7da9952a5ad1cef8e68017724d96c7b9a66e99e91d6252e1b133d67a7b10", size = 135217, upload-time = "2026-05-06T15:10:26.084Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d5/97/1e3dc2b2a28b7b2528f403d2fc1d79ec5f39af3bc143ab65d3ec26426385/orjson-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d4e98d6f3b8afed8bc8cd9718ec0cdf46661826beefb53fe8eafb37f2bf0362", size = 145980, upload-time = "2026-05-06T15:10:28.062Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/39/31fbfe7850f2de32dee7e7e5c09f26d403ab01e440ac96001c6b01ad3c99/orjson-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a81d52442a7c99b3662333235b3adf96a1715864658b35bb797212be7bddb97", size = 132738, upload-time = "2026-05-06T15:10:29.727Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/08/dca0082dd2a194acb93e5457e73455388e2e2ca464a2672449a9ddbb679d/orjson-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e39364e726a8fff737309aff059ff67d8a8c8d5b677be7bb49a8b3e84b7e218", size = 134033, upload-time = "2026-05-06T15:10:31.152Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/d4/5bdb0626801230139987385554c5d4c42255218ac906525bf4347f22cd95/orjson-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4fd66214623f1b17501df9f0543bef0b833979ab5b6ded1e1d123222866aa8c9", size = 141492, upload-time = "2026-05-06T15:10:32.641Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/88/a21fb53b3ede6703aede6dce4710ed4111e5b201cfa6bbff5e544f9d47d7/orjson-3.11.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8ecc30f10465fa1e0ce13fd01d9e22c316e5053a719a8d915d4545a09a5ff677", size = 415087, upload-time = "2026-05-06T15:10:34.438Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/57/1b30daf70f0d8180e9a73cefbfbdd99e4bf19eb020466502b01fba7e0e50/orjson-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:97db4c94a7db398a5bd636273324f0b3fd58b350bbbac8bb380ceb825a9b40f4", size = 148031, upload-time = "2026-05-06T15:10:36.358Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/83/45fbb6d962e260807f99441db9613cee868ceda4baceda59b3720a563f97/orjson-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f78cf8fec5bd627f4082b8dfeac7871b43d7f3274904492a43dab39f18a19a0", size = 136915, upload-time = "2026-05-06T15:10:38.013Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/cc/2d10025f9056d376e4127ec05a5808b218d46f035fdc08178a5411b34250/orjson-3.11.9-cp313-cp313-win32.whl", hash = "sha256:d4087e5c0209a0a8efe4de3303c234b9c44d1174161dcd851e8eea07c7560b32", size = 131613, upload-time = "2026-05-06T15:10:39.569Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/bd/2775ff28bfe883b9aa1ff348300542eb2ef1ee18d8ae0e3a49846817a865/orjson-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:051b102c93b4f634e89f3866b07b9a9a98915ada541f4ec30f177067b2694979", size = 127086, upload-time = "2026-05-06T15:10:41.262Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/2b/d26799e580939e32a7da9a39531bc9e58e15ca32ffaa6a8cb3e9bb0d22cd/orjson-3.11.9-cp313-cp313-win_arm64.whl", hash = "sha256:cce9127885941bd28f080cecf1f1d288336b7e0d812c345b08be88b572796254", size = 126696, upload-time = "2026-05-06T15:10:42.651Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/0c/964746fcafbd16f8ff53219ad9f6b412b34f345c75f384ad434ceaadb538/orjson-3.11.9.tar.gz", hash = "sha256:4fef17e1f8722c11587a6ef18e35902450221da0028e65dbaaa543619e68e48f", size = 5599163 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/33/93fcc25907235c344ae73122f8a4e01d2d393ef062b4af7d2e2487a32c37/orjson-3.11.9-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4bab1b2d6141fe7b32ae71dac905666ece4f94936efbfb13d55bb7739a3a6021", size = 228458 }, + { url = "https://files.pythonhosted.org/packages/8f/27/b1e6dadb3c080313c03fdd8067b85e6a0460c7d8d6a1c3984ef77b904e4d/orjson-3.11.9-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:844417969855fc7a41be124aafe83dc424592a7f77cd4501900c67307122b92c", size = 128368 }, + { url = "https://files.pythonhosted.org/packages/21/0f/c9ede0bf052f6b4051e64a7d4fa91b725cccf8321a6a786e86eb03519f00/orjson-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe02797b5e9f3a9d8292ddcd289b474ad13e81ad83cd1891a240811f1d2cb81", size = 132070 }, + { url = "https://files.pythonhosted.org/packages/fd/26/d398e28048dc18205bbe812f2c88cb9b40313db2470778e25964796458fe/orjson-3.11.9-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e4eed3b200023042814d2fc8a5d2e880f13b52e1ed2485e83da4f3962f7dc1a", size = 127892 }, + { url = "https://files.pythonhosted.org/packages/66/60/52b0054c4c700d5aa7fc5b7ca96917400d8f061307778578e67a10e25852/orjson-3.11.9-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aff7da9952a5ad1cef8e68017724d96c7b9a66e99e91d6252e1b133d67a7b10", size = 135217 }, + { url = "https://files.pythonhosted.org/packages/d5/97/1e3dc2b2a28b7b2528f403d2fc1d79ec5f39af3bc143ab65d3ec26426385/orjson-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d4e98d6f3b8afed8bc8cd9718ec0cdf46661826beefb53fe8eafb37f2bf0362", size = 145980 }, + { url = "https://files.pythonhosted.org/packages/fc/39/31fbfe7850f2de32dee7e7e5c09f26d403ab01e440ac96001c6b01ad3c99/orjson-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a81d52442a7c99b3662333235b3adf96a1715864658b35bb797212be7bddb97", size = 132738 }, + { url = "https://files.pythonhosted.org/packages/a1/08/dca0082dd2a194acb93e5457e73455388e2e2ca464a2672449a9ddbb679d/orjson-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e39364e726a8fff737309aff059ff67d8a8c8d5b677be7bb49a8b3e84b7e218", size = 134033 }, + { url = "https://files.pythonhosted.org/packages/11/d4/5bdb0626801230139987385554c5d4c42255218ac906525bf4347f22cd95/orjson-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4fd66214623f1b17501df9f0543bef0b833979ab5b6ded1e1d123222866aa8c9", size = 141492 }, + { url = "https://files.pythonhosted.org/packages/fa/88/a21fb53b3ede6703aede6dce4710ed4111e5b201cfa6bbff5e544f9d47d7/orjson-3.11.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8ecc30f10465fa1e0ce13fd01d9e22c316e5053a719a8d915d4545a09a5ff677", size = 415087 }, + { url = "https://files.pythonhosted.org/packages/3d/57/1b30daf70f0d8180e9a73cefbfbdd99e4bf19eb020466502b01fba7e0e50/orjson-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:97db4c94a7db398a5bd636273324f0b3fd58b350bbbac8bb380ceb825a9b40f4", size = 148031 }, + { url = "https://files.pythonhosted.org/packages/04/83/45fbb6d962e260807f99441db9613cee868ceda4baceda59b3720a563f97/orjson-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f78cf8fec5bd627f4082b8dfeac7871b43d7f3274904492a43dab39f18a19a0", size = 136915 }, + { url = "https://files.pythonhosted.org/packages/5f/cc/2d10025f9056d376e4127ec05a5808b218d46f035fdc08178a5411b34250/orjson-3.11.9-cp313-cp313-win32.whl", hash = "sha256:d4087e5c0209a0a8efe4de3303c234b9c44d1174161dcd851e8eea07c7560b32", size = 131613 }, + { url = "https://files.pythonhosted.org/packages/67/bd/2775ff28bfe883b9aa1ff348300542eb2ef1ee18d8ae0e3a49846817a865/orjson-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:051b102c93b4f634e89f3866b07b9a9a98915ada541f4ec30f177067b2694979", size = 127086 }, + { url = "https://files.pythonhosted.org/packages/91/2b/d26799e580939e32a7da9a39531bc9e58e15ca32ffaa6a8cb3e9bb0d22cd/orjson-3.11.9-cp313-cp313-win_arm64.whl", hash = "sha256:cce9127885941bd28f080cecf1f1d288336b7e0d812c345b08be88b572796254", size = 126696 }, ] [[package]] name = "packaging" version = "26.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195 }, ] [[package]] name = "paginate" version = "0.5.7" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746 }, ] [[package]] name = "pathable" version = "0.6.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/f3/5a20387de9bcd0607871bfc2198ee0e15836da7baa4592ccd7f24c27c986/pathable-0.6.0.tar.gz", hash = "sha256:6404b8b82aef5ff0fd478934137128b99b12212ba35afdde5525ca4f8388ea58", size = 18970, upload-time = "2026-05-19T18:15:11.911Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/f3/5a20387de9bcd0607871bfc2198ee0e15836da7baa4592ccd7f24c27c986/pathable-0.6.0.tar.gz", hash = "sha256:6404b8b82aef5ff0fd478934137128b99b12212ba35afdde5525ca4f8388ea58", size = 18970 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/e8/6d75ffd9784bce2e93d1ae4415649427e39a53bb172d4672b2b59c6f0a7b/pathable-0.6.0-py3-none-any.whl", hash = "sha256:82c4ca6c98c502ad12e0d4e9779b6210afee93c38990988c8c5d1b49bdcdf566", size = 18983, upload-time = "2026-05-19T18:15:10.728Z" }, + { url = "https://files.pythonhosted.org/packages/a2/e8/6d75ffd9784bce2e93d1ae4415649427e39a53bb172d4672b2b59c6f0a7b/pathable-0.6.0-py3-none-any.whl", hash = "sha256:82c4ca6c98c502ad12e0d4e9779b6210afee93c38990988c8c5d1b49bdcdf566", size = 18983 }, ] [[package]] name = "pathlib-abc" version = "0.5.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/cb/448649d7f25d228bf0be3a04590ab7afa77f15e056f8fa976ed05ec9a78f/pathlib_abc-0.5.2.tar.gz", hash = "sha256:fcd56f147234645e2c59c7ae22808b34c364bb231f685ddd9f96885aed78a94c", size = 33342, upload-time = "2025-10-10T18:37:20.524Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/cb/448649d7f25d228bf0be3a04590ab7afa77f15e056f8fa976ed05ec9a78f/pathlib_abc-0.5.2.tar.gz", hash = "sha256:fcd56f147234645e2c59c7ae22808b34c364bb231f685ddd9f96885aed78a94c", size = 33342 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl", hash = "sha256:4c9d94cf1b23af417ce7c0417b43333b06a106c01000b286c99de230d95eefbb", size = 19070, upload-time = "2025-10-10T18:37:19.437Z" }, + { url = "https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl", hash = "sha256:4c9d94cf1b23af417ce7c0417b43333b06a106c01000b286c99de230d95eefbb", size = 19070 }, ] [[package]] name = "pathspec" version = "1.1.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328 }, ] [[package]] name = "pathvalidate" version = "3.3.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/2a/52a8da6fe965dea6192eb716b357558e103aea0a1e9a8352ad575a8406ca/pathvalidate-3.3.1.tar.gz", hash = "sha256:b18c07212bfead624345bb8e1d6141cdcf15a39736994ea0b94035ad2b1ba177", size = 63262, upload-time = "2025-06-15T09:07:20.736Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/2a/52a8da6fe965dea6192eb716b357558e103aea0a1e9a8352ad575a8406ca/pathvalidate-3.3.1.tar.gz", hash = "sha256:b18c07212bfead624345bb8e1d6141cdcf15a39736994ea0b94035ad2b1ba177", size = 63262 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl", hash = "sha256:5263baab691f8e1af96092fa5137ee17df5bdfbd6cff1fcac4d6ef4bc2e1735f", size = 24305, upload-time = "2025-06-15T09:07:19.117Z" }, + { url = "https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl", hash = "sha256:5263baab691f8e1af96092fa5137ee17df5bdfbd6cff1fcac4d6ef4bc2e1735f", size = 24305 }, ] [[package]] name = "pefile" version = "2024.8.26" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/4f/2750f7f6f025a1507cd3b7218691671eecfd0bbebebe8b39aa0fe1d360b8/pefile-2024.8.26.tar.gz", hash = "sha256:3ff6c5d8b43e8c37bb6e6dd5085658d658a7a0bdcd20b6a07b1fcfc1c4e9d632", size = 76008, upload-time = "2024-08-26T20:58:38.155Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/4f/2750f7f6f025a1507cd3b7218691671eecfd0bbebebe8b39aa0fe1d360b8/pefile-2024.8.26.tar.gz", hash = "sha256:3ff6c5d8b43e8c37bb6e6dd5085658d658a7a0bdcd20b6a07b1fcfc1c4e9d632", size = 76008 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/54/16/12b82f791c7f50ddec566873d5bdd245baa1491bac11d15ffb98aecc8f8b/pefile-2024.8.26-py3-none-any.whl", hash = "sha256:76f8b485dcd3b1bb8166f1128d395fa3d87af26360c2358fb75b80019b957c6f", size = 74766, upload-time = "2024-08-26T21:01:02.632Z" }, + { url = "https://files.pythonhosted.org/packages/54/16/12b82f791c7f50ddec566873d5bdd245baa1491bac11d15ffb98aecc8f8b/pefile-2024.8.26-py3-none-any.whl", hash = "sha256:76f8b485dcd3b1bb8166f1128d395fa3d87af26360c2358fb75b80019b957c6f", size = 74766 }, ] [[package]] name = "pillow" version = "12.3.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889, upload-time = "2026-07-01T11:54:31.97Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109, upload-time = "2026-07-01T11:54:34.026Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287, upload-time = "2026-07-01T11:54:44.9Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691, upload-time = "2026-07-01T11:54:47.141Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185, upload-time = "2026-07-01T11:54:49.137Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684 }, + { url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487 }, + { url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433 }, + { url = "https://files.pythonhosted.org/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889 }, + { url = "https://files.pythonhosted.org/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109 }, + { url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736 }, + { url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129 }, + { url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562 }, + { url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439 }, + { url = "https://files.pythonhosted.org/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287 }, + { url = "https://files.pythonhosted.org/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691 }, + { url = "https://files.pythonhosted.org/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185 }, ] [[package]] name = "pipdeptree" version = "4.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nab-index" }, { name = "nab-python" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/68/8b0bca63d885a34bc7f8bcbc001bb9ffdc937fdada1d01d09f9af7785250/pipdeptree-4.1.0.tar.gz", hash = "sha256:6eb7e671ffa06ef597d683680d483a4882a86a2a00494971733bd88a3404c44f", size = 135159, upload-time = "2026-07-21T13:27:29.357Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/68/8b0bca63d885a34bc7f8bcbc001bb9ffdc937fdada1d01d09f9af7785250/pipdeptree-4.1.0.tar.gz", hash = "sha256:6eb7e671ffa06ef597d683680d483a4882a86a2a00494971733bd88a3404c44f", size = 135159 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/81/c1faac2e66ea180149158082e0ecaaac9e21362f23e179d145ed24cb1b12/pipdeptree-4.1.0-cp310-abi3-macosx_10_15_x86_64.whl", hash = "sha256:dd43b6af5990fd2d22c9b2d8b51f0fcf75a9019b79c950d62a12629c0c796306", size = 1645717, upload-time = "2026-07-21T13:27:06.442Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/60/bd1bfd035dc60b8b1e699da7210c11d23f55e14d5e110169c84dc3c42f88/pipdeptree-4.1.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:83a812e9fc901e511209b12cc358b73ba9372af0123901f523407c6d6d46f3ca", size = 1536600, upload-time = "2026-07-21T13:27:08.366Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/b4/5c99186ba900cd5fcabea5ceb15dfb54ba5f0f5c4ac36c8ec50bba39bdb6/pipdeptree-4.1.0-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4ac5c99e5305c916c9276689c4a2a00156bf3e72fb6d74da4c7cf9e908034e79", size = 1758348, upload-time = "2026-07-21T13:27:09.866Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a8/c2/3e7d6554759990dab54ad0ce4312534b0ebb0d0a3db9f171f6445298734e/pipdeptree-4.1.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:0b48a42f22d1588feab62ce50f65d20dc9d6f8daf70105e5f27fc0dfc553b13c", size = 1839269, upload-time = "2026-07-21T13:27:11.329Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/07/5d1835791e82699df0383bc432f4c721e95a8aa40fd3e5b3a0d720d551aa/pipdeptree-4.1.0-cp310-abi3-win_amd64.whl", hash = "sha256:24a011ed94b4fb3e7a3395e2a705f5b82661263148609704e871a4b820e07cba", size = 1674697, upload-time = "2026-07-21T13:27:12.761Z" }, + { url = "https://files.pythonhosted.org/packages/66/81/c1faac2e66ea180149158082e0ecaaac9e21362f23e179d145ed24cb1b12/pipdeptree-4.1.0-cp310-abi3-macosx_10_15_x86_64.whl", hash = "sha256:dd43b6af5990fd2d22c9b2d8b51f0fcf75a9019b79c950d62a12629c0c796306", size = 1645717 }, + { url = "https://files.pythonhosted.org/packages/f0/60/bd1bfd035dc60b8b1e699da7210c11d23f55e14d5e110169c84dc3c42f88/pipdeptree-4.1.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:83a812e9fc901e511209b12cc358b73ba9372af0123901f523407c6d6d46f3ca", size = 1536600 }, + { url = "https://files.pythonhosted.org/packages/57/b4/5c99186ba900cd5fcabea5ceb15dfb54ba5f0f5c4ac36c8ec50bba39bdb6/pipdeptree-4.1.0-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4ac5c99e5305c916c9276689c4a2a00156bf3e72fb6d74da4c7cf9e908034e79", size = 1758348 }, + { url = "https://files.pythonhosted.org/packages/a8/c2/3e7d6554759990dab54ad0ce4312534b0ebb0d0a3db9f171f6445298734e/pipdeptree-4.1.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:0b48a42f22d1588feab62ce50f65d20dc9d6f8daf70105e5f27fc0dfc553b13c", size = 1839269 }, + { url = "https://files.pythonhosted.org/packages/c1/07/5d1835791e82699df0383bc432f4c721e95a8aa40fd3e5b3a0d720d551aa/pipdeptree-4.1.0-cp310-abi3-win_amd64.whl", hash = "sha256:24a011ed94b4fb3e7a3395e2a705f5b82661263148609704e871a4b820e07cba", size = 1674697 }, ] [[package]] name = "platformdirs" version = "4.11.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/9b/560e4be8e26f6fd133a03630a8df0c663b9e8d61b4ade152b72005aec83b/platformdirs-4.11.0.tar.gz", hash = "sha256:0555d18370482847566ffabcaa53ad7c6c1c29f195989ae1ed634a05f76ea1e0", size = 31953, upload-time = "2026-07-21T13:09:36.565Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/78/9b/560e4be8e26f6fd133a03630a8df0c663b9e8d61b4ade152b72005aec83b/platformdirs-4.11.0.tar.gz", hash = "sha256:0555d18370482847566ffabcaa53ad7c6c1c29f195989ae1ed634a05f76ea1e0", size = 31953 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/68/d8d58938dfb1370b266a1a729e6d77a985be23689a0496498ee17b2cbf90/platformdirs-4.11.0-py3-none-any.whl", hash = "sha256:360ccded2b7fce0af0ff80cc8f5942a1c5d99b0e856033acb030bfc634709e74", size = 23247, upload-time = "2026-07-21T13:09:35.422Z" }, + { url = "https://files.pythonhosted.org/packages/7d/68/d8d58938dfb1370b266a1a729e6d77a985be23689a0496498ee17b2cbf90/platformdirs-4.11.0-py3-none-any.whl", hash = "sha256:360ccded2b7fce0af0ff80cc8f5942a1c5d99b0e856033acb030bfc634709e74", size = 23247 }, ] [[package]] name = "pluggy" version = "1.6.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, ] [[package]] name = "polyleven" version = "0.11.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/c7/e0b3bbe72e0003e5d02726e0d406ea47d523a2aec9c41d831817a8e0bce1/polyleven-0.11.0.tar.gz", hash = "sha256:d74d348387cf340051711c0dd6af993b4c264daa78470098de16f4a2b725785c", size = 6407, upload-time = "2026-02-09T09:41:49.87Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/c7/e0b3bbe72e0003e5d02726e0d406ea47d523a2aec9c41d831817a8e0bce1/polyleven-0.11.0.tar.gz", hash = "sha256:d74d348387cf340051711c0dd6af993b4c264daa78470098de16f4a2b725785c", size = 6407 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/16/5aec69609adc373f10087eb69b0b9d177ae721632715a86348b429030514/polyleven-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0cb8ed97b536f9aada3ad45169ee7768c426498bf3fa608a4eabd055dfef795e", size = 7425, upload-time = "2026-02-09T09:41:06.542Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bd/5b/0542c723aa83833a5090114bc4e5a8e60293873fe60ee8221a5888d87370/polyleven-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2f975ab8cb81fd8eb5a647a3cefb0bb80bc307920a9307f66ab4019d88370ed2", size = 7505, upload-time = "2026-02-09T09:41:07.445Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4a/8d/c317217734a5bd2011f1128c1a9056477a5148d8d95527fcab2fe3955876/polyleven-0.11.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:16986fd58911d6075b5f63ea001197141145b7a6df48bc4ce4530e79227e74a2", size = 21035, upload-time = "2026-02-09T09:41:08.32Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/8f/8a3e6e4a68dbd9de564fd3d16eee90e3f807a4380fd7192f40af4be47175/polyleven-0.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c6a814629cc0468f9800b1333414a3be08fda9c5ce6b63e97154a9d21732e590", size = 21509, upload-time = "2026-02-09T09:41:09.285Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/da/4097998bea845f0b3a67112200aa08c19d4da0a17d761b35484d695c21e2/polyleven-0.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:88a35ec93ec3d81a7347fd49db314a914798a144dca3d22946d18bba9b597dec", size = 20536, upload-time = "2026-02-09T09:41:10.211Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/71/67b7679ede99589ec749290d938693b87cdb6bb327b062c46d2129a5e6ec/polyleven-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:50bb7d68b790194d552ee1256a02e205486b27eb22ab333eeb0003e0271c4846", size = 20775, upload-time = "2026-02-09T09:41:11.692Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/3e/6f7fad4fee748ba365cb3e1ba2e061a74e18d987eb554ead4757127df2ab/polyleven-0.11.0-cp313-cp313-win32.whl", hash = "sha256:ce264f6a9daa3265299d8ffcb180d8256517a8d9235613a3b267172da0bc1e06", size = 11629, upload-time = "2026-02-09T09:41:12.652Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/cc/4877913dec8fb4f968a070c894254db5811b62128d3a69b05bcd1305b5c3/polyleven-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:4648732c8ad3955c8d7b1aa015d92936a150475aaa97ce704fe0c8e7fa7e0c4f", size = 10841, upload-time = "2026-02-09T09:41:13.682Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/59/e2/039cc477ce73d6184e12cf6341ac200bc9f4c5428254c399015ec30392e1/polyleven-0.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:166f6c9b161c6af92ff201c734d6437bc7ef74a32dab306c5d47a0bdb7a82d9f", size = 9424, upload-time = "2026-02-09T09:41:14.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/16/5aec69609adc373f10087eb69b0b9d177ae721632715a86348b429030514/polyleven-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0cb8ed97b536f9aada3ad45169ee7768c426498bf3fa608a4eabd055dfef795e", size = 7425 }, + { url = "https://files.pythonhosted.org/packages/bd/5b/0542c723aa83833a5090114bc4e5a8e60293873fe60ee8221a5888d87370/polyleven-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2f975ab8cb81fd8eb5a647a3cefb0bb80bc307920a9307f66ab4019d88370ed2", size = 7505 }, + { url = "https://files.pythonhosted.org/packages/4a/8d/c317217734a5bd2011f1128c1a9056477a5148d8d95527fcab2fe3955876/polyleven-0.11.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:16986fd58911d6075b5f63ea001197141145b7a6df48bc4ce4530e79227e74a2", size = 21035 }, + { url = "https://files.pythonhosted.org/packages/5f/8f/8a3e6e4a68dbd9de564fd3d16eee90e3f807a4380fd7192f40af4be47175/polyleven-0.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c6a814629cc0468f9800b1333414a3be08fda9c5ce6b63e97154a9d21732e590", size = 21509 }, + { url = "https://files.pythonhosted.org/packages/6b/da/4097998bea845f0b3a67112200aa08c19d4da0a17d761b35484d695c21e2/polyleven-0.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:88a35ec93ec3d81a7347fd49db314a914798a144dca3d22946d18bba9b597dec", size = 20536 }, + { url = "https://files.pythonhosted.org/packages/a1/71/67b7679ede99589ec749290d938693b87cdb6bb327b062c46d2129a5e6ec/polyleven-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:50bb7d68b790194d552ee1256a02e205486b27eb22ab333eeb0003e0271c4846", size = 20775 }, + { url = "https://files.pythonhosted.org/packages/e9/3e/6f7fad4fee748ba365cb3e1ba2e061a74e18d987eb554ead4757127df2ab/polyleven-0.11.0-cp313-cp313-win32.whl", hash = "sha256:ce264f6a9daa3265299d8ffcb180d8256517a8d9235613a3b267172da0bc1e06", size = 11629 }, + { url = "https://files.pythonhosted.org/packages/2f/cc/4877913dec8fb4f968a070c894254db5811b62128d3a69b05bcd1305b5c3/polyleven-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:4648732c8ad3955c8d7b1aa015d92936a150475aaa97ce704fe0c8e7fa7e0c4f", size = 10841 }, + { url = "https://files.pythonhosted.org/packages/59/e2/039cc477ce73d6184e12cf6341ac200bc9f4c5428254c399015ec30392e1/polyleven-0.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:166f6c9b161c6af92ff201c734d6437bc7ef74a32dab306c5d47a0bdb7a82d9f", size = 9424 }, ] [[package]] name = "prometheus-client" version = "0.25.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035, upload-time = "2026-04-09T19:53:42.359Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154, upload-time = "2026-04-09T19:53:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154 }, ] [[package]] name = "prompt-toolkit" version = "3.0.52" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431 }, ] [[package]] name = "promptantic" version = "1.0.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "prompt-toolkit" }, { name = "pydantic" }, { name = "schemez" }, { name = "universal-pathlib" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3e/9d/0581eadf715aa31d61bfe2b7463b65dc6f08bc3220d3b2432d688f1a7979/promptantic-1.0.0.tar.gz", hash = "sha256:84422e4c83bd372c4fd3f13cbff317b8867c3807c4050d88a94496bf5813e663", size = 24765, upload-time = "2025-10-07T20:25:38.313Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/9d/0581eadf715aa31d61bfe2b7463b65dc6f08bc3220d3b2432d688f1a7979/promptantic-1.0.0.tar.gz", hash = "sha256:84422e4c83bd372c4fd3f13cbff317b8867c3807c4050d88a94496bf5813e663", size = 24765 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/d1/d4987d168b6942fee14cd49b00317658cc24f8db0fe121f4395576616290/promptantic-1.0.0-py3-none-any.whl", hash = "sha256:90ad4e7e860b1296427cd50a99abc1562e90ae482af104174acb99cb9dd6138b", size = 33945, upload-time = "2025-10-07T20:25:36.999Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d1/d4987d168b6942fee14cd49b00317658cc24f8db0fe121f4395576616290/promptantic-1.0.0-py3-none-any.whl", hash = "sha256:90ad4e7e860b1296427cd50a99abc1562e90ae482af104174acb99cb9dd6138b", size = 33945 }, ] [[package]] name = "promptlayer" version = "1.5.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, { name = "cachetools" }, @@ -3617,125 +3320,125 @@ dependencies = [ { name = "rich" }, { name = "tenacity" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/39/da/c93be46621337726ad33ed6f47bb28eba21ae2f95838ab980cfd4814cdbb/promptlayer-1.5.1.tar.gz", hash = "sha256:178dd2440003bc36e31c04833b6fc39ad07e02339499dc80b15d25483eb6e72c", size = 130611, upload-time = "2026-07-22T20:08:20.922Z" } +sdist = { url = "https://files.pythonhosted.org/packages/39/da/c93be46621337726ad33ed6f47bb28eba21ae2f95838ab980cfd4814cdbb/promptlayer-1.5.1.tar.gz", hash = "sha256:178dd2440003bc36e31c04833b6fc39ad07e02339499dc80b15d25483eb6e72c", size = 130611 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/06/d7c9bb1c878d413e02484df2108feb1dd1d8b52f83669c697194feecd30e/promptlayer-1.5.1-py3-none-any.whl", hash = "sha256:981e1d6df6e0c608f10fcaa6a6c687d502cd0813bc284efe4ac25bc94f8ca90a", size = 163429, upload-time = "2026-07-22T20:08:22.179Z" }, + { url = "https://files.pythonhosted.org/packages/e1/06/d7c9bb1c878d413e02484df2108feb1dd1d8b52f83669c697194feecd30e/promptlayer-1.5.1-py3-none-any.whl", hash = "sha256:981e1d6df6e0c608f10fcaa6a6c687d502cd0813bc284efe4ac25bc94f8ca90a", size = 163429 }, ] [[package]] name = "propcache" version = "0.5.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208, upload-time = "2026-05-08T21:02:12.199Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c5/09/f049e45385503fe67db75a6b6186a7b9f0c3930366dc960522c312a825b1/propcache-0.5.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:099aaf4b4d1a02265b92a977edf00b5c4f63b3b17ac6de39b0d637c9cac0188a", size = 94457, upload-time = "2026-05-08T21:00:36.355Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/65/83d1d05655baf63113731bd5a1008435e14f8d1e5a06cbe4ec5b23ad7a31/propcache-0.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68ce1c44c7a813a7f71ea04315a8c7b330b63db99d059a797a4651bb6f69f117", size = 53835, upload-time = "2026-05-08T21:00:38.072Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/12/a6ba6482bb5ea3260c000c9b20881c95fa11c6b30173715668259f844ed7/propcache-0.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fc299c129490f55f254cd90be0deca4764e36e9a7c08b4aa588479a3bbed3098", size = 54545, upload-time = "2026-05-08T21:00:39.319Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/19/7fa086f5764c59ec8a8e157cd93aa8497acc00aba9dcdec56bfffb32602d/propcache-0.5.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6ae2198be502c10f09b2516e7b5d019816924bc3183a43ce792a7bd6625e6f4", size = 59886, upload-time = "2026-05-08T21:00:40.621Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/e4/5d7663dc8235956c8f5281698a3af1d351d8820341ddd890f59d9a9127f2/propcache-0.5.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6041d31504dc1779d700e1edcfb08eea334b357620b06681a4eabb57a74e574e", size = 63261, upload-time = "2026-05-08T21:00:41.775Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4a/4a/15a03adee24d6350da4292caeac44c34c033d2afe5e87eb370f38854560f/propcache-0.5.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7eabc04151c78a9f4d5bbb5f1faf571e4defeb4b585e0fe95b60ff2dbe4d3d7", size = 64184, upload-time = "2026-05-08T21:00:43.018Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/c6/979176efdaa3d239e36d503d5af63a0a773b36662ed8f52e5b6a6d9fd40e/propcache-0.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4db0ba63d693afd40d249bd93f842b5f144f8fcbb83de05660373bcf30517b1d", size = 61534, upload-time = "2026-05-08T21:00:44.507Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c8/22/63e8cd1bae4c2d2be6493b6b7d10566ddafad88137cfbc99964a1119853c/propcache-0.5.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dbcf7675229b35d31abb6547d8ebc8c27a830ac3f9a794edff6254873ec7c0a", size = 61500, upload-time = "2026-05-08T21:00:45.796Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/5a/28e5d9acbac1cc9ccb67045e8c1b943aa8d79fdf39c93bd73cacd68008ea/propcache-0.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d310c013aad2c72f1c3f2f8dd3279d460a858c551f97aeb8c63e4693cca7b4d2", size = 59994, upload-time = "2026-05-08T21:00:47.093Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/40/db650677f554a95b9c01a7c9d93d629e93a15562f5deb4573c9ee136fed2/propcache-0.5.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:06187263ddad280d05b4d8a8b3bb7d164cbebd469236544a42e6d9b28ac6a4fa", size = 56884, upload-time = "2026-05-08T21:00:48.376Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/80/45/70b39b89516ff8b96bf732fa6fded8cef20f293cb1508690101c3c07ec51/propcache-0.5.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3115559b8effafd63b142ea5ed53d63a16ea6469cbc63dce4ee194b42db5d853", size = 63464, upload-time = "2026-05-08T21:00:49.954Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/e2/fa59d3a89eac5534293124af4f1d0d0ada091ce4a0ab4610ce03fd2bdd8d/propcache-0.5.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c60462af8e6dc30c35407c7237ea908d777b22862bbee27bc4699c0d8bcdc45a", size = 61588, upload-time = "2026-05-08T21:00:51.281Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/97/efb547a55c4bc7381cfb202d6a2239ac621045277bc1ea5dfd3a7f0516c0/propcache-0.5.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40314bca9ac559716fe374094fc81c11dcc34b64fd6c585360f5775690505704", size = 64667, upload-time = "2026-05-08T21:00:52.602Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/56/f5c7d9b4b7595d5127da38974d791b2153f3d1eae6c674af3583ace92ad3/propcache-0.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cfa21e036ce1e1db2be04ba3b85d2df1bb1702fa01932d984c5464c665228ff4", size = 62463, upload-time = "2026-05-08T21:00:54.303Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bd/3b/484a3a65fc9f9f60c41dcd17b428bace5389544e2c680994534a20755066/propcache-0.5.2-cp313-cp313-win32.whl", hash = "sha256:f156a3529f38063b6dbaf356e15602a7f95f8055b1295a438433a6386f10463d", size = 38621, upload-time = "2026-05-08T21:00:55.808Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/fd/3f0f10dba4dabad3bf53102be007abf55481067952bde0fdddff439e7c61/propcache-0.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:dfed59d0a5aeb01e242e66ff0300bc4a265a7c05f612d30016f0b60b1017d757", size = 41649, upload-time = "2026-05-08T21:00:57.061Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/ec/6ce619cc32bb500a482f811f9cd509368b4e58e638d13f2c68f370d6b475/propcache-0.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:ba338430e87ceb9c8f0cf754de38a9860560261e56c00376debd628698a7364f", size = 37636, upload-time = "2026-05-08T21:00:58.646Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1b/82/c1d268bbbf2ef981c5bf0fbbe746db617c66e3bcefe431a1aa8943fbe23a/propcache-0.5.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a592f5f3da71c8691c788c13cb6734b6d17663d2e1cb8caddf0673d01ef8847d", size = 98872, upload-time = "2026-05-08T21:00:59.889Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f4/d4/52c871e73e864e6b34c0e2d58ac1ec5ccd149497ddc7ad2137ae98323a35/propcache-0.5.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6a997d0489e9668a384fcfd5061b857aa5361de73191cac204d04b889cfbbafa", size = 56257, upload-time = "2026-05-08T21:01:01.195Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/f0/9b90ca2a210b3d09bcfcd96ecd0f55545c091535abce2a45de2775cfd357/propcache-0.5.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:10734b5484ea113152ee25a91dccedf81631791805d2c9ccb054958e51842c94", size = 56696, upload-time = "2026-05-08T21:01:02.941Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/0e/6e9d4ba07c8e56e21ddec1e75f12148142b21ca83a51871babce095334f4/propcache-0.5.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cafca7e56c12bb02ae16d283742bef25a61122e9dab2b5b3f2ccbe589ce32164", size = 62378, upload-time = "2026-05-08T21:01:04.475Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/19/c10badaa463dde8a27ce884f8ee2ec37e6035b7c9f5ff0c8f74f06f08dac/propcache-0.5.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f064f8d2b59177878b7615df1735cd8fe3462ed6be8c7b217d17a276489c2b7f", size = 65283, upload-time = "2026-05-08T21:01:05.959Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/b6/93bea99ca80e19cef6512a8580e5b7857bbe09422d9daa7fd4ef5723306c/propcache-0.5.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f78abfa8dfc32376fd1aacf597b2f2fbbe0ea751419aee718af5d4f82537ef8c", size = 66616, upload-time = "2026-05-08T21:01:07.228Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/e4/5c7462e50625f051f37fb38b8224f7639f667184bbd34424ec83819bb1b7/propcache-0.5.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7467da8a9822bf1a55336f877340c5bcbd3c482afc43a99771169f74a26dedc", size = 63773, upload-time = "2026-05-08T21:01:08.514Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/b6/99238894047b13c823be25027e736626cd414a52a5e30d2c3347c2733529/propcache-0.5.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a6ddc6ac9e25de626c1f129c1b467d7ecd33ce2237d3fd0c4e429feef0a7ee1f", size = 63664, upload-time = "2026-05-08T21:01:09.874Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/85/1e/a3a1a63116a2b8edb415a8bb9a6f0c34bd03830b1e18e8ce2904e1dc1cf4/propcache-0.5.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2f22cbbac9e26a8e864c0985ff1268d5d939d53d9d9411a9824279097e03a2cb", size = 62643, upload-time = "2026-05-08T21:01:11.132Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/03/893cf147de2fc6543c5eaa07ad833170e7e2a2385725bbebe8c0503723bb/propcache-0.5.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:fc76378c62a0f04d0cd82fbb1a2cd2d7e28fcb40d5873f28a6c44e388aaa2751", size = 59595, upload-time = "2026-05-08T21:01:12.387Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/3b/04c1a2e12c57766568ba75ba72b3bf2042818d4c1425fab6fc07155c7cff/propcache-0.5.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:acd2c8edba48e31e58a363b8cf4e5c7db3b04b3f9e371f601df30d9b0d244836", size = 65711, upload-time = "2026-05-08T21:01:13.676Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/34/80f8d0099f8d6bacc4de1624c85672681c8cd1149ca2da0e38fd120b817f/propcache-0.5.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:452b5065457eb9991ec5eb38ff41d6cd4c991c9ac7c531c4d5849ae473a9a13f", size = 64247, upload-time = "2026-05-08T21:01:14.936Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/1a/8b08f3a5f1037e9e370c55883ceeeee0f6dd0416fb2d2d67b8bfc91f2a79/propcache-0.5.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3430bb2bfe1331885c427745a751e774ee679fd4344f80b97bf879815fe8fa55", size = 67102, upload-time = "2026-05-08T21:01:16.281Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/34/68/8bdb7bb7756d76e005490649d10e4a8369e610c74d619f71e1aedf889e9c/propcache-0.5.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cef6cea3922890dd6c9654971001fa797b526c16ab5e1e46c05fd6f877be7568", size = 64964, upload-time = "2026-05-08T21:01:17.57Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/aa/50fb0b5d3968b61a510926ff8b8465f1d6e976b3ab74496d7a4b9fc42515/propcache-0.5.2-cp313-cp313t-win32.whl", hash = "sha256:72d61e16dd78228b58c5d47be830ff3da7e5f139abdf0aef9d86cde1c5cf2191", size = 42546, upload-time = "2026-05-08T21:01:18.946Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/4c/0ddbae64321bd4a95bcbfc19307238016b5b1fee645c84626c8d539e5b74/propcache-0.5.2-cp313-cp313t-win_amd64.whl", hash = "sha256:0958834041a0166d343b8d2cedcd8bcbaeb4fdbe0cf08320c5379f143c3be6e7", size = 46330, upload-time = "2026-05-08T21:01:20.162Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/d9/9cddc8efb78d8af264c5ec9f6d10b62f57c515feda8d321595f56010fb23/propcache-0.5.2-cp313-cp313t-win_arm64.whl", hash = "sha256:6de8bd93ddde9b992cf2b2e0d796d501a19026b5b9fd87356d7d0779531a8d96", size = 40521, upload-time = "2026-05-08T21:01:21.399Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/09/f049e45385503fe67db75a6b6186a7b9f0c3930366dc960522c312a825b1/propcache-0.5.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:099aaf4b4d1a02265b92a977edf00b5c4f63b3b17ac6de39b0d637c9cac0188a", size = 94457 }, + { url = "https://files.pythonhosted.org/packages/6b/65/83d1d05655baf63113731bd5a1008435e14f8d1e5a06cbe4ec5b23ad7a31/propcache-0.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68ce1c44c7a813a7f71ea04315a8c7b330b63db99d059a797a4651bb6f69f117", size = 53835 }, + { url = "https://files.pythonhosted.org/packages/a9/12/a6ba6482bb5ea3260c000c9b20881c95fa11c6b30173715668259f844ed7/propcache-0.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fc299c129490f55f254cd90be0deca4764e36e9a7c08b4aa588479a3bbed3098", size = 54545 }, + { url = "https://files.pythonhosted.org/packages/a9/19/7fa086f5764c59ec8a8e157cd93aa8497acc00aba9dcdec56bfffb32602d/propcache-0.5.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6ae2198be502c10f09b2516e7b5d019816924bc3183a43ce792a7bd6625e6f4", size = 59886 }, + { url = "https://files.pythonhosted.org/packages/a1/e4/5d7663dc8235956c8f5281698a3af1d351d8820341ddd890f59d9a9127f2/propcache-0.5.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6041d31504dc1779d700e1edcfb08eea334b357620b06681a4eabb57a74e574e", size = 63261 }, + { url = "https://files.pythonhosted.org/packages/4a/4a/15a03adee24d6350da4292caeac44c34c033d2afe5e87eb370f38854560f/propcache-0.5.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7eabc04151c78a9f4d5bbb5f1faf571e4defeb4b585e0fe95b60ff2dbe4d3d7", size = 64184 }, + { url = "https://files.pythonhosted.org/packages/8b/c6/979176efdaa3d239e36d503d5af63a0a773b36662ed8f52e5b6a6d9fd40e/propcache-0.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4db0ba63d693afd40d249bd93f842b5f144f8fcbb83de05660373bcf30517b1d", size = 61534 }, + { url = "https://files.pythonhosted.org/packages/c8/22/63e8cd1bae4c2d2be6493b6b7d10566ddafad88137cfbc99964a1119853c/propcache-0.5.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dbcf7675229b35d31abb6547d8ebc8c27a830ac3f9a794edff6254873ec7c0a", size = 61500 }, + { url = "https://files.pythonhosted.org/packages/60/5a/28e5d9acbac1cc9ccb67045e8c1b943aa8d79fdf39c93bd73cacd68008ea/propcache-0.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d310c013aad2c72f1c3f2f8dd3279d460a858c551f97aeb8c63e4693cca7b4d2", size = 59994 }, + { url = "https://files.pythonhosted.org/packages/f3/40/db650677f554a95b9c01a7c9d93d629e93a15562f5deb4573c9ee136fed2/propcache-0.5.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:06187263ddad280d05b4d8a8b3bb7d164cbebd469236544a42e6d9b28ac6a4fa", size = 56884 }, + { url = "https://files.pythonhosted.org/packages/80/45/70b39b89516ff8b96bf732fa6fded8cef20f293cb1508690101c3c07ec51/propcache-0.5.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3115559b8effafd63b142ea5ed53d63a16ea6469cbc63dce4ee194b42db5d853", size = 63464 }, + { url = "https://files.pythonhosted.org/packages/f9/e2/fa59d3a89eac5534293124af4f1d0d0ada091ce4a0ab4610ce03fd2bdd8d/propcache-0.5.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c60462af8e6dc30c35407c7237ea908d777b22862bbee27bc4699c0d8bcdc45a", size = 61588 }, + { url = "https://files.pythonhosted.org/packages/0b/97/efb547a55c4bc7381cfb202d6a2239ac621045277bc1ea5dfd3a7f0516c0/propcache-0.5.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40314bca9ac559716fe374094fc81c11dcc34b64fd6c585360f5775690505704", size = 64667 }, + { url = "https://files.pythonhosted.org/packages/92/56/f5c7d9b4b7595d5127da38974d791b2153f3d1eae6c674af3583ace92ad3/propcache-0.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cfa21e036ce1e1db2be04ba3b85d2df1bb1702fa01932d984c5464c665228ff4", size = 62463 }, + { url = "https://files.pythonhosted.org/packages/bd/3b/484a3a65fc9f9f60c41dcd17b428bace5389544e2c680994534a20755066/propcache-0.5.2-cp313-cp313-win32.whl", hash = "sha256:f156a3529f38063b6dbaf356e15602a7f95f8055b1295a438433a6386f10463d", size = 38621 }, + { url = "https://files.pythonhosted.org/packages/1c/fd/3f0f10dba4dabad3bf53102be007abf55481067952bde0fdddff439e7c61/propcache-0.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:dfed59d0a5aeb01e242e66ff0300bc4a265a7c05f612d30016f0b60b1017d757", size = 41649 }, + { url = "https://files.pythonhosted.org/packages/90/ec/6ce619cc32bb500a482f811f9cd509368b4e58e638d13f2c68f370d6b475/propcache-0.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:ba338430e87ceb9c8f0cf754de38a9860560261e56c00376debd628698a7364f", size = 37636 }, + { url = "https://files.pythonhosted.org/packages/1b/82/c1d268bbbf2ef981c5bf0fbbe746db617c66e3bcefe431a1aa8943fbe23a/propcache-0.5.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a592f5f3da71c8691c788c13cb6734b6d17663d2e1cb8caddf0673d01ef8847d", size = 98872 }, + { url = "https://files.pythonhosted.org/packages/f4/d4/52c871e73e864e6b34c0e2d58ac1ec5ccd149497ddc7ad2137ae98323a35/propcache-0.5.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6a997d0489e9668a384fcfd5061b857aa5361de73191cac204d04b889cfbbafa", size = 56257 }, + { url = "https://files.pythonhosted.org/packages/67/f0/9b90ca2a210b3d09bcfcd96ecd0f55545c091535abce2a45de2775cfd357/propcache-0.5.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:10734b5484ea113152ee25a91dccedf81631791805d2c9ccb054958e51842c94", size = 56696 }, + { url = "https://files.pythonhosted.org/packages/9d/0e/6e9d4ba07c8e56e21ddec1e75f12148142b21ca83a51871babce095334f4/propcache-0.5.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cafca7e56c12bb02ae16d283742bef25a61122e9dab2b5b3f2ccbe589ce32164", size = 62378 }, + { url = "https://files.pythonhosted.org/packages/65/19/c10badaa463dde8a27ce884f8ee2ec37e6035b7c9f5ff0c8f74f06f08dac/propcache-0.5.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f064f8d2b59177878b7615df1735cd8fe3462ed6be8c7b217d17a276489c2b7f", size = 65283 }, + { url = "https://files.pythonhosted.org/packages/b0/b6/93bea99ca80e19cef6512a8580e5b7857bbe09422d9daa7fd4ef5723306c/propcache-0.5.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f78abfa8dfc32376fd1aacf597b2f2fbbe0ea751419aee718af5d4f82537ef8c", size = 66616 }, + { url = "https://files.pythonhosted.org/packages/83/e4/5c7462e50625f051f37fb38b8224f7639f667184bbd34424ec83819bb1b7/propcache-0.5.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7467da8a9822bf1a55336f877340c5bcbd3c482afc43a99771169f74a26dedc", size = 63773 }, + { url = "https://files.pythonhosted.org/packages/ca/b6/99238894047b13c823be25027e736626cd414a52a5e30d2c3347c2733529/propcache-0.5.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a6ddc6ac9e25de626c1f129c1b467d7ecd33ce2237d3fd0c4e429feef0a7ee1f", size = 63664 }, + { url = "https://files.pythonhosted.org/packages/85/1e/a3a1a63116a2b8edb415a8bb9a6f0c34bd03830b1e18e8ce2904e1dc1cf4/propcache-0.5.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2f22cbbac9e26a8e864c0985ff1268d5d939d53d9d9411a9824279097e03a2cb", size = 62643 }, + { url = "https://files.pythonhosted.org/packages/e4/03/893cf147de2fc6543c5eaa07ad833170e7e2a2385725bbebe8c0503723bb/propcache-0.5.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:fc76378c62a0f04d0cd82fbb1a2cd2d7e28fcb40d5873f28a6c44e388aaa2751", size = 59595 }, + { url = "https://files.pythonhosted.org/packages/86/3b/04c1a2e12c57766568ba75ba72b3bf2042818d4c1425fab6fc07155c7cff/propcache-0.5.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:acd2c8edba48e31e58a363b8cf4e5c7db3b04b3f9e371f601df30d9b0d244836", size = 65711 }, + { url = "https://files.pythonhosted.org/packages/1c/34/80f8d0099f8d6bacc4de1624c85672681c8cd1149ca2da0e38fd120b817f/propcache-0.5.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:452b5065457eb9991ec5eb38ff41d6cd4c991c9ac7c531c4d5849ae473a9a13f", size = 64247 }, + { url = "https://files.pythonhosted.org/packages/f3/1a/8b08f3a5f1037e9e370c55883ceeeee0f6dd0416fb2d2d67b8bfc91f2a79/propcache-0.5.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3430bb2bfe1331885c427745a751e774ee679fd4344f80b97bf879815fe8fa55", size = 67102 }, + { url = "https://files.pythonhosted.org/packages/34/68/8bdb7bb7756d76e005490649d10e4a8369e610c74d619f71e1aedf889e9c/propcache-0.5.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cef6cea3922890dd6c9654971001fa797b526c16ab5e1e46c05fd6f877be7568", size = 64964 }, + { url = "https://files.pythonhosted.org/packages/0a/aa/50fb0b5d3968b61a510926ff8b8465f1d6e976b3ab74496d7a4b9fc42515/propcache-0.5.2-cp313-cp313t-win32.whl", hash = "sha256:72d61e16dd78228b58c5d47be830ff3da7e5f139abdf0aef9d86cde1c5cf2191", size = 42546 }, + { url = "https://files.pythonhosted.org/packages/ae/4c/0ddbae64321bd4a95bcbfc19307238016b5b1fee645c84626c8d539e5b74/propcache-0.5.2-cp313-cp313t-win_amd64.whl", hash = "sha256:0958834041a0166d343b8d2cedcd8bcbaeb4fdbe0cf08320c5379f143c3be6e7", size = 46330 }, + { url = "https://files.pythonhosted.org/packages/00/d9/9cddc8efb78d8af264c5ec9f6d10b62f57c515feda8d321595f56010fb23/propcache-0.5.2-cp313-cp313t-win_arm64.whl", hash = "sha256:6de8bd93ddde9b992cf2b2e0d796d501a19026b5b9fd87356d7d0779531a8d96", size = 40521 }, + { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036 }, ] [[package]] name = "protobuf" version = "6.33.6" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/70/e908e9c5e52ef7c3a6c7902c9dfbb34c7e29c25d2f81ade3856445fd5c94/protobuf-6.33.6.tar.gz", hash = "sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135", size = 444531, upload-time = "2026-03-18T19:05:00.988Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/70/e908e9c5e52ef7c3a6c7902c9dfbb34c7e29c25d2f81ade3856445fd5c94/protobuf-6.33.6.tar.gz", hash = "sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135", size = 444531 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/9f/2f509339e89cfa6f6a4c4ff50438db9ca488dec341f7e454adad60150b00/protobuf-6.33.6-cp310-abi3-win32.whl", hash = "sha256:7d29d9b65f8afef196f8334e80d6bc1d5d4adedb449971fefd3723824e6e77d3", size = 425739, upload-time = "2026-03-18T19:04:48.373Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/5d/683efcd4798e0030c1bab27374fd13a89f7c2515fb1f3123efdfaa5eab57/protobuf-6.33.6-cp310-abi3-win_amd64.whl", hash = "sha256:0cd27b587afca21b7cfa59a74dcbd48a50f0a6400cfb59391340ad729d91d326", size = 437089, upload-time = "2026-03-18T19:04:50.381Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/01/a3c3ed5cd186f39e7880f8303cc51385a198a81469d53d0fdecf1f64d929/protobuf-6.33.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a", size = 427737, upload-time = "2026-03-18T19:04:51.866Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/90/b3c01fdec7d2f627b3a6884243ba328c1217ed2d978def5c12dc50d328a3/protobuf-6.33.6-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2", size = 324610, upload-time = "2026-03-18T19:04:53.096Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9b/ca/25afc144934014700c52e05103c2421997482d561f3101ff352e1292fb81/protobuf-6.33.6-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3", size = 339381, upload-time = "2026-03-18T19:04:54.616Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/92/d1e32e3e0d894fe00b15ce28ad4944ab692713f2e7f0a99787405e43533a/protobuf-6.33.6-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593", size = 323436, upload-time = "2026-03-18T19:04:55.768Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c4/72/02445137af02769918a93807b2b7890047c32bfb9f90371cbc12688819eb/protobuf-6.33.6-py3-none-any.whl", hash = "sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901", size = 170656, upload-time = "2026-03-18T19:04:59.826Z" }, + { url = "https://files.pythonhosted.org/packages/fc/9f/2f509339e89cfa6f6a4c4ff50438db9ca488dec341f7e454adad60150b00/protobuf-6.33.6-cp310-abi3-win32.whl", hash = "sha256:7d29d9b65f8afef196f8334e80d6bc1d5d4adedb449971fefd3723824e6e77d3", size = 425739 }, + { url = "https://files.pythonhosted.org/packages/76/5d/683efcd4798e0030c1bab27374fd13a89f7c2515fb1f3123efdfaa5eab57/protobuf-6.33.6-cp310-abi3-win_amd64.whl", hash = "sha256:0cd27b587afca21b7cfa59a74dcbd48a50f0a6400cfb59391340ad729d91d326", size = 437089 }, + { url = "https://files.pythonhosted.org/packages/5c/01/a3c3ed5cd186f39e7880f8303cc51385a198a81469d53d0fdecf1f64d929/protobuf-6.33.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a", size = 427737 }, + { url = "https://files.pythonhosted.org/packages/ee/90/b3c01fdec7d2f627b3a6884243ba328c1217ed2d978def5c12dc50d328a3/protobuf-6.33.6-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2", size = 324610 }, + { url = "https://files.pythonhosted.org/packages/9b/ca/25afc144934014700c52e05103c2421997482d561f3101ff352e1292fb81/protobuf-6.33.6-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3", size = 339381 }, + { url = "https://files.pythonhosted.org/packages/16/92/d1e32e3e0d894fe00b15ce28ad4944ab692713f2e7f0a99787405e43533a/protobuf-6.33.6-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593", size = 323436 }, + { url = "https://files.pythonhosted.org/packages/c4/72/02445137af02769918a93807b2b7890047c32bfb9f90371cbc12688819eb/protobuf-6.33.6-py3-none-any.whl", hash = "sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901", size = 170656 }, ] [[package]] name = "psutil" version = "7.2.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595 }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082 }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476 }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062 }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893 }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589 }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090 }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859 }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560 }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997 }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972 }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266 }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737 }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617 }, ] [[package]] name = "psygnal" version = "0.15.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/79/20c3e23e75272e9ddf018097cf872ab088bccba978888472656629efa4a3/psygnal-0.15.1.tar.gz", hash = "sha256:f64f62dee2306fc1c22050a59b6c6cdad126e04b0cf50e393ff858a1da719096", size = 123147, upload-time = "2026-01-04T16:38:41.959Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/79/20c3e23e75272e9ddf018097cf872ab088bccba978888472656629efa4a3/psygnal-0.15.1.tar.gz", hash = "sha256:f64f62dee2306fc1c22050a59b6c6cdad126e04b0cf50e393ff858a1da719096", size = 123147 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/46/21/5a142165d27063abf5921807d3c3d973f5d44ab414a13b210839a43ead4d/psygnal-0.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2087aadc9404f007f79c2899e329932869e362c50de58b90631c5f49b4768cc5", size = 596768, upload-time = "2026-01-04T16:38:27.053Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/25/c1712931d61c118691e73daf29ef708c679ea9ba187c797dd5deee360411/psygnal-0.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f3bf68ca42569dfdce20c6cf915d34b78b9e3ddddacb9f78728224fda6946b4", size = 574808, upload-time = "2026-01-04T16:38:28.779Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/4f/3593e5adb88a188c798604aed95fbc1479f30230e7f51e8f2c770e6a3832/psygnal-0.15.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e9fca977f5335deea39aed22e31d9795983e4f243e59a7d3c4105793adb7693d", size = 885616, upload-time = "2026-01-04T16:38:30.081Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/4c/14779ed4c3a1d71fa1a9a87ecfb184ad3335dd64681067f77c1c47b14ae9/psygnal-0.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c85b7d05b92ccbec47c75ab8a5545eda462e81a492c82424aba5ab81a3ad89d", size = 876516, upload-time = "2026-01-04T16:38:31.422Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3e/bc/4f771e3cdcde4db4023dbf36d6f0aab44e02b9de719353c22954b655e2ff/psygnal-0.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:ac0e693b29e0a429e97315a52313321855bef6140e9975b7ae78b4d93c8fbb42", size = 419172, upload-time = "2026-01-04T16:38:32.82Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/46/49/7742544684bee728ec123515d2694cee859aa2a705951a461230b00f18cc/psygnal-0.15.1-py3-none-any.whl", hash = "sha256:4221140e633e45b076953c64bcb9b41a744833527f9a037c1ca98bc270798cbf", size = 90638, upload-time = "2026-01-04T16:38:40.841Z" }, + { url = "https://files.pythonhosted.org/packages/46/21/5a142165d27063abf5921807d3c3d973f5d44ab414a13b210839a43ead4d/psygnal-0.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2087aadc9404f007f79c2899e329932869e362c50de58b90631c5f49b4768cc5", size = 596768 }, + { url = "https://files.pythonhosted.org/packages/e1/25/c1712931d61c118691e73daf29ef708c679ea9ba187c797dd5deee360411/psygnal-0.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f3bf68ca42569dfdce20c6cf915d34b78b9e3ddddacb9f78728224fda6946b4", size = 574808 }, + { url = "https://files.pythonhosted.org/packages/2d/4f/3593e5adb88a188c798604aed95fbc1479f30230e7f51e8f2c770e6a3832/psygnal-0.15.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e9fca977f5335deea39aed22e31d9795983e4f243e59a7d3c4105793adb7693d", size = 885616 }, + { url = "https://files.pythonhosted.org/packages/58/4c/14779ed4c3a1d71fa1a9a87ecfb184ad3335dd64681067f77c1c47b14ae9/psygnal-0.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c85b7d05b92ccbec47c75ab8a5545eda462e81a492c82424aba5ab81a3ad89d", size = 876516 }, + { url = "https://files.pythonhosted.org/packages/3e/bc/4f771e3cdcde4db4023dbf36d6f0aab44e02b9de719353c22954b655e2ff/psygnal-0.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:ac0e693b29e0a429e97315a52313321855bef6140e9975b7ae78b4d93c8fbb42", size = 419172 }, + { url = "https://files.pythonhosted.org/packages/46/49/7742544684bee728ec123515d2694cee859aa2a705951a461230b00f18cc/psygnal-0.15.1-py3-none-any.whl", hash = "sha256:4221140e633e45b076953c64bcb9b41a744833527f9a037c1ca98bc270798cbf", size = 90638 }, ] [[package]] name = "ptyprocess" version = "0.7.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, ] [[package]] name = "py-key-value-aio" version = "0.4.5" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beartype" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/e2/d689d922894a7ecde73b6daeaf9b13dab5aae06fe6aaaf7514722644d382/py_key_value_aio-0.4.5.tar.gz", hash = "sha256:c6563a2c6abe5da5e20f4f9e875c2a9b425a2244a54fadbf46cf140a9eea45d7", size = 107547, upload-time = "2026-05-27T16:37:08.107Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/e2/d689d922894a7ecde73b6daeaf9b13dab5aae06fe6aaaf7514722644d382/py_key_value_aio-0.4.5.tar.gz", hash = "sha256:c6563a2c6abe5da5e20f4f9e875c2a9b425a2244a54fadbf46cf140a9eea45d7", size = 107547 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/95/b8ba862968712caa12a19666175334fa979e1f198b896a430adb3bacfe87/py_key_value_aio-0.4.5-py3-none-any.whl", hash = "sha256:ab862adbcb8c72547d1c57821f22cbbb71ab86509039c96f36e914e0336c8dd7", size = 170005, upload-time = "2026-05-27T16:37:06.629Z" }, + { url = "https://files.pythonhosted.org/packages/f6/95/b8ba862968712caa12a19666175334fa979e1f198b896a430adb3bacfe87/py_key_value_aio-0.4.5-py3-none-any.whl", hash = "sha256:ab862adbcb8c72547d1c57821f22cbbb71ab86509039c96f36e914e0336c8dd7", size = 170005 }, ] [package.optional-dependencies] @@ -3760,91 +3463,91 @@ redis = [ [[package]] name = "py-rust-stemmers" version = "0.1.8" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/c1/9763f9fb1cd73f9c317a83feeed6e0d4af320c6bbddab47b4a94f3a47d0c/py_rust_stemmers-0.1.8.tar.gz", hash = "sha256:6b0f6f48bc54d607aed802de872fcd5a71bae969a6760976dc78ce55e8eaf3da", size = 9732, upload-time = "2026-05-22T11:00:24.358Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/c1/9763f9fb1cd73f9c317a83feeed6e0d4af320c6bbddab47b4a94f3a47d0c/py_rust_stemmers-0.1.8.tar.gz", hash = "sha256:6b0f6f48bc54d607aed802de872fcd5a71bae969a6760976dc78ce55e8eaf3da", size = 9732 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/98/f078f3930311e7b6154ccdf9166c4e30a416c7d199e136b5f09265d58a35/py_rust_stemmers-0.1.8-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5bd15b89203ecd886960e237124d1aa6e55498d76418c36c967d3b12168d43dc", size = 290427, upload-time = "2026-05-22T10:59:55.316Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/46/21d784a3f1db6a23051ffd5826d8ee667d26a64587c1cfbda0443ed87fff/py_rust_stemmers-0.1.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6c92733b020534470ca5a0d7fe8b85c85622ff383d4f37fec75a1c677aa84921", size = 275628, upload-time = "2026-05-22T10:59:56.687Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/d5/701c73a4f6a7fecfd96a6588f0cafe98d6b0acde93adf8a2e45535f3d1d5/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ab605a86c950ba7e8ab1392cf91296c0bec3084babb897a4aecf90a10c82395", size = 316656, upload-time = "2026-05-22T10:59:57.67Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/0d/c58fe98153cfdb6abf4dfb6ac335c923000d4af4e736080c3a3045b7aea7/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:21ed8055cec1f78d666afad8ffd7a51775ba419d2c615b8a1df7b32ca7f33e2b", size = 319377, upload-time = "2026-05-22T10:59:58.664Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/d7/e60d04849e90aa3ad457211cc4999c30401f433341f9a5588c12b81f9877/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae773e1d01e9aa328d175f461475d0cd7074a82bfcc71de6dc5765e51f1cc9f7", size = 323719, upload-time = "2026-05-22T10:59:59.845Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/48/c0e4fb955db784cc354e0756354602f7043ff4c10fcbd9d901a2f8fe3239/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5cc8fab9d0f1b274a26935a632362b8278f03e81b65e8b8644d5ca3f62a5a1a4", size = 324110, upload-time = "2026-05-22T11:00:01.26Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/eb/981b26baff37cf7a26ee206763cc4d2fb3e1db8f0f86ec030074431fae05/py_rust_stemmers-0.1.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:35570098da02eb439afcd7270a12bf850bbe874b85cb912e0fb2d87a6e703920", size = 494645, upload-time = "2026-05-22T11:00:02.737Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/af/f16e805b7aefc2257b192b83a89300c8360b0fdffd3dfefa92dee4ec9b15/py_rust_stemmers-0.1.8-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:0a68745d4b3c7f5abc778ca967e8711df6154873abcfe4e62a6631fa2363cc32", size = 596124, upload-time = "2026-05-22T11:00:04.499Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/8c/e7a2c940ba00e0792ae346aed5e755d51d37cf6d6853f6b141e5380e285d/py_rust_stemmers-0.1.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7cc0cc0b8eb45d2158c28ea43e2f338c110aad63052ad3bd00bc7446a595e12f", size = 541771, upload-time = "2026-05-22T11:00:06.081Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/a0/dd7c5fc6ade6d2a2a49e49937f06f2d488511454e8ab1b313d277ee8c3b1/py_rust_stemmers-0.1.8-cp313-cp313-win_amd64.whl", hash = "sha256:15af4e12e1288de2e5241eec375afc6ad6be4c125a28ca010599d9f92db23f01", size = 212438, upload-time = "2026-05-22T11:00:07.244Z" }, + { url = "https://files.pythonhosted.org/packages/c2/98/f078f3930311e7b6154ccdf9166c4e30a416c7d199e136b5f09265d58a35/py_rust_stemmers-0.1.8-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5bd15b89203ecd886960e237124d1aa6e55498d76418c36c967d3b12168d43dc", size = 290427 }, + { url = "https://files.pythonhosted.org/packages/c9/46/21d784a3f1db6a23051ffd5826d8ee667d26a64587c1cfbda0443ed87fff/py_rust_stemmers-0.1.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6c92733b020534470ca5a0d7fe8b85c85622ff383d4f37fec75a1c677aa84921", size = 275628 }, + { url = "https://files.pythonhosted.org/packages/57/d5/701c73a4f6a7fecfd96a6588f0cafe98d6b0acde93adf8a2e45535f3d1d5/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ab605a86c950ba7e8ab1392cf91296c0bec3084babb897a4aecf90a10c82395", size = 316656 }, + { url = "https://files.pythonhosted.org/packages/9d/0d/c58fe98153cfdb6abf4dfb6ac335c923000d4af4e736080c3a3045b7aea7/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:21ed8055cec1f78d666afad8ffd7a51775ba419d2c615b8a1df7b32ca7f33e2b", size = 319377 }, + { url = "https://files.pythonhosted.org/packages/5c/d7/e60d04849e90aa3ad457211cc4999c30401f433341f9a5588c12b81f9877/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae773e1d01e9aa328d175f461475d0cd7074a82bfcc71de6dc5765e51f1cc9f7", size = 323719 }, + { url = "https://files.pythonhosted.org/packages/6a/48/c0e4fb955db784cc354e0756354602f7043ff4c10fcbd9d901a2f8fe3239/py_rust_stemmers-0.1.8-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5cc8fab9d0f1b274a26935a632362b8278f03e81b65e8b8644d5ca3f62a5a1a4", size = 324110 }, + { url = "https://files.pythonhosted.org/packages/48/eb/981b26baff37cf7a26ee206763cc4d2fb3e1db8f0f86ec030074431fae05/py_rust_stemmers-0.1.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:35570098da02eb439afcd7270a12bf850bbe874b85cb912e0fb2d87a6e703920", size = 494645 }, + { url = "https://files.pythonhosted.org/packages/6d/af/f16e805b7aefc2257b192b83a89300c8360b0fdffd3dfefa92dee4ec9b15/py_rust_stemmers-0.1.8-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:0a68745d4b3c7f5abc778ca967e8711df6154873abcfe4e62a6631fa2363cc32", size = 596124 }, + { url = "https://files.pythonhosted.org/packages/76/8c/e7a2c940ba00e0792ae346aed5e755d51d37cf6d6853f6b141e5380e285d/py_rust_stemmers-0.1.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7cc0cc0b8eb45d2158c28ea43e2f338c110aad63052ad3bd00bc7446a595e12f", size = 541771 }, + { url = "https://files.pythonhosted.org/packages/c2/a0/dd7c5fc6ade6d2a2a49e49937f06f2d488511454e8ab1b313d277ee8c3b1/py_rust_stemmers-0.1.8-cp313-cp313-win_amd64.whl", hash = "sha256:15af4e12e1288de2e5241eec375afc6ad6be4c125a28ca010599d9f92db23f01", size = 212438 }, ] [[package]] name = "pyarrow" version = "25.0.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/f3/95428098d1fa7d04432fb750eed06b41304c2f6a5d3319985e64db2d9d41/pyarrow-25.0.0.tar.gz", hash = "sha256:d2d697008b5ec06d75952ef260c2e9a8a0f6ccfce24266c04c9c8ade927cb3b4", size = 1199181, upload-time = "2026-07-10T08:29:50.116Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/f3/95428098d1fa7d04432fb750eed06b41304c2f6a5d3319985e64db2d9d41/pyarrow-25.0.0.tar.gz", hash = "sha256:d2d697008b5ec06d75952ef260c2e9a8a0f6ccfce24266c04c9c8ade927cb3b4", size = 1199181 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/c8/098ce17d778fd9d29e40bb8c5f19a40cc90c3f0b46c9057b0d7993f42f54/pyarrow-25.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:8831a3ba52fa7cdb78d368d968b1dcd06171e6dff5461e16d90de91d371e47bc", size = 35844549, upload-time = "2026-07-10T08:27:37.956Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/66/24c28877219abf6263d909b1592c97ff82c59f13a59acbed11fc87c0654f/pyarrow-25.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:5f4bacb60f91dd2fca6c52f1b9a0012cd090e0294f1f781dc1881a247a352f8e", size = 37610397, upload-time = "2026-07-10T08:27:43.803Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/55/6d1d5f5aff317ec5de9421594679ed51ed828fe7e2ce209327f819d801e4/pyarrow-25.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:59516c822d5fd8e544aaa0dfe72f36fed5d4c24ea8390aab1bcd31d7e959c6be", size = 46841701, upload-time = "2026-07-10T08:27:49.741Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/5d/f790fb6965ab54c9da0dda7856abc75fd0d7648d865f8d603c111d203a64/pyarrow-25.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6f9dbd83e91c239a1f5ee7ce13f108b5f6c0efbe40a4375260d8f08b43ad05e9", size = 50090118, upload-time = "2026-07-10T08:27:56.051Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/8c/faf025357ebf31bc96777f234277aa31e2aeca6dd4ecaa391f29085473c2/pyarrow-25.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18dcc8cc50b5e72eae6fcbfc6c8776c21a007176b27a3cdec5c2f5bcf126708d", size = 49945559, upload-time = "2026-07-10T08:28:01.927Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/a1/bd051871708ea99a5e0fc711926c26c6f2c6d0130c7aaac8093e34998af6/pyarrow-25.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4ec1895a87aa834c3b99b7a1e758747eb8bb57f922b32c0e0fa04afb8d6998b1", size = 53114238, upload-time = "2026-07-10T08:28:08.594Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/31/737f0c3cffcd6af647849477d1dd68045deac2e3963c3f9f211bedc48540/pyarrow-25.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:77c8d1ae46a44b4006e8db1cc977bbcc6ce4873c92f74137d68e45503b97fb18", size = 27861162, upload-time = "2026-07-10T08:28:12.975Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c8/098ce17d778fd9d29e40bb8c5f19a40cc90c3f0b46c9057b0d7993f42f54/pyarrow-25.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:8831a3ba52fa7cdb78d368d968b1dcd06171e6dff5461e16d90de91d371e47bc", size = 35844549 }, + { url = "https://files.pythonhosted.org/packages/bc/66/24c28877219abf6263d909b1592c97ff82c59f13a59acbed11fc87c0654f/pyarrow-25.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:5f4bacb60f91dd2fca6c52f1b9a0012cd090e0294f1f781dc1881a247a352f8e", size = 37610397 }, + { url = "https://files.pythonhosted.org/packages/53/55/6d1d5f5aff317ec5de9421594679ed51ed828fe7e2ce209327f819d801e4/pyarrow-25.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:59516c822d5fd8e544aaa0dfe72f36fed5d4c24ea8390aab1bcd31d7e959c6be", size = 46841701 }, + { url = "https://files.pythonhosted.org/packages/b5/5d/f790fb6965ab54c9da0dda7856abc75fd0d7648d865f8d603c111d203a64/pyarrow-25.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6f9dbd83e91c239a1f5ee7ce13f108b5f6c0efbe40a4375260d8f08b43ad05e9", size = 50090118 }, + { url = "https://files.pythonhosted.org/packages/0c/8c/faf025357ebf31bc96777f234277aa31e2aeca6dd4ecaa391f29085473c2/pyarrow-25.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18dcc8cc50b5e72eae6fcbfc6c8776c21a007176b27a3cdec5c2f5bcf126708d", size = 49945559 }, + { url = "https://files.pythonhosted.org/packages/07/a1/bd051871708ea99a5e0fc711926c26c6f2c6d0130c7aaac8093e34998af6/pyarrow-25.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4ec1895a87aa834c3b99b7a1e758747eb8bb57f922b32c0e0fa04afb8d6998b1", size = 53114238 }, + { url = "https://files.pythonhosted.org/packages/7c/31/737f0c3cffcd6af647849477d1dd68045deac2e3963c3f9f211bedc48540/pyarrow-25.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:77c8d1ae46a44b4006e8db1cc977bbcc6ce4873c92f74137d68e45503b97fb18", size = 27861162 }, ] [[package]] name = "pyasn1" version = "0.6.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a4/9a/23310166d960def5897e91fe20e5b724601b02a22e84ba1f94232c0b7f67/pyasn1-0.6.4.tar.gz", hash = "sha256:9c447d8431c947fe4c8febc4ed9e760bc29011a5b01e5c74b67025bd9fb8ce81", size = 151262, upload-time = "2026-07-09T01:12:33.988Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/9a/23310166d960def5897e91fe20e5b724601b02a22e84ba1f94232c0b7f67/pyasn1-0.6.4.tar.gz", hash = "sha256:9c447d8431c947fe4c8febc4ed9e760bc29011a5b01e5c74b67025bd9fb8ce81", size = 151262 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/3b/6163796d69c3977d1e4287bea4a6979161cbbdd170ebb430511e8e1999ce/pyasn1-0.6.4-py3-none-any.whl", hash = "sha256:deda9277cfd454080ec40b207fb6df82206a3a2688735233cdcd8d3d565f088b", size = 84410, upload-time = "2026-07-09T01:12:32.92Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3b/6163796d69c3977d1e4287bea4a6979161cbbdd170ebb430511e8e1999ce/pyasn1-0.6.4-py3-none-any.whl", hash = "sha256:deda9277cfd454080ec40b207fb6df82206a3a2688735233cdcd8d3d565f088b", size = 84410 }, ] [[package]] name = "pyasn1-modules" version = "0.4.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259 }, ] [[package]] name = "pyconify" version = "0.2.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/7f/94d424dc756a6287271cf40cf1b2a44c10e3f137bf3246a2b4a7416ca3d3/pyconify-0.2.1.tar.gz", hash = "sha256:8dd53757d9fbed41711434460932b2b5dbc25da720cd9f9a44af0187b2dfc07d", size = 22478, upload-time = "2025-02-06T13:20:53.592Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/7f/94d424dc756a6287271cf40cf1b2a44c10e3f137bf3246a2b4a7416ca3d3/pyconify-0.2.1.tar.gz", hash = "sha256:8dd53757d9fbed41711434460932b2b5dbc25da720cd9f9a44af0187b2dfc07d", size = 22478 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/40/50dd2e8bfec81676e4619903bd452c10dc0d8efac1533e79e67cc76759b5/pyconify-0.2.1-py3-none-any.whl", hash = "sha256:d3b53eee1f8a2d60c1d135610f42e789774dbe71c6d8af68af0a21d3b3ec9eb7", size = 19459, upload-time = "2025-02-06T13:20:51.613Z" }, + { url = "https://files.pythonhosted.org/packages/72/40/50dd2e8bfec81676e4619903bd452c10dc0d8efac1533e79e67cc76759b5/pyconify-0.2.1-py3-none-any.whl", hash = "sha256:d3b53eee1f8a2d60c1d135610f42e789774dbe71c6d8af68af0a21d3b3ec9eb7", size = 19459 }, ] [[package]] name = "pycparser" version = "3.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172 }, ] [[package]] name = "pydantic" version = "2.13.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262 }, ] [package.optional-dependencies] @@ -3855,19 +3558,19 @@ email = [ [[package]] name = "pydantic-ai" version = "2.17.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic-ai-slim", extra = ["anthropic", "cli", "evals", "google", "logfire", "mcp", "openai", "retries", "web"] }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/4a/749ffa1e82989fbe46452aefa667d4b97e6471f24de6c60e563a8953c289/pydantic_ai-2.17.0.tar.gz", hash = "sha256:32bfa1eb91bedf611f3dea59063765b4fce8d644c85bccb8e79bbb2f58e9ffa2", size = 18760, upload-time = "2026-07-24T01:55:37.467Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/4a/749ffa1e82989fbe46452aefa667d4b97e6471f24de6c60e563a8953c289/pydantic_ai-2.17.0.tar.gz", hash = "sha256:32bfa1eb91bedf611f3dea59063765b4fce8d644c85bccb8e79bbb2f58e9ffa2", size = 18760 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/af/07b7dc9c078a48201aadd8ce48c96e57c6936f8518b30fdb810b59adf62a/pydantic_ai-2.17.0-py3-none-any.whl", hash = "sha256:f780f7fde4b302efbf311b03a15a4b08836efc1b07f1497065200b656f72e2fa", size = 7733, upload-time = "2026-07-24T01:55:28.876Z" }, + { url = "https://files.pythonhosted.org/packages/9e/af/07b7dc9c078a48201aadd8ce48c96e57c6936f8518b30fdb810b59adf62a/pydantic_ai-2.17.0-py3-none-any.whl", hash = "sha256:f780f7fde4b302efbf311b03a15a4b08836efc1b07f1497065200b656f72e2fa", size = 7733 }, ] [[package]] name = "pydantic-ai-slim" version = "2.17.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "genai-prices" }, { name = "griffelib" }, @@ -3877,9 +3580,9 @@ dependencies = [ { name = "pydantic-graph" }, { name = "typing-inspection" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/52/ab9c7617b42727ba6ef6cc71f9f76f188cfe9387c42e9cdbf0ebe7f5d45d/pydantic_ai_slim-2.17.0.tar.gz", hash = "sha256:2ce0e81a270c99d7c8fb01b9675fe3fc6097efc99943f314bbf4b33f87adfab8", size = 893164, upload-time = "2026-07-24T01:55:39.431Z" } +sdist = { url = "https://files.pythonhosted.org/packages/01/52/ab9c7617b42727ba6ef6cc71f9f76f188cfe9387c42e9cdbf0ebe7f5d45d/pydantic_ai_slim-2.17.0.tar.gz", hash = "sha256:2ce0e81a270c99d7c8fb01b9675fe3fc6097efc99943f314bbf4b33f87adfab8", size = 893164 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/27/dc5d0e29bd24c73fa10fa45d4c4416f7cf7212f8ebdf139f5f134a9d2483/pydantic_ai_slim-2.17.0-py3-none-any.whl", hash = "sha256:9d236918df3504452f961b237266e3c025575ea366a155faefe3c04805fd2fa3", size = 1080947, upload-time = "2026-07-24T01:55:31.877Z" }, + { url = "https://files.pythonhosted.org/packages/3d/27/dc5d0e29bd24c73fa10fa45d4c4416f7cf7212f8ebdf139f5f134a9d2483/pydantic_ai_slim-2.17.0-py3-none-any.whl", hash = "sha256:9d236918df3504452f961b237266e3c025575ea366a155faefe3c04805fd2fa3", size = 1080947 }, ] [package.optional-dependencies] @@ -3924,33 +3627,33 @@ web = [ [[package]] name = "pydantic-core" version = "2.46.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306 }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906 }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802 }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446 }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757 }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275 }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467 }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417 }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782 }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782 }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334 }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986 }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693 }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819 }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411 }, ] [[package]] name = "pydantic-evals" version = "2.17.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "logfire-api" }, @@ -3959,57 +3662,57 @@ dependencies = [ { name = "pyyaml" }, { name = "rich" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/70/77768745b74a35d254d0e3c75ad8bd5bcc3c3d9383c6d38ad10bd331f1d8/pydantic_evals-2.17.0.tar.gz", hash = "sha256:4db59787f178a4ee12815a2e176774aa1c3c64df27b2037f05fec9677b08f200", size = 85147, upload-time = "2026-07-24T01:55:41.6Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/70/77768745b74a35d254d0e3c75ad8bd5bcc3c3d9383c6d38ad10bd331f1d8/pydantic_evals-2.17.0.tar.gz", hash = "sha256:4db59787f178a4ee12815a2e176774aa1c3c64df27b2037f05fec9677b08f200", size = 85147 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/23/7d/302c489844fb12396cae20804c161e71210f028436e89027d3d3ace8809d/pydantic_evals-2.17.0-py3-none-any.whl", hash = "sha256:be2ee15fa8d33646e0f2ab537df3e7feda15f87f641d763773ca378735e931bd", size = 100440, upload-time = "2026-07-24T01:55:33.665Z" }, + { url = "https://files.pythonhosted.org/packages/23/7d/302c489844fb12396cae20804c161e71210f028436e89027d3d3ace8809d/pydantic_evals-2.17.0-py3-none-any.whl", hash = "sha256:be2ee15fa8d33646e0f2ab537df3e7feda15f87f641d763773ca378735e931bd", size = 100440 }, ] [[package]] name = "pydantic-graph" version = "2.17.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, { name = "logfire-api" }, { name = "pydantic" }, { name = "typing-inspection" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/59/60/796977f734a7a089bd0ae3a2c33bdb4dec8ab4201aad5928b620c27df26c/pydantic_graph-2.17.0.tar.gz", hash = "sha256:28162287995cf46eb2f34d5e06e8da96f5fe167534b811bf6e80db382f065a91", size = 43982, upload-time = "2026-07-24T01:55:42.52Z" } +sdist = { url = "https://files.pythonhosted.org/packages/59/60/796977f734a7a089bd0ae3a2c33bdb4dec8ab4201aad5928b620c27df26c/pydantic_graph-2.17.0.tar.gz", hash = "sha256:28162287995cf46eb2f34d5e06e8da96f5fe167534b811bf6e80db382f065a91", size = 43982 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/a9/f4ea2cba136af41c5f69e089a3557a1d6b91771f59b43af5f9595105ca24/pydantic_graph-2.17.0-py3-none-any.whl", hash = "sha256:38e40ce971552fde4bc72f58d2e8f90478fbb3f9282be43dc471b48ba52660da", size = 51661, upload-time = "2026-07-24T01:55:35.212Z" }, + { url = "https://files.pythonhosted.org/packages/90/a9/f4ea2cba136af41c5f69e089a3557a1d6b91771f59b43af5f9595105ca24/pydantic_graph-2.17.0-py3-none-any.whl", hash = "sha256:38e40ce971552fde4bc72f58d2e8f90478fbb3f9282be43dc471b48ba52660da", size = 51661 }, ] [[package]] name = "pydantic-settings" version = "2.14.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/b5/8f48e906c3e0205276e8bd8cb7512217a87b2685304d64be27cad5b3019f/pydantic_settings-2.14.2.tar.gz", hash = "sha256:c19dd64b19097f1de80184f0cc7b0272a13ae6e170cbf240a3e27e381ed14a5f", size = 237700, upload-time = "2026-06-19T13:44:56.324Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/b5/8f48e906c3e0205276e8bd8cb7512217a87b2685304d64be27cad5b3019f/pydantic_settings-2.14.2.tar.gz", hash = "sha256:c19dd64b19097f1de80184f0cc7b0272a13ae6e170cbf240a3e27e381ed14a5f", size = 237700 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/c1/6e422f34e569cf8e18df68d1939c81c099d2b61e4f7d9621c8a77560799c/pydantic_settings-2.14.2-py3-none-any.whl", hash = "sha256:a20c97b37910b6550d5ea50fbcc2d4187defe58cd57070b73863d069419c9440", size = 61715, upload-time = "2026-06-19T13:44:55.02Z" }, + { url = "https://files.pythonhosted.org/packages/77/c1/6e422f34e569cf8e18df68d1939c81c099d2b61e4f7d9621c8a77560799c/pydantic_settings-2.14.2-py3-none-any.whl", hash = "sha256:a20c97b37910b6550d5ea50fbcc2d4187defe58cd57070b73863d069419c9440", size = 61715 }, ] [[package]] name = "pydantic-xml" version = "2.21.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "pydantic-core" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/87/085533e0873b2f80bdeb12156ffe5dddae7ee55573e2057ad574d73e3b6a/pydantic_xml-2.21.0.tar.gz", hash = "sha256:678ba9149c24e190ad94d6e3ce47f94cbb1409fd88d7df65d3d26939ff669ed0", size = 26825, upload-time = "2026-05-17T15:24:19.534Z" } +sdist = { url = "https://files.pythonhosted.org/packages/13/87/085533e0873b2f80bdeb12156ffe5dddae7ee55573e2057ad574d73e3b6a/pydantic_xml-2.21.0.tar.gz", hash = "sha256:678ba9149c24e190ad94d6e3ce47f94cbb1409fd88d7df65d3d26939ff669ed0", size = 26825 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8e/b1/278da37b539595b2cb6bb4fb3da1d69ff084c7bf5cc143f0a444550dc41a/pydantic_xml-2.21.0-py3-none-any.whl", hash = "sha256:966b8990746528304ebb96c97db7603ee3faf38f06266247b1fa444dbc16f8d6", size = 43449, upload-time = "2026-05-17T15:24:21.182Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b1/278da37b539595b2cb6bb4fb3da1d69ff084c7bf5cc143f0a444550dc41a/pydantic_xml-2.21.0-py3-none-any.whl", hash = "sha256:966b8990746528304ebb96c97db7603ee3faf38f06266247b1fa444dbc16f8d6", size = 43449 }, ] [[package]] name = "pydocket" version = "0.23.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "burner-redis" }, { name = "cloudpickle" }, @@ -4025,24 +3728,24 @@ dependencies = [ { name = "tzdata", marker = "sys_platform == 'win32'" }, { name = "uncalled-for" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/72/f5a0960249d32a213fb26297a55f842ce8bc90bb19adbf47fefebb9c99da/pydocket-0.23.1.tar.gz", hash = "sha256:136c1cc8b7aa7c4c08ea12431e966ae75eb093bb6ce6e0ac9db3391ba3d6034b", size = 425621, upload-time = "2026-07-20T18:49:24.592Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/72/f5a0960249d32a213fb26297a55f842ce8bc90bb19adbf47fefebb9c99da/pydocket-0.23.1.tar.gz", hash = "sha256:136c1cc8b7aa7c4c08ea12431e966ae75eb093bb6ce6e0ac9db3391ba3d6034b", size = 425621 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/67/b57ac7cfd2c2f30d58ff2c996591880d200078fc828cbbad8da69d634c0e/pydocket-0.23.1-py3-none-any.whl", hash = "sha256:3da279978fd0d07eb96d4119e1a213de61d6b4acd1792a28bc62e67f3e7e5929", size = 129230, upload-time = "2026-07-20T18:49:23.243Z" }, + { url = "https://files.pythonhosted.org/packages/e6/67/b57ac7cfd2c2f30d58ff2c996591880d200078fc828cbbad8da69d634c0e/pydocket-0.23.1-py3-none-any.whl", hash = "sha256:3da279978fd0d07eb96d4119e1a213de61d6b4acd1792a28bc62e67f3e7e5929", size = 129230 }, ] [[package]] name = "pygments" version = "2.20.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151 }, ] [[package]] name = "pyinstaller" version = "6.21.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "altgraph" }, { name = "macholib", marker = "sys_platform == 'darwin'" }, @@ -4052,56 +3755,56 @@ dependencies = [ { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, { name = "setuptools" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d5/4d/ec706c3fcf39e26888c35b39615ff4d5865d184069666c47492cff1fbe50/pyinstaller-6.21.0.tar.gz", hash = "sha256:bb9fab705983e393a2d1cac77d6972513057ad800215fd861dc15ff5272e98fd", size = 4061519, upload-time = "2026-06-13T14:15:06.25Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/4d/ec706c3fcf39e26888c35b39615ff4d5865d184069666c47492cff1fbe50/pyinstaller-6.21.0.tar.gz", hash = "sha256:bb9fab705983e393a2d1cac77d6972513057ad800215fd861dc15ff5272e98fd", size = 4061519 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/4a/53cf98bf66daed012dc9cd78c8203f19a675d696f2fc12afcf8c5049a0e0/pyinstaller-6.21.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:327d132389f37912609e01be62810cf96b5aa95b613903e4b8692e0d12fb0eda", size = 1052350, upload-time = "2026-06-13T14:13:55.88Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/83/b591295c352ef464c50b4c6ffff1c4f771d875c9e833f578d1b9f564f6b3/pyinstaller-6.21.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7071d4b094d5b40deeef5fa3d3b98a1b846087f7562b49209663d5f9281fe251", size = 748477, upload-time = "2026-06-13T14:14:00.327Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/8f/88fff4e403873b1e22286911350e75ff00db014aa08e57045da9d4328993/pyinstaller-6.21.0-py3-none-manylinux2014_i686.whl", hash = "sha256:6b6374d652107dd4a2eeece903ff82bb4045bb5e1006c5a158a6dcdbefe84bf2", size = 760877, upload-time = "2026-06-13T14:14:04.836Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8a/13/f0e48fbdfd1d05d948157121cea8b1b823dcb89efe6934b71fdd8bdb3f0f/pyinstaller-6.21.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:4e3108b3f02384560da70e39b8bf22b0ad597d02bd68a40d76ea91c1cfa00cad", size = 759194, upload-time = "2026-06-13T14:14:10.61Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dd/d5/ea7878cf9924ed30d946d8288777424e6d069d94f5bde56b4d0890069664/pyinstaller-6.21.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:697532279f535ad572bda613db4f821540e235c7854ca6da4d3bf0373f4415ee", size = 754979, upload-time = "2026-06-13T14:14:15.226Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9f/09/51b8905714b733bac66dbc041a7821372d70d888d273ae474c4037d4202d/pyinstaller-6.21.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:605169523a6b5ace39f13dfbff21add9f2bc43df99c7daf9394fefb2c45e8b6f", size = 754812, upload-time = "2026-06-13T14:14:20.264Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4b/43/d77779439d8c6c2e27a77bcfbd1d5cc0f568ebb611bb472b11af81b5f177/pyinstaller-6.21.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:5fa56746c1e76f93634d018502301378a2d0c382553d37d8c3c34ff436c12dd1", size = 753887, upload-time = "2026-06-13T14:14:25.268Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/8f/c22df1f6837784ac349057ba693f08e7b1ca7a0e06f9c33c63bc6280007b/pyinstaller-6.21.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:42395ec76df8e8120c36b13339d9db8cab83e316a12839ee303cc00fc941bb74", size = 753779, upload-time = "2026-06-13T14:14:29.445Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/76/1ce8a27ce62ba8cf3a87c9ce6d575610f4e55d7cb0123e7512fc3f4b921a/pyinstaller-6.21.0-py3-none-win32.whl", hash = "sha256:c6b28d30d8fd99ce162ff3aab5013ed44dbfb747566b1f01b9bed7964d7c14e9", size = 1336462, upload-time = "2026-06-13T14:14:35.785Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/fa/ca1d7e5257dd8566a9dfc0dfb02f8a8075eeb53d4b2d3c579f1276759042/pyinstaller-6.21.0-py3-none-win_amd64.whl", hash = "sha256:7fae06c494ce0ebfe6bd3055c0e409def884f63af2e3705d06bd431ad9237fc7", size = 1397487, upload-time = "2026-06-13T14:14:42.328Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/75/21b51523ce8d96629b71311775a0a65f5f5a872124ab0de33e5c848f8bff/pyinstaller-6.21.0-py3-none-win_arm64.whl", hash = "sha256:f13c95c9c03fb567217135919f93815c305813126780b0ed6e0123cb8acaf025", size = 1346094, upload-time = "2026-06-13T14:14:48.914Z" }, + { url = "https://files.pythonhosted.org/packages/0c/4a/53cf98bf66daed012dc9cd78c8203f19a675d696f2fc12afcf8c5049a0e0/pyinstaller-6.21.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:327d132389f37912609e01be62810cf96b5aa95b613903e4b8692e0d12fb0eda", size = 1052350 }, + { url = "https://files.pythonhosted.org/packages/30/83/b591295c352ef464c50b4c6ffff1c4f771d875c9e833f578d1b9f564f6b3/pyinstaller-6.21.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7071d4b094d5b40deeef5fa3d3b98a1b846087f7562b49209663d5f9281fe251", size = 748477 }, + { url = "https://files.pythonhosted.org/packages/3d/8f/88fff4e403873b1e22286911350e75ff00db014aa08e57045da9d4328993/pyinstaller-6.21.0-py3-none-manylinux2014_i686.whl", hash = "sha256:6b6374d652107dd4a2eeece903ff82bb4045bb5e1006c5a158a6dcdbefe84bf2", size = 760877 }, + { url = "https://files.pythonhosted.org/packages/8a/13/f0e48fbdfd1d05d948157121cea8b1b823dcb89efe6934b71fdd8bdb3f0f/pyinstaller-6.21.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:4e3108b3f02384560da70e39b8bf22b0ad597d02bd68a40d76ea91c1cfa00cad", size = 759194 }, + { url = "https://files.pythonhosted.org/packages/dd/d5/ea7878cf9924ed30d946d8288777424e6d069d94f5bde56b4d0890069664/pyinstaller-6.21.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:697532279f535ad572bda613db4f821540e235c7854ca6da4d3bf0373f4415ee", size = 754979 }, + { url = "https://files.pythonhosted.org/packages/9f/09/51b8905714b733bac66dbc041a7821372d70d888d273ae474c4037d4202d/pyinstaller-6.21.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:605169523a6b5ace39f13dfbff21add9f2bc43df99c7daf9394fefb2c45e8b6f", size = 754812 }, + { url = "https://files.pythonhosted.org/packages/4b/43/d77779439d8c6c2e27a77bcfbd1d5cc0f568ebb611bb472b11af81b5f177/pyinstaller-6.21.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:5fa56746c1e76f93634d018502301378a2d0c382553d37d8c3c34ff436c12dd1", size = 753887 }, + { url = "https://files.pythonhosted.org/packages/51/8f/c22df1f6837784ac349057ba693f08e7b1ca7a0e06f9c33c63bc6280007b/pyinstaller-6.21.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:42395ec76df8e8120c36b13339d9db8cab83e316a12839ee303cc00fc941bb74", size = 753779 }, + { url = "https://files.pythonhosted.org/packages/c9/76/1ce8a27ce62ba8cf3a87c9ce6d575610f4e55d7cb0123e7512fc3f4b921a/pyinstaller-6.21.0-py3-none-win32.whl", hash = "sha256:c6b28d30d8fd99ce162ff3aab5013ed44dbfb747566b1f01b9bed7964d7c14e9", size = 1336462 }, + { url = "https://files.pythonhosted.org/packages/c1/fa/ca1d7e5257dd8566a9dfc0dfb02f8a8075eeb53d4b2d3c579f1276759042/pyinstaller-6.21.0-py3-none-win_amd64.whl", hash = "sha256:7fae06c494ce0ebfe6bd3055c0e409def884f63af2e3705d06bd431ad9237fc7", size = 1397487 }, + { url = "https://files.pythonhosted.org/packages/dc/75/21b51523ce8d96629b71311775a0a65f5f5a872124ab0de33e5c848f8bff/pyinstaller-6.21.0-py3-none-win_arm64.whl", hash = "sha256:f13c95c9c03fb567217135919f93815c305813126780b0ed6e0123cb8acaf025", size = 1346094 }, ] [[package]] name = "pyinstaller-hooks-contrib" version = "2026.6" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/5b/c9fe0db5e83ee1c39b2258fa21d23b15e1a60786b6c5990ee5074ead8bb6/pyinstaller_hooks_contrib-2026.6.tar.gz", hash = "sha256:bef5002c32f4f50bd55b005da12cff64eca8783e7eaf86a06a62410164bab725", size = 173354, upload-time = "2026-06-08T22:37:16.152Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/5b/c9fe0db5e83ee1c39b2258fa21d23b15e1a60786b6c5990ee5074ead8bb6/pyinstaller_hooks_contrib-2026.6.tar.gz", hash = "sha256:bef5002c32f4f50bd55b005da12cff64eca8783e7eaf86a06a62410164bab725", size = 173354 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/31/f2d7343d8ed5f7c4678377886f6ce533e6eaaa131b252ce950114c2a7efa/pyinstaller_hooks_contrib-2026.6-py3-none-any.whl", hash = "sha256:fd13b8ac126b35361175edacd41a0d97080b75dd5f4b594ecefefff969509dd3", size = 457159, upload-time = "2026-06-08T22:37:14.722Z" }, + { url = "https://files.pythonhosted.org/packages/e7/31/f2d7343d8ed5f7c4678377886f6ce533e6eaaa131b252ce950114c2a7efa/pyinstaller_hooks_contrib-2026.6-py3-none-any.whl", hash = "sha256:fd13b8ac126b35361175edacd41a0d97080b75dd5f4b594ecefefff969509dd3", size = 457159 }, ] [[package]] name = "pyinstrument" version = "5.1.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/32/7f/d3c4ef7c43f3294bd5a475dfa6f295a9fee5243c292d5c8122044fa83bcb/pyinstrument-5.1.2.tar.gz", hash = "sha256:af149d672da9493fa37334a1cc68f7b80c3e6cb9fd99b9e426c447db5c650bf0", size = 266889, upload-time = "2026-01-04T18:38:58.464Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/32/7f/d3c4ef7c43f3294bd5a475dfa6f295a9fee5243c292d5c8122044fa83bcb/pyinstrument-5.1.2.tar.gz", hash = "sha256:af149d672da9493fa37334a1cc68f7b80c3e6cb9fd99b9e426c447db5c650bf0", size = 266889 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b4/8e/b9aea969eec67c129652000446384d550a0df45c297adc9fd74da2f8482c/pyinstrument-5.1.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7b8bab2334bf1d4c9e92d61db574300b914b594588a6b6dd67c45450152dfc29", size = 131418, upload-time = "2026-01-04T18:37:58.642Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/62/76418eb29b5591f3e5500369a6777ce928135c3aa6ccdb0c861a9c6ca93b/pyinstrument-5.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:13dcc138a61298ef4994b7aebff509d2c06db89dfd6e2021f0b9cd96aaa44ec3", size = 124448, upload-time = "2026-01-04T18:37:59.95Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/73/874bccc04bcf6f4babc3de1a9568e209e7e40998563974f5030b0fb4d3e0/pyinstrument-5.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8abd4a7ffa2e7f9e00039a5e549e8eebc80d7ca8d43f0fb51a50ff2b117ce4a", size = 149853, upload-time = "2026-01-04T18:38:01.405Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cf/85/268446c4388d77ff4abdeaff202356e1527b3ff9576f5587443a24980bec/pyinstrument-5.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb3a05108edebc30f31e2c69c904576042f1158b2513ab80adc08f7848a7a8f0", size = 148641, upload-time = "2026-01-04T18:38:03.086Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/15/4f8dea3381483e68d00582a9b823a21a088acfe77a847a7991a1a8feed76/pyinstrument-5.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f70d588b53f3f35829d1d1ddfa05e07fcebf1434b3b1509d542ca317d8e9a2a5", size = 148674, upload-time = "2026-01-04T18:38:04.805Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/61/72c180454b6511d5b90166f8828e1bab3b45d0489952a1fe48c5c585233d/pyinstrument-5.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b007327e0d6a6a01d5064883dd27c19996f044ce7488d507826fee7884e6a32e", size = 148315, upload-time = "2026-01-04T18:38:06.114Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/f0/4c27cebddf22a8840bd8b419366bb321ce41f921ca1893e309c932ab28bf/pyinstrument-5.1.2-cp313-cp313-win32.whl", hash = "sha256:9ba0e6b17a7e86c3dc02d208e4c25506e8f914d9964ae89449f1f37f0b70abc0", size = 125926, upload-time = "2026-01-04T18:38:07.507Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/20/6b1bee88ddef065b0df3a3ba4ba60ed8a9ca443d5cded7152a8a9750914f/pyinstrument-5.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:660d7fc486a839814db0b2f716bc13d8b99b9c780aaeb47f74a70a34adc02a7b", size = 126678, upload-time = "2026-01-04T18:38:08.826Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8e/b9aea969eec67c129652000446384d550a0df45c297adc9fd74da2f8482c/pyinstrument-5.1.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7b8bab2334bf1d4c9e92d61db574300b914b594588a6b6dd67c45450152dfc29", size = 131418 }, + { url = "https://files.pythonhosted.org/packages/8f/62/76418eb29b5591f3e5500369a6777ce928135c3aa6ccdb0c861a9c6ca93b/pyinstrument-5.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:13dcc138a61298ef4994b7aebff509d2c06db89dfd6e2021f0b9cd96aaa44ec3", size = 124448 }, + { url = "https://files.pythonhosted.org/packages/07/73/874bccc04bcf6f4babc3de1a9568e209e7e40998563974f5030b0fb4d3e0/pyinstrument-5.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8abd4a7ffa2e7f9e00039a5e549e8eebc80d7ca8d43f0fb51a50ff2b117ce4a", size = 149853 }, + { url = "https://files.pythonhosted.org/packages/cf/85/268446c4388d77ff4abdeaff202356e1527b3ff9576f5587443a24980bec/pyinstrument-5.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb3a05108edebc30f31e2c69c904576042f1158b2513ab80adc08f7848a7a8f0", size = 148641 }, + { url = "https://files.pythonhosted.org/packages/fc/15/4f8dea3381483e68d00582a9b823a21a088acfe77a847a7991a1a8feed76/pyinstrument-5.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f70d588b53f3f35829d1d1ddfa05e07fcebf1434b3b1509d542ca317d8e9a2a5", size = 148674 }, + { url = "https://files.pythonhosted.org/packages/fa/61/72c180454b6511d5b90166f8828e1bab3b45d0489952a1fe48c5c585233d/pyinstrument-5.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b007327e0d6a6a01d5064883dd27c19996f044ce7488d507826fee7884e6a32e", size = 148315 }, + { url = "https://files.pythonhosted.org/packages/2c/f0/4c27cebddf22a8840bd8b419366bb321ce41f921ca1893e309c932ab28bf/pyinstrument-5.1.2-cp313-cp313-win32.whl", hash = "sha256:9ba0e6b17a7e86c3dc02d208e4c25506e8f914d9964ae89449f1f37f0b70abc0", size = 125926 }, + { url = "https://files.pythonhosted.org/packages/6c/20/6b1bee88ddef065b0df3a3ba4ba60ed8a9ca443d5cded7152a8a9750914f/pyinstrument-5.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:660d7fc486a839814db0b2f716bc13d8b99b9c780aaeb47f74a70a34adc02a7b", size = 126678 }, ] [[package]] name = "pyjwt" version = "2.13.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515, upload-time = "2026-05-21T19:54:36.618Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274, upload-time = "2026-05-21T19:54:35.362Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274 }, ] [package.optional-dependencies] @@ -4112,66 +3815,66 @@ crypto = [ [[package]] name = "pymdown-extensions" version = "11.0.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/a9/5f0c535ba3b08fe09270c16808e053a968868242ecbd5676d4e3a488bf28/pymdown_extensions-11.0.1.tar.gz", hash = "sha256:dd2905ae6fc5b75582fafb139a1266ffc754705efa902aa50067fa7ff4f94ec0", size = 857113, upload-time = "2026-07-02T17:59:22.955Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/a9/5f0c535ba3b08fe09270c16808e053a968868242ecbd5676d4e3a488bf28/pymdown_extensions-11.0.1.tar.gz", hash = "sha256:dd2905ae6fc5b75582fafb139a1266ffc754705efa902aa50067fa7ff4f94ec0", size = 857113 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/54/da572c98c0b77626a91b5d3b89f0231d8bff5125c225420908632f8b342d/pymdown_extensions-11.0.1-py3-none-any.whl", hash = "sha256:db3943a62bab7e03af1364f0c4083e64b91fb097675a4b6cceccfbe9a77e5eb2", size = 269455, upload-time = "2026-07-02T17:59:21.271Z" }, + { url = "https://files.pythonhosted.org/packages/d6/54/da572c98c0b77626a91b5d3b89f0231d8bff5125c225420908632f8b342d/pymdown_extensions-11.0.1-py3-none-any.whl", hash = "sha256:db3943a62bab7e03af1364f0c4083e64b91fb097675a4b6cceccfbe9a77e5eb2", size = 269455 }, ] [[package]] name = "pypdf" version = "6.14.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/72/7dfd5ff1c9c37de97a731701f51af091325f123d9d4270361c9c69e4431f/pypdf-6.14.2.tar.gz", hash = "sha256:7873f502fe4385e79539b21d872392dc0c4e3714327c15881cbc7fbfd1f95b25", size = 6491182, upload-time = "2026-06-23T14:18:30.859Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/72/7dfd5ff1c9c37de97a731701f51af091325f123d9d4270361c9c69e4431f/pypdf-6.14.2.tar.gz", hash = "sha256:7873f502fe4385e79539b21d872392dc0c4e3714327c15881cbc7fbfd1f95b25", size = 6491182 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/e6/136aa8993a2ae7214e0b0ef2edaa0d2e08d1d4e4982635b08a835ff31ec8/pypdf-6.14.2-py3-none-any.whl", hash = "sha256:3f07891af76dc002657e04993ab9b4de81de29f9013b9761d0b7968bff12e946", size = 349514, upload-time = "2026-06-23T14:18:28.867Z" }, + { url = "https://files.pythonhosted.org/packages/49/e6/136aa8993a2ae7214e0b0ef2edaa0d2e08d1d4e4982635b08a835ff31ec8/pypdf-6.14.2-py3-none-any.whl", hash = "sha256:3f07891af76dc002657e04993ab9b4de81de29f9013b9761d0b7968bff12e946", size = 349514 }, ] [[package]] name = "pyperclip" version = "1.11.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/52/d87eba7cb129b81563019d1679026e7a112ef76855d6159d24754dbd2a51/pyperclip-1.11.0.tar.gz", hash = "sha256:244035963e4428530d9e3a6101a1ef97209c6825edab1567beac148ccc1db1b6", size = 12185, upload-time = "2025-09-26T14:40:37.245Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/52/d87eba7cb129b81563019d1679026e7a112ef76855d6159d24754dbd2a51/pyperclip-1.11.0.tar.gz", hash = "sha256:244035963e4428530d9e3a6101a1ef97209c6825edab1567beac148ccc1db1b6", size = 12185 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/80/fc9d01d5ed37ba4c42ca2b55b4339ae6e200b456be3a1aaddf4a9fa99b8c/pyperclip-1.11.0-py3-none-any.whl", hash = "sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273", size = 11063, upload-time = "2025-09-26T14:40:36.069Z" }, + { url = "https://files.pythonhosted.org/packages/df/80/fc9d01d5ed37ba4c42ca2b55b4339ae6e200b456be3a1aaddf4a9fa99b8c/pyperclip-1.11.0-py3-none-any.whl", hash = "sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273", size = 11063 }, ] [[package]] name = "pyproject-hooks" version = "1.2.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216 }, ] [[package]] name = "pyreadline3" version = "3.5.6" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b6/6d/f94028646d7bbe6d9d873c47ee7c246f2d29129d253f0d96cb6fcab70733/pyreadline3-3.5.6.tar.gz", hash = "sha256:61e53218b99656091ddb077df9e71f25850e72e030b6183b39c9b7e6e4f4a9bf", size = 100368, upload-time = "2026-05-14T17:55:04.471Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/6d/f94028646d7bbe6d9d873c47ee7c246f2d29129d253f0d96cb6fcab70733/pyreadline3-3.5.6.tar.gz", hash = "sha256:61e53218b99656091ddb077df9e71f25850e72e030b6183b39c9b7e6e4f4a9bf", size = 100368 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/5e/35c856e186b74678c24927847ad9895a51f1bc02a0c6126477a6c6040064/pyreadline3-3.5.6-py3-none-any.whl", hash = "sha256:8449b734232e42a5dcd74048e39b60db2839a4c38cf3ae2bf7707d58b5389c0d", size = 85243, upload-time = "2026-05-14T17:55:03.262Z" }, + { url = "https://files.pythonhosted.org/packages/f7/5e/35c856e186b74678c24927847ad9895a51f1bc02a0c6126477a6c6040064/pyreadline3-3.5.6-py3-none-any.whl", hash = "sha256:8449b734232e42a5dcd74048e39b60db2839a4c38cf3ae2bf7707d58b5389c0d", size = 85243 }, ] [[package]] name = "pysher" version = "1.0.8" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, { name = "websocket-client" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/a0/d0638470df605ce266991fb04f74c69ab1bed3b90ac3838e9c3c8b69b66a/Pysher-1.0.8.tar.gz", hash = "sha256:7849c56032b208e49df67d7bd8d49029a69042ab0bb45b2ed59fa08f11ac5988", size = 9071, upload-time = "2022-10-10T13:41:09.936Z" } +sdist = { url = "https://files.pythonhosted.org/packages/12/a0/d0638470df605ce266991fb04f74c69ab1bed3b90ac3838e9c3c8b69b66a/Pysher-1.0.8.tar.gz", hash = "sha256:7849c56032b208e49df67d7bd8d49029a69042ab0bb45b2ed59fa08f11ac5988", size = 9071 } [[package]] name = "pytest" version = "9.1.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "iniconfig" }, @@ -4179,162 +3882,162 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536 }, ] [[package]] name = "pytest-asyncio" version = "1.4.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", size = 58514, upload-time = "2026-05-26T09:56:04.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", size = 58514 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/e2/08a497ef684b88559c9cc5f4ad53a37e7b99e727094a86d6ea32536d5d3c/pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1", size = 16930, upload-time = "2026-05-26T09:56:02.576Z" }, + { url = "https://files.pythonhosted.org/packages/03/e2/08a497ef684b88559c9cc5f4ad53a37e7b99e727094a86d6ea32536d5d3c/pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1", size = 16930 }, ] [[package]] name = "pytest-cov" version = "7.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage" }, { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876 }, ] [[package]] name = "pytest-docker" version = "3.2.5" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "pytest" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/05/b7e47dc3e01b505838372e296bd780180b3b699a9a134bb8d6be85f3d567/pytest_docker-3.2.5.tar.gz", hash = "sha256:c9662567522911280b394af4da2edd57facaf644494601fac962ff1e396d7ab6", size = 13717, upload-time = "2025-11-12T13:42:19.641Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/05/b7e47dc3e01b505838372e296bd780180b3b699a9a134bb8d6be85f3d567/pytest_docker-3.2.5.tar.gz", hash = "sha256:c9662567522911280b394af4da2edd57facaf644494601fac962ff1e396d7ab6", size = 13717 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9f/e4/3a76a393f808edb0ee08ecc25e5c00bce0522a45b8fcf8693ec9441739c8/pytest_docker-3.2.5-py3-none-any.whl", hash = "sha256:79f3d209f928f45d4385cb825944861bc8a8cccd309804d9c9cd63bcef03edba", size = 8724, upload-time = "2025-11-12T13:42:18.631Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e4/3a76a393f808edb0ee08ecc25e5c00bce0522a45b8fcf8693ec9441739c8/pytest_docker-3.2.5-py3-none-any.whl", hash = "sha256:79f3d209f928f45d4385cb825944861bc8a8cccd309804d9c9cd63bcef03edba", size = 8724 }, ] [[package]] name = "pytest-recording" version = "0.13.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, { name = "vcrpy" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/32/9c/f4027c5f1693847b06d11caf4b4f6bb09f22c1581ada4663877ec166b8c6/pytest_recording-0.13.4.tar.gz", hash = "sha256:568d64b2a85992eec4ae0a419c855d5fd96782c5fb016784d86f18053792768c", size = 26576, upload-time = "2025-05-08T10:41:11.231Z" } +sdist = { url = "https://files.pythonhosted.org/packages/32/9c/f4027c5f1693847b06d11caf4b4f6bb09f22c1581ada4663877ec166b8c6/pytest_recording-0.13.4.tar.gz", hash = "sha256:568d64b2a85992eec4ae0a419c855d5fd96782c5fb016784d86f18053792768c", size = 26576 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/c2/ce34735972cc42d912173e79f200fe66530225190c06655c5632a9d88f1e/pytest_recording-0.13.4-py3-none-any.whl", hash = "sha256:ad49a434b51b1c4f78e85b1e6b74fdcc2a0a581ca16e52c798c6ace971f7f439", size = 13723, upload-time = "2025-05-08T10:41:09.684Z" }, + { url = "https://files.pythonhosted.org/packages/42/c2/ce34735972cc42d912173e79f200fe66530225190c06655c5632a9d88f1e/pytest_recording-0.13.4-py3-none-any.whl", hash = "sha256:ad49a434b51b1c4f78e85b1e6b74fdcc2a0a581ca16e52c798c6ace971f7f439", size = 13723 }, ] [[package]] name = "pytest-rerunfailures" version = "16.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "pytest" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/60/a90ca1cc6cffcb97b4260ed0ad2b7934b999d7c48abe4ea0840344862a3b/pytest_rerunfailures-16.4.tar.gz", hash = "sha256:8222d17c37eb7b9e4d6fc96a3c724ff4e1a5c97a5cc7cbb2c19e9282cfd21a11", size = 36635, upload-time = "2026-07-01T06:30:56.813Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/60/a90ca1cc6cffcb97b4260ed0ad2b7934b999d7c48abe4ea0840344862a3b/pytest_rerunfailures-16.4.tar.gz", hash = "sha256:8222d17c37eb7b9e4d6fc96a3c724ff4e1a5c97a5cc7cbb2c19e9282cfd21a11", size = 36635 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/93/3cdcc4033444e822e01b573414b03fd37fd5533070c750477b8f5fa5224b/pytest_rerunfailures-16.4-py3-none-any.whl", hash = "sha256:f69b5beb39622c90d1e44bd945d826eff6db545dcf0b68f52b7e4ad15eaf6d6c", size = 16955, upload-time = "2026-07-01T06:30:55.333Z" }, + { url = "https://files.pythonhosted.org/packages/ce/93/3cdcc4033444e822e01b573414b03fd37fd5533070c750477b8f5fa5224b/pytest_rerunfailures-16.4-py3-none-any.whl", hash = "sha256:f69b5beb39622c90d1e44bd945d826eff6db545dcf0b68f52b7e4ad15eaf6d6c", size = 16955 }, ] [[package]] name = "pytest-timeout" version = "2.4.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ac/82/4c9ecabab13363e72d880f2fb504c5f750433b2b6f16e99f4ec21ada284c/pytest_timeout-2.4.0.tar.gz", hash = "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a", size = 17973, upload-time = "2025-05-05T19:44:34.99Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/82/4c9ecabab13363e72d880f2fb504c5f750433b2b6f16e99f4ec21ada284c/pytest_timeout-2.4.0.tar.gz", hash = "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a", size = 17973 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl", hash = "sha256:c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2", size = 14382, upload-time = "2025-05-05T19:44:33.502Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl", hash = "sha256:c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2", size = 14382 }, ] [[package]] name = "pytest-xdist" version = "3.8.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "execnet" }, { name = "pytest" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload-time = "2025-07-01T13:30:59.346Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" }, + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396 }, ] [[package]] name = "python-dateutil" version = "2.9.0.post0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, ] [[package]] name = "python-dotenv" version = "1.2.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101 }, ] [[package]] name = "python-json-logger" version = "4.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/ff/3cc9165fd44106973cd7ac9facb674a65ed853494592541d339bdc9a30eb/python_json_logger-4.1.0.tar.gz", hash = "sha256:b396b9e3ed782b09ff9d6e4f1683d46c83ad0d35d2e407c09a9ebbf038f88195", size = 17573, upload-time = "2026-03-29T04:39:56.805Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/ff/3cc9165fd44106973cd7ac9facb674a65ed853494592541d339bdc9a30eb/python_json_logger-4.1.0.tar.gz", hash = "sha256:b396b9e3ed782b09ff9d6e4f1683d46c83ad0d35d2e407c09a9ebbf038f88195", size = 17573 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl", hash = "sha256:132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2", size = 15021, upload-time = "2026-03-29T04:39:55.266Z" }, + { url = "https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl", hash = "sha256:132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2", size = 15021 }, ] [[package]] name = "python-multipart" version = "0.0.32" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/42/55c32bb9b12693c092ad250a0e82edb5b31ddeda6eb772de5f308b3804ad/python_multipart-0.0.32.tar.gz", hash = "sha256:be54b7f3fa167bb83e4fcd936b887b708f4e57fe75911c02aebf53efaf8d938e", size = 46881, upload-time = "2026-06-04T16:18:58.647Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/42/55c32bb9b12693c092ad250a0e82edb5b31ddeda6eb772de5f308b3804ad/python_multipart-0.0.32.tar.gz", hash = "sha256:be54b7f3fa167bb83e4fcd936b887b708f4e57fe75911c02aebf53efaf8d938e", size = 46881 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/04/e8135ebd1ad02c56ec633277529b2602ff99ff634be76cdba5744cf554fd/python_multipart-0.0.32-py3-none-any.whl", hash = "sha256:ff6d3f776f16878c894e52e107296ffc890e913c611b1a4ec6c44e2821fe2e23", size = 30042, upload-time = "2026-06-04T16:18:57.319Z" }, + { url = "https://files.pythonhosted.org/packages/e1/04/e8135ebd1ad02c56ec633277529b2602ff99ff634be76cdba5744cf554fd/python_multipart-0.0.32-py3-none-any.whl", hash = "sha256:ff6d3f776f16878c894e52e107296ffc890e913c611b1a4ec6c44e2821fe2e23", size = 30042 }, ] [[package]] name = "python-slugify" version = "8.0.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "text-unidecode" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload-time = "2024-02-08T18:32:45.488Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/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" }, + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051 }, ] [[package]] name = "python-telegram-bot" version = "22.8" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/77/153517bb1ac1bba670c6fb1dbf09e1fd0730494b1705934e715391413a0d/python_telegram_bot-22.8.tar.gz", hash = "sha256:f9d3847fcb23ee603477e442800b33bb4adf851a73e0619d2050be879decf1ef", size = 1551700, upload-time = "2026-06-12T08:10:29.1Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/77/153517bb1ac1bba670c6fb1dbf09e1fd0730494b1705934e715391413a0d/python_telegram_bot-22.8.tar.gz", hash = "sha256:f9d3847fcb23ee603477e442800b33bb4adf851a73e0619d2050be879decf1ef", size = 1551700 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/7c/ed7d4dd94280bd434173cae9f7a7aedaaab9af128ae4f494423a5687c820/python_telegram_bot-22.8-py3-none-any.whl", hash = "sha256:42373918097f1b837cc4e717d588c19ea79651497ec712bb5b0c76e5e63c50e1", size = 769397, upload-time = "2026-06-12T08:10:27.066Z" }, + { url = "https://files.pythonhosted.org/packages/60/7c/ed7d4dd94280bd434173cae9f7a7aedaaab9af128ae4f494423a5687c820/python_telegram_bot-22.8-py3-none-any.whl", hash = "sha256:42373918097f1b837cc4e717d588c19ea79651497ec712bb5b0c76e5e63c50e1", size = 769397 }, ] [package.optional-dependencies] @@ -4345,359 +4048,359 @@ socks = [ [[package]] name = "pytokens" version = "0.4.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" }, + { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720 }, + { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204 }, + { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423 }, + { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859 }, + { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520 }, + { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729 }, ] [[package]] name = "pytz" version = "2026.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" }, + { url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141 }, ] [[package]] name = "pywin32" version = "312" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/41/12fbfd7f36ed2146d8bc9de96c2741296bf0d490b98508496cff322e274c/pywin32-312-cp313-cp313-win32.whl", hash = "sha256:7a27df850933d16a8eabfbaeb73d52b273e2da667f80d70b01a89d1f6828d02c", size = 6370184, upload-time = "2026-06-04T07:49:36.253Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/db/36a78e3403099d31d9746d13fdcde5accc43c1155f375a34d15983a479a7/pywin32-312-cp313-cp313-win_amd64.whl", hash = "sha256:c53e878d15a1c44788082bfe712a905433473aa38f86375b7cf8b45e3acbaaf9", size = 6914298, upload-time = "2026-06-04T07:49:38.876Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/84/37/c1697194092b76de9ed47ca124323f02c57ffc8a45c06f88a3d5acaf01eb/pywin32-312-cp313-cp313-win_arm64.whl", hash = "sha256:59aba5d5940842075343a5ddc6b11f1cdf0d1567fe745290359dfbcc7c2eb831", size = 6727640, upload-time = "2026-06-04T07:49:41.083Z" }, + { url = "https://files.pythonhosted.org/packages/2d/41/12fbfd7f36ed2146d8bc9de96c2741296bf0d490b98508496cff322e274c/pywin32-312-cp313-cp313-win32.whl", hash = "sha256:7a27df850933d16a8eabfbaeb73d52b273e2da667f80d70b01a89d1f6828d02c", size = 6370184 }, + { url = "https://files.pythonhosted.org/packages/ba/db/36a78e3403099d31d9746d13fdcde5accc43c1155f375a34d15983a479a7/pywin32-312-cp313-cp313-win_amd64.whl", hash = "sha256:c53e878d15a1c44788082bfe712a905433473aa38f86375b7cf8b45e3acbaaf9", size = 6914298 }, + { url = "https://files.pythonhosted.org/packages/84/37/c1697194092b76de9ed47ca124323f02c57ffc8a45c06f88a3d5acaf01eb/pywin32-312-cp313-cp313-win_arm64.whl", hash = "sha256:59aba5d5940842075343a5ddc6b11f1cdf0d1567fe745290359dfbcc7c2eb831", size = 6727640 }, ] [[package]] name = "pywin32-ctypes" version = "0.2.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756 }, ] [[package]] name = "pyyaml" version = "6.0.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669 }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252 }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081 }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159 }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626 }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613 }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115 }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427 }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090 }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246 }, ] [[package]] name = "pyyaml-env-tag" version = "1.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722 }, ] [[package]] name = "pyyaml-include" version = "2.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fsspec" }, { name = "pyyaml" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/8c/4bdc1bd9676e9eb49237b3750562e9794b7585281448909fa1837c92ca27/pyyaml_include-2.2.tar.gz", hash = "sha256:6f0c7e2ac56cdd9cc305b04122817b55514e6ce8584869fae2bc2a4ef2e0d40f", size = 29854, upload-time = "2024-11-09T09:36:16.915Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/8c/4bdc1bd9676e9eb49237b3750562e9794b7585281448909fa1837c92ca27/pyyaml_include-2.2.tar.gz", hash = "sha256:6f0c7e2ac56cdd9cc305b04122817b55514e6ce8584869fae2bc2a4ef2e0d40f", size = 29854 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/56/1f/ae83ff547e70cd3aeefe2ebaeeef41c4e1fd5ed2453396d249d17c3a7ead/pyyaml_include-2.2-py3-none-any.whl", hash = "sha256:489fff69f78bad8b9509d006297a0140fd91382a66775b8b1da0ce7e126c1815", size = 29565, upload-time = "2024-11-09T09:36:15.241Z" }, + { url = "https://files.pythonhosted.org/packages/56/1f/ae83ff547e70cd3aeefe2ebaeeef41c4e1fd5ed2453396d249d17c3a7ead/pyyaml_include-2.2-py3-none-any.whl", hash = "sha256:489fff69f78bad8b9509d006297a0140fd91382a66775b8b1da0ce7e126c1815", size = 29565 }, ] [[package]] name = "redis" version = "8.0.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cc/c3/928b290c2c0ca99ab96eea5b4ff8f30be8112b075301a7d3ba214a3c8c12/redis-8.0.1.tar.gz", hash = "sha256:afc5a7a2f5a084f5b1880dec548dd45be17db7e43c82a30d84f952aefb05cfb0", size = 5114170, upload-time = "2026-06-23T14:52:37.728Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/c3/928b290c2c0ca99ab96eea5b4ff8f30be8112b075301a7d3ba214a3c8c12/redis-8.0.1.tar.gz", hash = "sha256:afc5a7a2f5a084f5b1880dec548dd45be17db7e43c82a30d84f952aefb05cfb0", size = 5114170 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/0a/c2345ebf1ebe70840ce3f6c6ee612f8fa749cfbd1b03069c53bf0c62aaad/redis-8.0.1-py3-none-any.whl", hash = "sha256:47daa35a058c23468d6437f17a8c76882cb316b838ef763036af99b96cedd743", size = 502406, upload-time = "2026-06-23T14:52:36.137Z" }, + { url = "https://files.pythonhosted.org/packages/fd/0a/c2345ebf1ebe70840ce3f6c6ee612f8fa749cfbd1b03069c53bf0c62aaad/redis-8.0.1-py3-none-any.whl", hash = "sha256:47daa35a058c23468d6437f17a8c76882cb316b838ef763036af99b96cedd743", size = 502406 }, ] [[package]] name = "referencing" version = "0.37.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "rpds-py" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766 }, ] [[package]] name = "regex" version = "2026.7.19" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/20/98/04b13f1ddfb63158025291c02e03eb42fbb7acb51d091d541050eb4e35e8/regex-2026.7.19.tar.gz", hash = "sha256:7e77b324909c1617cbb4c668677e2c6ae13f44d7c1de0d4f15f2e3c10f3315b5", size = 416440, upload-time = "2026-07-19T00:19:48.923Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/3d/84165e4299ff76f3a40fe1f2abf939e976f693383a08d2beea6af62bd2c1/regex-2026.7.19-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f035d9dc1d25eff9d361456572231c7d27b5ccd473ca7dc0adfce732bd006d40", size = 496552, upload-time = "2026-07-19T00:17:36.808Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/a2/a65293e6e4cf28eb7ee1be5335a5386c40d6742e9f47fafc8fec785e16c7/regex-2026.7.19-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42572142ed0b9d5d261ba727157c426510da78e20828b66bbb855098b8a4e38", size = 296983, upload-time = "2026-07-19T00:17:38.816Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/47/2d0564e93d87bc48618360ddca232a2ca612bbdf53ce8465d45ca5ce14ee/regex-2026.7.19-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40b34dd88658e4fedd2fddbf0275ac970d00614b731357f425722a3ed1983d11", size = 291832, upload-time = "2026-07-19T00:17:40.726Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/cd/42dfbabff3dfc9603c501c0e2e2c5adbb09d127b267bf5348de0af338c15/regex-2026.7.19-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c41c63992bf1874cebb6e7f56fd7d3c007924659a604ae3d90e427d40d4fd13", size = 796775, upload-time = "2026-07-19T00:17:42.382Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/5d/f6a4839f2b934e3eed5973fd07f5929ee97d4c98939fb275ea23c274ee16/regex-2026.7.19-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d3372064506b94dd2c67c845f2db8062e9e9ba84d04e33cb96d7d33c11fe1ae", size = 865687, upload-time = "2026-07-19T00:17:44.185Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/14/b0/b47d6c36049bc59806a50bd4c86ced70bbe058d787f80281b1d7a9b0e024/regex-2026.7.19-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fce7760bf283405b2c7999cab3da4e72f7deca6396013115e3f7a955db9760da", size = 911962, upload-time = "2026-07-19T00:17:46.442Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/be/ff61f28f9273658cfe23acbbac5217221f6519960ed401e61dfdab12bc35/regex-2026.7.19-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0d702548d89d572b2929879bc883bb7a4c4709efafe4512cadee56c55c9bd15", size = 801817, upload-time = "2026-07-19T00:17:48.25Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c3/bb/8b4f7f26b333f9f79e1b453613c39bb4776f51d38ae66dd0ba31d6b354ca/regex-2026.7.19-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d446c6ac40bb6e05025ccee55b84d80fe9bf8e93010ffc4bb9484f13d498835f", size = 776908, upload-time = "2026-07-19T00:17:50.183Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/09/13/610110fc5921d380516d03c26b652555f08aa0d23ea78a771231873c3638/regex-2026.7.19-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4c3501bfa814ab07b5580741f9bf78dfdfe146a04057f82df9e2402d2a975939", size = 784426, upload-time = "2026-07-19T00:17:52.454Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/f5/1ef9e2a83a5947c57ebff0b377cb5727c3d5ec1992317a320d035cd0dbb6/regex-2026.7.19-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c4585c3e64b4f9e583b4d2683f18f5d5d872b3d71dcf24594b74ecc23602fa96", size = 860600, upload-time = "2026-07-19T00:17:54.229Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/02/073af33a3ec149241d11c80acea91e722aa0adbf05addd50f251c4fe89c3/regex-2026.7.19-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:571fde9741eb0ccde23dd4e0c1d50fbae910e901fa7e629faf39b2dda740d220", size = 765950, upload-time = "2026-07-19T00:17:56.041Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/a9/d1e9f819dc394a568ef370cd56cf25394e957a2235f8370f23b576e5a475/regex-2026.7.19-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:15b364b9b98d6d2fe1a85034c23a3180ff913f46caddc3895f6fd65186255ccc", size = 851794, upload-time = "2026-07-19T00:17:57.897Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/3a/8ae83eda7579feacdf984e71fb9e70635fb6f832eeddca58427ec4fca926/regex-2026.7.19-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffd8893ccc1c2fce6e0d6ca402d716fe1b29db70c7132609a05955e31b2aa8f2", size = 789845, upload-time = "2026-07-19T00:17:59.97Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4b/23/c195cbfe5a75fdec64d8f6554fd15237b837919d2c61bdc141d7c807b08b/regex-2026.7.19-cp313-cp313-win32.whl", hash = "sha256:f0fa4fa9c3632d708742baf2282f2055c11d888a790362670a403cbf48a2c404", size = 267135, upload-time = "2026-07-19T00:18:01.958Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/80/a11de8404b7272b70acb45c1c05987cce60b45d5693da2e176f0e390d564/regex-2026.7.19-cp313-cp313-win_amd64.whl", hash = "sha256:d51ffd3427640fa2da6ade574ceba932f210ad095f65fcc450a2b0a0d454868e", size = 277747, upload-time = "2026-07-19T00:18:04.121Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/29/0f5c8eff1b4f1f3d83276d365fccecf666afcc7d947420943bf394d07adb/regex-2026.7.19-cp313-cp313-win_arm64.whl", hash = "sha256:c670fe7be5b6020b76bc6e8d2196074657e1327595bca93a389e1a76ab130ad8", size = 277129, upload-time = "2026-07-19T00:18:05.821Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/4c/44b74742052cedda40f9ae469532a037112f7311a36669a891fba8984bb0/regex-2026.7.19-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db47b561c9afd884baa1f96f797c9ca369872c4b65912bc691cfa99e68340af2", size = 501134, upload-time = "2026-07-19T00:18:07.567Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/45/bbd038b5e39ee5613a5a689290145b40058cc152c41de9cc23639d2b9734/regex-2026.7.19-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65dcd28d3eba2ab7c2fd906485cc301392b47cc2234790d27d4e4814e02cdfda", size = 299418, upload-time = "2026-07-19T00:18:09.38Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/38/c5bde94b4cedfd5850d64c3f08222d8e1600e84f6ee71d9b44b4b8163f74/regex-2026.7.19-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f2e7f8e2ab6c2922be02c7ec45185aa5bd771e2e57b95455ee343a44d8130dff", size = 294486, upload-time = "2026-07-19T00:18:11.188Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d7/6a/2f5e107cb26c960b781967178899daf2787a7ab151844ed3c01d6fc95474/regex-2026.7.19-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe31f28c94402043161876a258a9c6f757cb485905c7614ce8d6cd40e6b7bdc1", size = 811643, upload-time = "2026-07-19T00:18:12.975Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/d4/a2f963406d7d73a62eed84ba05a258afb6cad1b21aa4517443ce40506b78/regex-2026.7.19-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f8f6fa298bb4f7f58a33334406218ba74716e68feddf5e4e54cd5d8082705abf", size = 871081, upload-time = "2026-07-19T00:18:14.733Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/a3/44be546340bedb15f13063f5e7fe16793ea4d9ea2e805d09bd174ac27724/regex-2026.7.19-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cc1b2440423a851fad781309dd87843868f4f66a6bcd1ddb9225cf4ec2c84732", size = 917372, upload-time = "2026-07-19T00:18:16.724Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/f6/e0870b0fd2a40dba0074e4b76e514b21313d37946c9248453e34ec43923e/regex-2026.7.19-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ac59a0900474a52b7c04af8196affc22bd9842acb0950df12f7b813e983609a", size = 816089, upload-time = "2026-07-19T00:18:18.617Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/27/957e8e22690ad6634572b39b71f130a6105f4d0718bb16849eac00fff147/regex-2026.7.19-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4896db1f4ce0576765b8272aa922df324e0f5b9bb2c3d03044ff32a7234a9aba", size = 785206, upload-time = "2026-07-19T00:18:20.464Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/a4/186e410941e731037c01166069ab86da9f65e8f8110c18009ccf4bd623ee/regex-2026.7.19-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4e6883a021db30511d9fb8cfb0f222ce1f2c369f7d4d8b0448f449a93ba0bdfc", size = 800431, upload-time = "2026-07-19T00:18:22.716Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/73/9f/e4e10e023d291d64a33e246610b724493bf1ce98e0e59c9b7c837e5acfb7/regex-2026.7.19-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:09523a592938aa9f587fb74467c63ff0cf88fc3df14c82ab0f0517dcf76aaa62", size = 864906, upload-time = "2026-07-19T00:18:24.772Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/57/ccb20b6be5f1f52a053d1ba2a8f7a077edb9d918248b8490d7506c6832b3/regex-2026.7.19-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:1ebac3474b8589fce2f9b225b650afd61448f7c73a5d0255a10cc6366471aed1", size = 773559, upload-time = "2026-07-19T00:18:27.008Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/82/f3b263cf8fad927dc102891da8502e718b7ff9d19af7a2a07c03865d7188/regex-2026.7.19-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4a0530bb1b8c1c985e7e2122e2b4d3aedd8a3c21c6bfddae6767c4405668b56e", size = 857739, upload-time = "2026-07-19T00:18:29.107Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/2e/1687bd1b6c2aed5e672ccf845fc11557821fe7366d921b50889ea5ce57bf/regex-2026.7.19-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2ef7eeb108c47ce7bcc9513e51bcb1bf57e8f483d52fce68a8642e3527141ae0", size = 804522, upload-time = "2026-07-19T00:18:31.362Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/7c/cc4e7655181b2d9235b704f2c5e19d8eff002bbc437bae59baee0e381aca/regex-2026.7.19-cp313-cp313t-win32.whl", hash = "sha256:64b6ca7391a1395c2638dd5c7456d67bea44fc6c5e8e92c5dc8aa6a8f23292b4", size = 269141, upload-time = "2026-07-19T00:18:33.479Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bb/14/961b4c7b05a2391c32dbc85e27773076671ef8f97f36cec70fe414734c02/regex-2026.7.19-cp313-cp313t-win_amd64.whl", hash = "sha256:f04b9f56b0e0614c0126be12c2c2d9f8850c1e57af302bd0a63bed379d4af974", size = 280036, upload-time = "2026-07-19T00:18:35.419Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/67/795644550d788ddbb6dc458c95895f8009978ea6d6ea76b005eb3f45e8c9/regex-2026.7.19-cp313-cp313t-win_arm64.whl", hash = "sha256:fcee38cd8e5089d6d4f048ba1233b3ad76e5954f545382180889112ff5cb712d", size = 279394, upload-time = "2026-07-19T00:18:37.454Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/98/04b13f1ddfb63158025291c02e03eb42fbb7acb51d091d541050eb4e35e8/regex-2026.7.19.tar.gz", hash = "sha256:7e77b324909c1617cbb4c668677e2c6ae13f44d7c1de0d4f15f2e3c10f3315b5", size = 416440 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/3d/84165e4299ff76f3a40fe1f2abf939e976f693383a08d2beea6af62bd2c1/regex-2026.7.19-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f035d9dc1d25eff9d361456572231c7d27b5ccd473ca7dc0adfce732bd006d40", size = 496552 }, + { url = "https://files.pythonhosted.org/packages/02/a2/a65293e6e4cf28eb7ee1be5335a5386c40d6742e9f47fafc8fec785e16c7/regex-2026.7.19-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42572142ed0b9d5d261ba727157c426510da78e20828b66bbb855098b8a4e38", size = 296983 }, + { url = "https://files.pythonhosted.org/packages/95/47/2d0564e93d87bc48618360ddca232a2ca612bbdf53ce8465d45ca5ce14ee/regex-2026.7.19-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40b34dd88658e4fedd2fddbf0275ac970d00614b731357f425722a3ed1983d11", size = 291832 }, + { url = "https://files.pythonhosted.org/packages/07/cd/42dfbabff3dfc9603c501c0e2e2c5adbb09d127b267bf5348de0af338c15/regex-2026.7.19-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c41c63992bf1874cebb6e7f56fd7d3c007924659a604ae3d90e427d40d4fd13", size = 796775 }, + { url = "https://files.pythonhosted.org/packages/df/5d/f6a4839f2b934e3eed5973fd07f5929ee97d4c98939fb275ea23c274ee16/regex-2026.7.19-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d3372064506b94dd2c67c845f2db8062e9e9ba84d04e33cb96d7d33c11fe1ae", size = 865687 }, + { url = "https://files.pythonhosted.org/packages/14/b0/b47d6c36049bc59806a50bd4c86ced70bbe058d787f80281b1d7a9b0e024/regex-2026.7.19-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fce7760bf283405b2c7999cab3da4e72f7deca6396013115e3f7a955db9760da", size = 911962 }, + { url = "https://files.pythonhosted.org/packages/2a/be/ff61f28f9273658cfe23acbbac5217221f6519960ed401e61dfdab12bc35/regex-2026.7.19-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0d702548d89d572b2929879bc883bb7a4c4709efafe4512cadee56c55c9bd15", size = 801817 }, + { url = "https://files.pythonhosted.org/packages/c3/bb/8b4f7f26b333f9f79e1b453613c39bb4776f51d38ae66dd0ba31d6b354ca/regex-2026.7.19-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d446c6ac40bb6e05025ccee55b84d80fe9bf8e93010ffc4bb9484f13d498835f", size = 776908 }, + { url = "https://files.pythonhosted.org/packages/09/13/610110fc5921d380516d03c26b652555f08aa0d23ea78a771231873c3638/regex-2026.7.19-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4c3501bfa814ab07b5580741f9bf78dfdfe146a04057f82df9e2402d2a975939", size = 784426 }, + { url = "https://files.pythonhosted.org/packages/ca/f5/1ef9e2a83a5947c57ebff0b377cb5727c3d5ec1992317a320d035cd0dbb6/regex-2026.7.19-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c4585c3e64b4f9e583b4d2683f18f5d5d872b3d71dcf24594b74ecc23602fa96", size = 860600 }, + { url = "https://files.pythonhosted.org/packages/a0/02/073af33a3ec149241d11c80acea91e722aa0adbf05addd50f251c4fe89c3/regex-2026.7.19-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:571fde9741eb0ccde23dd4e0c1d50fbae910e901fa7e629faf39b2dda740d220", size = 765950 }, + { url = "https://files.pythonhosted.org/packages/81/a9/d1e9f819dc394a568ef370cd56cf25394e957a2235f8370f23b576e5a475/regex-2026.7.19-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:15b364b9b98d6d2fe1a85034c23a3180ff913f46caddc3895f6fd65186255ccc", size = 851794 }, + { url = "https://files.pythonhosted.org/packages/03/3a/8ae83eda7579feacdf984e71fb9e70635fb6f832eeddca58427ec4fca926/regex-2026.7.19-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffd8893ccc1c2fce6e0d6ca402d716fe1b29db70c7132609a05955e31b2aa8f2", size = 789845 }, + { url = "https://files.pythonhosted.org/packages/4b/23/c195cbfe5a75fdec64d8f6554fd15237b837919d2c61bdc141d7c807b08b/regex-2026.7.19-cp313-cp313-win32.whl", hash = "sha256:f0fa4fa9c3632d708742baf2282f2055c11d888a790362670a403cbf48a2c404", size = 267135 }, + { url = "https://files.pythonhosted.org/packages/b2/80/a11de8404b7272b70acb45c1c05987cce60b45d5693da2e176f0e390d564/regex-2026.7.19-cp313-cp313-win_amd64.whl", hash = "sha256:d51ffd3427640fa2da6ade574ceba932f210ad095f65fcc450a2b0a0d454868e", size = 277747 }, + { url = "https://files.pythonhosted.org/packages/d1/29/0f5c8eff1b4f1f3d83276d365fccecf666afcc7d947420943bf394d07adb/regex-2026.7.19-cp313-cp313-win_arm64.whl", hash = "sha256:c670fe7be5b6020b76bc6e8d2196074657e1327595bca93a389e1a76ab130ad8", size = 277129 }, + { url = "https://files.pythonhosted.org/packages/dc/4c/44b74742052cedda40f9ae469532a037112f7311a36669a891fba8984bb0/regex-2026.7.19-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db47b561c9afd884baa1f96f797c9ca369872c4b65912bc691cfa99e68340af2", size = 501134 }, + { url = "https://files.pythonhosted.org/packages/f0/45/bbd038b5e39ee5613a5a689290145b40058cc152c41de9cc23639d2b9734/regex-2026.7.19-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65dcd28d3eba2ab7c2fd906485cc301392b47cc2234790d27d4e4814e02cdfda", size = 299418 }, + { url = "https://files.pythonhosted.org/packages/65/38/c5bde94b4cedfd5850d64c3f08222d8e1600e84f6ee71d9b44b4b8163f74/regex-2026.7.19-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f2e7f8e2ab6c2922be02c7ec45185aa5bd771e2e57b95455ee343a44d8130dff", size = 294486 }, + { url = "https://files.pythonhosted.org/packages/d7/6a/2f5e107cb26c960b781967178899daf2787a7ab151844ed3c01d6fc95474/regex-2026.7.19-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe31f28c94402043161876a258a9c6f757cb485905c7614ce8d6cd40e6b7bdc1", size = 811643 }, + { url = "https://files.pythonhosted.org/packages/37/d4/a2f963406d7d73a62eed84ba05a258afb6cad1b21aa4517443ce40506b78/regex-2026.7.19-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f8f6fa298bb4f7f58a33334406218ba74716e68feddf5e4e54cd5d8082705abf", size = 871081 }, + { url = "https://files.pythonhosted.org/packages/45/a3/44be546340bedb15f13063f5e7fe16793ea4d9ea2e805d09bd174ac27724/regex-2026.7.19-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cc1b2440423a851fad781309dd87843868f4f66a6bcd1ddb9225cf4ec2c84732", size = 917372 }, + { url = "https://files.pythonhosted.org/packages/f8/f6/e0870b0fd2a40dba0074e4b76e514b21313d37946c9248453e34ec43923e/regex-2026.7.19-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ac59a0900474a52b7c04af8196affc22bd9842acb0950df12f7b813e983609a", size = 816089 }, + { url = "https://files.pythonhosted.org/packages/ae/27/957e8e22690ad6634572b39b71f130a6105f4d0718bb16849eac00fff147/regex-2026.7.19-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4896db1f4ce0576765b8272aa922df324e0f5b9bb2c3d03044ff32a7234a9aba", size = 785206 }, + { url = "https://files.pythonhosted.org/packages/76/a4/186e410941e731037c01166069ab86da9f65e8f8110c18009ccf4bd623ee/regex-2026.7.19-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4e6883a021db30511d9fb8cfb0f222ce1f2c369f7d4d8b0448f449a93ba0bdfc", size = 800431 }, + { url = "https://files.pythonhosted.org/packages/73/9f/e4e10e023d291d64a33e246610b724493bf1ce98e0e59c9b7c837e5acfb7/regex-2026.7.19-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:09523a592938aa9f587fb74467c63ff0cf88fc3df14c82ab0f0517dcf76aaa62", size = 864906 }, + { url = "https://files.pythonhosted.org/packages/24/57/ccb20b6be5f1f52a053d1ba2a8f7a077edb9d918248b8490d7506c6832b3/regex-2026.7.19-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:1ebac3474b8589fce2f9b225b650afd61448f7c73a5d0255a10cc6366471aed1", size = 773559 }, + { url = "https://files.pythonhosted.org/packages/a3/82/f3b263cf8fad927dc102891da8502e718b7ff9d19af7a2a07c03865d7188/regex-2026.7.19-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4a0530bb1b8c1c985e7e2122e2b4d3aedd8a3c21c6bfddae6767c4405668b56e", size = 857739 }, + { url = "https://files.pythonhosted.org/packages/47/2e/1687bd1b6c2aed5e672ccf845fc11557821fe7366d921b50889ea5ce57bf/regex-2026.7.19-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2ef7eeb108c47ce7bcc9513e51bcb1bf57e8f483d52fce68a8642e3527141ae0", size = 804522 }, + { url = "https://files.pythonhosted.org/packages/76/7c/cc4e7655181b2d9235b704f2c5e19d8eff002bbc437bae59baee0e381aca/regex-2026.7.19-cp313-cp313t-win32.whl", hash = "sha256:64b6ca7391a1395c2638dd5c7456d67bea44fc6c5e8e92c5dc8aa6a8f23292b4", size = 269141 }, + { url = "https://files.pythonhosted.org/packages/bb/14/961b4c7b05a2391c32dbc85e27773076671ef8f97f36cec70fe414734c02/regex-2026.7.19-cp313-cp313t-win_amd64.whl", hash = "sha256:f04b9f56b0e0614c0126be12c2c2d9f8850c1e57af302bd0a63bed379d4af974", size = 280036 }, + { url = "https://files.pythonhosted.org/packages/ce/67/795644550d788ddbb6dc458c95895f8009978ea6d6ea76b005eb3f45e8c9/regex-2026.7.19-cp313-cp313t-win_arm64.whl", hash = "sha256:fcee38cd8e5089d6d4f048ba1233b3ad76e5954f545382180889112ff5cb712d", size = 279394 }, ] [[package]] name = "regress" version = "2025.10.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/bf/faa406189856f9b566fa1c42d173188d3e86cd5116484a663922365e0004/regress-2025.10.1.tar.gz", hash = "sha256:dcc0a8af0cdbc3d6e0d4725f113335d0a5ffbba86ae3ca18d2b5b352c5f2c8ed", size = 11567, upload-time = "2025-10-09T07:09:48.397Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/bd/f7ff13577c688efec36488554489635c135ab7c2b3652c00aaa3d74bd761/regress-2025.10.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9100da34f69e18ad6d545f5d74f8ee729e42ce200a73752dd6d94f8a373d0e71", size = 445469, upload-time = "2025-10-09T07:08:16.825Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/3d/e8fc72e7424c168dfc4cdf3a864f189f6d3afbb6e3ed66455774d1f5e2ba/regress-2025.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e25096697b034848d8fc7910cdb38b7abc2bd2d7ade8767893359918ed4efd0", size = 434712, upload-time = "2025-10-09T07:08:17.817Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/d0/a18cc39008765d2b964bc2eba423416545d97b4f2623b99549c5e97e4d37/regress-2025.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4c40a8c9f3e0119d2384a52b55dcc770461e1ead6ae7b41314999223116a15", size = 514752, upload-time = "2025-10-09T07:08:19.148Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/11/57e64ba417867b39ad9ca55feaea80d3176735dba36e6a92ff21b8224fcb/regress-2025.10.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25d8518285aa3ce67ddbede90a1a9ca6a5d23a1b8275dd5a9722af0c64b37b2a", size = 497412, upload-time = "2025-10-09T07:08:20.448Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/6c/2fd3d3877c1957408548f7a380580f0b64ef8aff69f7fc2cc182a79b0b0b/regress-2025.10.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8051fac3696730bb84d7675c62c7073792a0e105233d4f8e1055f2cab9b04fce", size = 676998, upload-time = "2025-10-09T07:08:21.881Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/54/acde146473453f3acb5dd29e5be0fb627d87ad020ec5674ee133cde24261/regress-2025.10.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e337ce3b150ca0ff599b1150b995ff6a2e32b5940e17ac3f30a29133960709e", size = 576129, upload-time = "2025-10-09T07:08:23.354Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f2/b0/8007436b33496ec8f10d7b7a67a7a669569c82fc2a182d4f928ab4fd11da/regress-2025.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:290a15652c3fafe387db02061d4ed9a100804ed5a162d069b5a0ac28b5df162a", size = 507510, upload-time = "2025-10-09T07:08:24.34Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4a/9e/6ac6cd1de7e34e34cb492df627847de0d01cee982c7dd7d100e67cf1aa93/regress-2025.10.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b4bc2008b59e5124c1672d7fd9f203e5d4a4ff88ebaf4666e3281141e2d8db20", size = 520595, upload-time = "2025-10-09T07:08:25.35Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/26/35556d1dd6f64122a16166db7651d1a5804edebea9835cbcd452d9b7c2ff/regress-2025.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:56ef2f8ef9a102a7d42cbbc2f3c0c5e1b186bd8eaa78d564da566b0bf20653dc", size = 695584, upload-time = "2025-10-09T07:08:26.52Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/33/07650dfc042b55270fc269276112c592d458cdfb8d31c85447ff743dcf10/regress-2025.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0680ac0b0a0058acb55b64aa56956732cf56b0baa84ea95e3fa124ab16da58aa", size = 695277, upload-time = "2025-10-09T07:08:27.705Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/6b/80f446103df39fc1ce6e271e7c274687bb830402de23e68795ba2ab13214/regress-2025.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47c03bfd853651241fc11436fb14ef7c9b312bb9a9c2828aa5c93943e945f1ef", size = 690951, upload-time = "2025-10-09T07:08:29.295Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/10/43cd990934ddb2be3318380fa380f7ca19e0eda0c30793b73e8ab8839367/regress-2025.10.1-cp313-cp313-win32.whl", hash = "sha256:3d12e6a834ed5f6d9dc7e86ea8fd77d37bb13900129930151d87c3261c3a799e", size = 282592, upload-time = "2025-10-09T07:08:30.695Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ab/22/4855af0447c98793d3a406ddf42680736e700b8c78336d6199dff9a5fd1b/regress-2025.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:ee3b7325ea849097d674020c72b2e6deb8f1018f085a7ecbd22831cd217b7f80", size = 301551, upload-time = "2025-10-09T07:08:31.715Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/99/cd16dce5d1cb98970a8d7c577529e5890d938b54ade223d532fad0343221/regress-2025.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:e5f35e04fe6382c236d60c98b3f0a4a22dea75398b99c9c9bf3fb9d386cd7ebb", size = 288909, upload-time = "2025-10-09T07:08:32.605Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/32/35dbbdff29174dcc253bb00b2a0d2aaf3f47a2b1d174ab4ab828feca63f1/regress-2025.10.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:0ee12c4e1c4e6e3609f41dd58065bc241945e912772f7320238d6544f0745950", size = 444440, upload-time = "2025-10-09T07:08:33.635Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/1b/d97cf19b3de5ff8d78d03e0c470af48f7e8b6814b197014fda3f8a3aaca5/regress-2025.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:389c2278848cbfed81753a04ce8ea6c037271179cb9ef4decac7d3c65ae3330b", size = 434626, upload-time = "2025-10-09T07:08:34.75Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/f1/c0900448a4fd6248cd05c04c83aebb31f22ba3886965a5667f6ac4edc2b0/regress-2025.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf743b00cac20f8e8d271f275df7bc192ebb4faa7aee8fe98484df338786dec6", size = 514470, upload-time = "2025-10-09T07:08:35.75Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/a1/6346a314230af2859d2f0af5c4534ee497b9b13983ee06489652d7e1895b/regress-2025.10.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5541da1f581377bc20d2f77e017453aa8f2c2f4bfe7679dee00e139ec700abe8", size = 497546, upload-time = "2025-10-09T07:08:36.739Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/ff/09605137dff09594c9e12ce555a80d8405a6ad76faa1db702bfba57468d0/regress-2025.10.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a67216efa72bb27db170f637d67eb9acdc167da5d617163b057803de7aed1e6d", size = 676318, upload-time = "2025-10-09T07:08:37.72Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/37/4a65635c18844d687f9ad5bdd79b72fac8d15b131264616d6b1bb52614c2/regress-2025.10.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb61e653a325aea4681cf7b96ba9bbabc1aeb3f3d8fe877a07800024907398b9", size = 576190, upload-time = "2025-10-09T07:08:38.782Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/93/87/90a0a77a0416d7e3255e606f848021949b2f53ca18c9e4e240edb42e0929/regress-2025.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2a0a7da1d42fdff8068ab976a66beea572621514a130b37592489ae134a0e27", size = 507768, upload-time = "2025-10-09T07:08:39.797Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/62/82c8147027f0012dd7e743267d60dcf4218b2e061825b89cddddaa7fbe49/regress-2025.10.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:337ef62f785dc6e05c4a09be7a902980cf4d4f15346f4eca9eaf02745485440c", size = 520555, upload-time = "2025-10-09T07:08:40.801Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/09/ce/5dd5dda048173b644a475ae9f4643733b31c3543e861569af4257c60d32a/regress-2025.10.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:aaf5d102e05b109dde13363e705969b3ffdbbfeb880270187eed0871e75f0c8f", size = 695587, upload-time = "2025-10-09T07:08:42.136Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/08/7f6615d8ce3088feb82843ff4d48191600602d624021dbef797d274a043d/regress-2025.10.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:adf331c8938e0d8705fc5d05d08fab09c11cb4bcdf8a64fa21902972c4cd38f4", size = 694933, upload-time = "2025-10-09T07:08:43.171Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/87/94524b996745f892b30dec6e770701956f7125459c6a6b2c075af4b8f0a6/regress-2025.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:287f86b5c0bf3bc9c0abd45bf6745ba9c6a5624c3132b07631bac4403b45143f", size = 691029, upload-time = "2025-10-09T07:08:44.369Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/e1/612c3b8afa448747e9133a95b1e18d0ee8f3f5e930f7048d1af03976f883/regress-2025.10.1-cp313-cp313t-win32.whl", hash = "sha256:877e05e7c570ee1e077e8b587cca8a318b7675f3c94c6c4e25d0d145abf7c0b6", size = 282136, upload-time = "2025-10-09T07:08:45.477Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/1d/9d5a476a6b16a41e724e864afb834947323bfa4b309978dbdc2bf8dbdb02/regress-2025.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:97307f87b128389d8b3f385c8e431fc318263281d1a1c0394606bc813aea05fc", size = 301674, upload-time = "2025-10-09T07:08:46.513Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/bf/faa406189856f9b566fa1c42d173188d3e86cd5116484a663922365e0004/regress-2025.10.1.tar.gz", hash = "sha256:dcc0a8af0cdbc3d6e0d4725f113335d0a5ffbba86ae3ca18d2b5b352c5f2c8ed", size = 11567 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/bd/f7ff13577c688efec36488554489635c135ab7c2b3652c00aaa3d74bd761/regress-2025.10.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9100da34f69e18ad6d545f5d74f8ee729e42ce200a73752dd6d94f8a373d0e71", size = 445469 }, + { url = "https://files.pythonhosted.org/packages/89/3d/e8fc72e7424c168dfc4cdf3a864f189f6d3afbb6e3ed66455774d1f5e2ba/regress-2025.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e25096697b034848d8fc7910cdb38b7abc2bd2d7ade8767893359918ed4efd0", size = 434712 }, + { url = "https://files.pythonhosted.org/packages/63/d0/a18cc39008765d2b964bc2eba423416545d97b4f2623b99549c5e97e4d37/regress-2025.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4c40a8c9f3e0119d2384a52b55dcc770461e1ead6ae7b41314999223116a15", size = 514752 }, + { url = "https://files.pythonhosted.org/packages/0b/11/57e64ba417867b39ad9ca55feaea80d3176735dba36e6a92ff21b8224fcb/regress-2025.10.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25d8518285aa3ce67ddbede90a1a9ca6a5d23a1b8275dd5a9722af0c64b37b2a", size = 497412 }, + { url = "https://files.pythonhosted.org/packages/72/6c/2fd3d3877c1957408548f7a380580f0b64ef8aff69f7fc2cc182a79b0b0b/regress-2025.10.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8051fac3696730bb84d7675c62c7073792a0e105233d4f8e1055f2cab9b04fce", size = 676998 }, + { url = "https://files.pythonhosted.org/packages/cd/54/acde146473453f3acb5dd29e5be0fb627d87ad020ec5674ee133cde24261/regress-2025.10.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e337ce3b150ca0ff599b1150b995ff6a2e32b5940e17ac3f30a29133960709e", size = 576129 }, + { url = "https://files.pythonhosted.org/packages/f2/b0/8007436b33496ec8f10d7b7a67a7a669569c82fc2a182d4f928ab4fd11da/regress-2025.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:290a15652c3fafe387db02061d4ed9a100804ed5a162d069b5a0ac28b5df162a", size = 507510 }, + { url = "https://files.pythonhosted.org/packages/4a/9e/6ac6cd1de7e34e34cb492df627847de0d01cee982c7dd7d100e67cf1aa93/regress-2025.10.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b4bc2008b59e5124c1672d7fd9f203e5d4a4ff88ebaf4666e3281141e2d8db20", size = 520595 }, + { url = "https://files.pythonhosted.org/packages/11/26/35556d1dd6f64122a16166db7651d1a5804edebea9835cbcd452d9b7c2ff/regress-2025.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:56ef2f8ef9a102a7d42cbbc2f3c0c5e1b186bd8eaa78d564da566b0bf20653dc", size = 695584 }, + { url = "https://files.pythonhosted.org/packages/e9/33/07650dfc042b55270fc269276112c592d458cdfb8d31c85447ff743dcf10/regress-2025.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0680ac0b0a0058acb55b64aa56956732cf56b0baa84ea95e3fa124ab16da58aa", size = 695277 }, + { url = "https://files.pythonhosted.org/packages/6a/6b/80f446103df39fc1ce6e271e7c274687bb830402de23e68795ba2ab13214/regress-2025.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47c03bfd853651241fc11436fb14ef7c9b312bb9a9c2828aa5c93943e945f1ef", size = 690951 }, + { url = "https://files.pythonhosted.org/packages/b5/10/43cd990934ddb2be3318380fa380f7ca19e0eda0c30793b73e8ab8839367/regress-2025.10.1-cp313-cp313-win32.whl", hash = "sha256:3d12e6a834ed5f6d9dc7e86ea8fd77d37bb13900129930151d87c3261c3a799e", size = 282592 }, + { url = "https://files.pythonhosted.org/packages/ab/22/4855af0447c98793d3a406ddf42680736e700b8c78336d6199dff9a5fd1b/regress-2025.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:ee3b7325ea849097d674020c72b2e6deb8f1018f085a7ecbd22831cd217b7f80", size = 301551 }, + { url = "https://files.pythonhosted.org/packages/82/99/cd16dce5d1cb98970a8d7c577529e5890d938b54ade223d532fad0343221/regress-2025.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:e5f35e04fe6382c236d60c98b3f0a4a22dea75398b99c9c9bf3fb9d386cd7ebb", size = 288909 }, + { url = "https://files.pythonhosted.org/packages/a3/32/35dbbdff29174dcc253bb00b2a0d2aaf3f47a2b1d174ab4ab828feca63f1/regress-2025.10.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:0ee12c4e1c4e6e3609f41dd58065bc241945e912772f7320238d6544f0745950", size = 444440 }, + { url = "https://files.pythonhosted.org/packages/6f/1b/d97cf19b3de5ff8d78d03e0c470af48f7e8b6814b197014fda3f8a3aaca5/regress-2025.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:389c2278848cbfed81753a04ce8ea6c037271179cb9ef4decac7d3c65ae3330b", size = 434626 }, + { url = "https://files.pythonhosted.org/packages/04/f1/c0900448a4fd6248cd05c04c83aebb31f22ba3886965a5667f6ac4edc2b0/regress-2025.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf743b00cac20f8e8d271f275df7bc192ebb4faa7aee8fe98484df338786dec6", size = 514470 }, + { url = "https://files.pythonhosted.org/packages/11/a1/6346a314230af2859d2f0af5c4534ee497b9b13983ee06489652d7e1895b/regress-2025.10.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5541da1f581377bc20d2f77e017453aa8f2c2f4bfe7679dee00e139ec700abe8", size = 497546 }, + { url = "https://files.pythonhosted.org/packages/3d/ff/09605137dff09594c9e12ce555a80d8405a6ad76faa1db702bfba57468d0/regress-2025.10.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a67216efa72bb27db170f637d67eb9acdc167da5d617163b057803de7aed1e6d", size = 676318 }, + { url = "https://files.pythonhosted.org/packages/26/37/4a65635c18844d687f9ad5bdd79b72fac8d15b131264616d6b1bb52614c2/regress-2025.10.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb61e653a325aea4681cf7b96ba9bbabc1aeb3f3d8fe877a07800024907398b9", size = 576190 }, + { url = "https://files.pythonhosted.org/packages/93/87/90a0a77a0416d7e3255e606f848021949b2f53ca18c9e4e240edb42e0929/regress-2025.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2a0a7da1d42fdff8068ab976a66beea572621514a130b37592489ae134a0e27", size = 507768 }, + { url = "https://files.pythonhosted.org/packages/7d/62/82c8147027f0012dd7e743267d60dcf4218b2e061825b89cddddaa7fbe49/regress-2025.10.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:337ef62f785dc6e05c4a09be7a902980cf4d4f15346f4eca9eaf02745485440c", size = 520555 }, + { url = "https://files.pythonhosted.org/packages/09/ce/5dd5dda048173b644a475ae9f4643733b31c3543e861569af4257c60d32a/regress-2025.10.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:aaf5d102e05b109dde13363e705969b3ffdbbfeb880270187eed0871e75f0c8f", size = 695587 }, + { url = "https://files.pythonhosted.org/packages/9e/08/7f6615d8ce3088feb82843ff4d48191600602d624021dbef797d274a043d/regress-2025.10.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:adf331c8938e0d8705fc5d05d08fab09c11cb4bcdf8a64fa21902972c4cd38f4", size = 694933 }, + { url = "https://files.pythonhosted.org/packages/63/87/94524b996745f892b30dec6e770701956f7125459c6a6b2c075af4b8f0a6/regress-2025.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:287f86b5c0bf3bc9c0abd45bf6745ba9c6a5624c3132b07631bac4403b45143f", size = 691029 }, + { url = "https://files.pythonhosted.org/packages/64/e1/612c3b8afa448747e9133a95b1e18d0ee8f3f5e930f7048d1af03976f883/regress-2025.10.1-cp313-cp313t-win32.whl", hash = "sha256:877e05e7c570ee1e077e8b587cca8a318b7675f3c94c6c4e25d0d145abf7c0b6", size = 282136 }, + { url = "https://files.pythonhosted.org/packages/51/1d/9d5a476a6b16a41e724e864afb834947323bfa4b309978dbdc2bf8dbdb02/regress-2025.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:97307f87b128389d8b3f385c8e431fc318263281d1a1c0394606bc813aea05fc", size = 301674 }, ] [[package]] name = "requests" version = "2.34.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "charset-normalizer" }, { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075 }, ] [[package]] name = "requests-oauthlib" version = "2.0.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "oauthlib" }, { name = "requests" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload-time = "2024-03-22T20:32:29.939Z" } +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload-time = "2024-03-22T20:32:28.055Z" }, + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179 }, ] [[package]] name = "rfc3339-validator" version = "0.1.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" }, + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490 }, ] [[package]] name = "rich" version = "15.0.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654 }, ] [[package]] name = "rich-rst" version = "2.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments" }, { name = "rich" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/d6/d0b9fafc73b65767200da027acab1db1bdb1048f4fea5ebf659df01c700e/rich_rst-2.1.0.tar.gz", hash = "sha256:f4d117b49697f338769759fa5cacf5197da4888b347b9fda2e50aef5cd8d93bd", size = 302732, upload-time = "2026-07-05T02:59:44.308Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/d6/d0b9fafc73b65767200da027acab1db1bdb1048f4fea5ebf659df01c700e/rich_rst-2.1.0.tar.gz", hash = "sha256:f4d117b49697f338769759fa5cacf5197da4888b347b9fda2e50aef5cd8d93bd", size = 302732 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/68/1fc93dd759605b5d00fc98b50200739e41ed32bd22d6ba35ca6c3932371b/rich_rst-2.1.0-py3-none-any.whl", hash = "sha256:7ecd1343ee12c879d0e7ae74c3eb6d263b023d2929c6d114212eb1fd91057255", size = 272987, upload-time = "2026-07-05T02:59:42.792Z" }, + { url = "https://files.pythonhosted.org/packages/2a/68/1fc93dd759605b5d00fc98b50200739e41ed32bd22d6ba35ca6c3932371b/rich_rst-2.1.0-py3-none-any.whl", hash = "sha256:7ecd1343ee12c879d0e7ae74c3eb6d263b023d2929c6d114212eb1fd91057255", size = 272987 }, ] [[package]] name = "ripgrep-rs" version = "0.4.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/8c/de0b9456c057f56454a0269e536949405001ce97b96d18797c99ea724767/ripgrep_rs-0.4.2.tar.gz", hash = "sha256:a109ad6a59f83a3cd71b274a16d722637414feb6a43ab43764fafe65206e5795", size = 61127, upload-time = "2026-02-07T09:50:39.88Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/8c/de0b9456c057f56454a0269e536949405001ce97b96d18797c99ea724767/ripgrep_rs-0.4.2.tar.gz", hash = "sha256:a109ad6a59f83a3cd71b274a16d722637414feb6a43ab43764fafe65206e5795", size = 61127 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/32/4ac331c46b0cf3965c507b43e95802a709b41e8b5b07f033769d6d03c90b/ripgrep_rs-0.4.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:53127ef9b69a97f34fd2ba61810fa20e7ff98541c4adaa7b4d46cbbbb8163582", size = 1774241, upload-time = "2026-02-07T09:50:10.046Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/d4/dadfbcdf81393834889002e4ff2bcbb6218c90c154cf96693153ebe928ea/ripgrep_rs-0.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b50783ef15ec317f86049eea0fe33f8b277b89d0e3eff394300e3db9abc63d1f", size = 1728477, upload-time = "2026-02-07T09:50:11.856Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/1a/b8961b8bc0878883e0ca404345a81ae5c694ceeeda917f529bd76f77cb83/ripgrep_rs-0.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cba85d71eeaaef013687073035ee1347c10a017948091d2853cf47d13f310f2e", size = 1925332, upload-time = "2026-02-07T09:50:13.765Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/44/31/130c04ad66e09cdec9dc34af35910be75572cc8b257aeeae4fd9d3911061/ripgrep_rs-0.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8834718d3f0228d9d5bfd817bb2154f74891abc257553c6014117e9cfc374d1", size = 1932723, upload-time = "2026-02-07T09:50:15.159Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/63/1db6dbd943bf0110baa794e4c478d832afb740fecdd27f7800123fde081b/ripgrep_rs-0.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:fcde19c665343365625a790c81e33b9190cebe445af2135329eb243cda5aee33", size = 1583932, upload-time = "2026-02-07T09:50:16.513Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d7/c6/3e0c9cd1ffb98bf25c087db3e5d588f9a58b13b11b576dba5d6e4d2e2905/ripgrep_rs-0.4.2-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a78cee10e18ac93ecef63bd88267f0e193e73b31cb64ee3ec155885253221e26", size = 1774040, upload-time = "2026-02-07T09:50:17.904Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f5/5d/5f2fb2c148c37a848d16b3605366ff41662663d3d1c936c6a81ef952f9b6/ripgrep_rs-0.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:161592c6749d5ef04f8240e400ab2b4fe8087d0ee4f3199c30f17ee0ba73b284", size = 1727369, upload-time = "2026-02-07T09:50:19.705Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/73/4e/bf49e3ee7b0359abd1b99e0eac0b701d44cb0645df9eaa6e4ce9ee2761c9/ripgrep_rs-0.4.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5cf0c934f00d3acfb646509ae8ea9f9a12be6f85ba4deaae180e29ba7f9fe8c", size = 1926431, upload-time = "2026-02-07T09:50:21.485Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ab/ba/f4f5e2a1fd49da57cb07b752ab61e9ec8afcdff5af423a8c698fa64a523d/ripgrep_rs-0.4.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683138a58ca29641519f7932c8ca3bff6bf9a78b8744145f68299b3c818dab33", size = 1932875, upload-time = "2026-02-07T09:50:23.304Z" }, + { url = "https://files.pythonhosted.org/packages/10/32/4ac331c46b0cf3965c507b43e95802a709b41e8b5b07f033769d6d03c90b/ripgrep_rs-0.4.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:53127ef9b69a97f34fd2ba61810fa20e7ff98541c4adaa7b4d46cbbbb8163582", size = 1774241 }, + { url = "https://files.pythonhosted.org/packages/91/d4/dadfbcdf81393834889002e4ff2bcbb6218c90c154cf96693153ebe928ea/ripgrep_rs-0.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b50783ef15ec317f86049eea0fe33f8b277b89d0e3eff394300e3db9abc63d1f", size = 1728477 }, + { url = "https://files.pythonhosted.org/packages/05/1a/b8961b8bc0878883e0ca404345a81ae5c694ceeeda917f529bd76f77cb83/ripgrep_rs-0.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cba85d71eeaaef013687073035ee1347c10a017948091d2853cf47d13f310f2e", size = 1925332 }, + { url = "https://files.pythonhosted.org/packages/44/31/130c04ad66e09cdec9dc34af35910be75572cc8b257aeeae4fd9d3911061/ripgrep_rs-0.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8834718d3f0228d9d5bfd817bb2154f74891abc257553c6014117e9cfc374d1", size = 1932723 }, + { url = "https://files.pythonhosted.org/packages/4d/63/1db6dbd943bf0110baa794e4c478d832afb740fecdd27f7800123fde081b/ripgrep_rs-0.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:fcde19c665343365625a790c81e33b9190cebe445af2135329eb243cda5aee33", size = 1583932 }, + { url = "https://files.pythonhosted.org/packages/d7/c6/3e0c9cd1ffb98bf25c087db3e5d588f9a58b13b11b576dba5d6e4d2e2905/ripgrep_rs-0.4.2-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a78cee10e18ac93ecef63bd88267f0e193e73b31cb64ee3ec155885253221e26", size = 1774040 }, + { url = "https://files.pythonhosted.org/packages/f5/5d/5f2fb2c148c37a848d16b3605366ff41662663d3d1c936c6a81ef952f9b6/ripgrep_rs-0.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:161592c6749d5ef04f8240e400ab2b4fe8087d0ee4f3199c30f17ee0ba73b284", size = 1727369 }, + { url = "https://files.pythonhosted.org/packages/73/4e/bf49e3ee7b0359abd1b99e0eac0b701d44cb0645df9eaa6e4ce9ee2761c9/ripgrep_rs-0.4.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5cf0c934f00d3acfb646509ae8ea9f9a12be6f85ba4deaae180e29ba7f9fe8c", size = 1926431 }, + { url = "https://files.pythonhosted.org/packages/ab/ba/f4f5e2a1fd49da57cb07b752ab61e9ec8afcdff5af423a8c698fa64a523d/ripgrep_rs-0.4.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683138a58ca29641519f7932c8ca3bff6bf9a78b8744145f68299b3c818dab33", size = 1932875 }, ] [[package]] name = "rpds-py" version = "2026.6.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a4/9e/b818ee580026ec578138e961027a68820c40afeb1ec8f6819b54fb99e196/rpds_py-2026.6.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3cfe765c1da0072636ca06628261e0ea05688e160d5c8a03e0217c3854037223", size = 343012, upload-time = "2026-06-30T07:15:36.005Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/6b/686d9dc4359a8f163cfbbf89ee0b4e586431de22fe8248edb63a8cf50d49/rpds_py-2026.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4d78253f6996be4901669ad25319f842f740eccf4d58e3c7f3dd39e6dde1d8f", size = 338203, upload-time = "2026-06-30T07:15:37.462Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/9b/069aa329940f8207615e091f5eedbbd40e1e15eac68a0790fd05ccdf796c/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f45a148e28767bf343d33a684693c70e451c6f4c0e9904709a723fafbdfc1f", size = 367984, upload-time = "2026-06-30T07:15:39.008Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/14/db/34c203e4becff3703e4d3bc121842c00b8689197f398161203a880052f4e/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:842e7b070435622248c7a2c44ae53fa1440e073cc3023bc919fed570884097a7", size = 374815, upload-time = "2026-06-30T07:15:40.253Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/7d/8071067d2cc453d916ad836e828c943f575e8a44612537759002a1e07381/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8020133a74bd81b4572dd8e4be028a6b1ebcd70e6726edc3918008c08bee6ee6", size = 490545, upload-time = "2026-06-30T07:15:41.729Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/42/da06c5aa8f0484ff07f270787434204d9f4535e2f8c3b51ed402267e63c3/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdc7e35386f3847df728fbcb5e887e2d79c19e2fa1eba9e51b6621d23e3243af", size = 382828, upload-time = "2026-06-30T07:15:43.327Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/d7/fe978efc2ae50abe48eb7464668ea99f53c010c60aeebb7b35ad27f23661/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acac386b453c2516111b50985d60ce46e7fadb5ea71ae7b25f4c946935bf27cf", size = 365678, upload-time = "2026-06-30T07:15:44.992Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/9d/1d8922e1990b2a6eb532b6ff53d3e73d2b3bbffc84116c75826bee73dfc6/rpds_py-2026.6.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:425560c6fa0415f27261727bb20bd097568485e5eb0c121f1949417d1c516885", size = 377811, upload-time = "2026-06-30T07:15:46.523Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/3d/198dceafb4fb034a6a47347e1b0735d34e0bd4a50be4e898d408ee66cb14/rpds_py-2026.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a550fb4950a06dde3beb4721f5ad4b25bf4513784665b0a8522c792e2bd822a4", size = 395382, upload-time = "2026-06-30T07:15:47.955Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/f1/13968e49655d40b6b19d8b9140296bbc6f1d86b3f0f6c346cf9f1adddf4b/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f4bca01b63096f606e095734dd56e74e175f94cfbf24ff3d63281cec61f7bb7", size = 543832, upload-time = "2026-06-30T07:15:49.33Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ac/ab/289bcb1b90bd3e40a2900c561fa0e2087345ecbb094f0b870f2345142b7c/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ccffae9a092a00deb7efd545fe5e2c33c33b88e7c054337e9a74c179347d0b7d", size = 611011, upload-time = "2026-06-30T07:15:50.847Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/16/5043105e679436ccfbc8e5e0dd2d663ed18a8b8113515fd06a5e5d77c83e/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1cf01971c4f2c5553b772a542e4aaf191789cd331bc2cd4ff0e6e65ba49e1e97", size = 572431, upload-time = "2026-06-30T07:15:52.394Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/85/ed/adab103321c0a6565d5ae1c2998349bc3ee175b82ccc5ae8fc04cc413075/rpds_py-2026.6.3-cp313-cp313-win32.whl", hash = "sha256:8c3d1e9c15b9d51ca0391e13da1a25a0a4df3c58a37c9dc368e0736cf7f69df0", size = 201710, upload-time = "2026-06-30T07:15:53.894Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/ed/a03b09668e74e5dabbf2e211f6468e1820c0552f7b0500082da31841bf7b/rpds_py-2026.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:9250a9a0a6fd4648b3f868da8d91a4c52b5811a62df58e753d50ae4454a36f80", size = 219454, upload-time = "2026-06-30T07:15:55.25Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/17/b8642c12930b71bc2b25831f6708ccf0f75abcd11883932ec9ce54ba3a78/rpds_py-2026.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:900a67df3fd1660b035a4761c4ce73c382ea6b35f90f9863c36c6fd8bf8b09bb", size = 215063, upload-time = "2026-06-30T07:15:56.573Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/9e/b818ee580026ec578138e961027a68820c40afeb1ec8f6819b54fb99e196/rpds_py-2026.6.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3cfe765c1da0072636ca06628261e0ea05688e160d5c8a03e0217c3854037223", size = 343012 }, + { url = "https://files.pythonhosted.org/packages/f3/6b/686d9dc4359a8f163cfbbf89ee0b4e586431de22fe8248edb63a8cf50d49/rpds_py-2026.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4d78253f6996be4901669ad25319f842f740eccf4d58e3c7f3dd39e6dde1d8f", size = 338203 }, + { url = "https://files.pythonhosted.org/packages/9e/9b/069aa329940f8207615e091f5eedbbd40e1e15eac68a0790fd05ccdf796c/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f45a148e28767bf343d33a684693c70e451c6f4c0e9904709a723fafbdfc1f", size = 367984 }, + { url = "https://files.pythonhosted.org/packages/14/db/34c203e4becff3703e4d3bc121842c00b8689197f398161203a880052f4e/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:842e7b070435622248c7a2c44ae53fa1440e073cc3023bc919fed570884097a7", size = 374815 }, + { url = "https://files.pythonhosted.org/packages/ee/7d/8071067d2cc453d916ad836e828c943f575e8a44612537759002a1e07381/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8020133a74bd81b4572dd8e4be028a6b1ebcd70e6726edc3918008c08bee6ee6", size = 490545 }, + { url = "https://files.pythonhosted.org/packages/a3/42/da06c5aa8f0484ff07f270787434204d9f4535e2f8c3b51ed402267e63c3/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdc7e35386f3847df728fbcb5e887e2d79c19e2fa1eba9e51b6621d23e3243af", size = 382828 }, + { url = "https://files.pythonhosted.org/packages/57/d7/fe978efc2ae50abe48eb7464668ea99f53c010c60aeebb7b35ad27f23661/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acac386b453c2516111b50985d60ce46e7fadb5ea71ae7b25f4c946935bf27cf", size = 365678 }, + { url = "https://files.pythonhosted.org/packages/69/9d/1d8922e1990b2a6eb532b6ff53d3e73d2b3bbffc84116c75826bee73dfc6/rpds_py-2026.6.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:425560c6fa0415f27261727bb20bd097568485e5eb0c121f1949417d1c516885", size = 377811 }, + { url = "https://files.pythonhosted.org/packages/b1/3d/198dceafb4fb034a6a47347e1b0735d34e0bd4a50be4e898d408ee66cb14/rpds_py-2026.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a550fb4950a06dde3beb4721f5ad4b25bf4513784665b0a8522c792e2bd822a4", size = 395382 }, + { url = "https://files.pythonhosted.org/packages/1f/f1/13968e49655d40b6b19d8b9140296bbc6f1d86b3f0f6c346cf9f1adddf4b/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f4bca01b63096f606e095734dd56e74e175f94cfbf24ff3d63281cec61f7bb7", size = 543832 }, + { url = "https://files.pythonhosted.org/packages/ac/ab/289bcb1b90bd3e40a2900c561fa0e2087345ecbb094f0b870f2345142b7c/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ccffae9a092a00deb7efd545fe5e2c33c33b88e7c054337e9a74c179347d0b7d", size = 611011 }, + { url = "https://files.pythonhosted.org/packages/1e/16/5043105e679436ccfbc8e5e0dd2d663ed18a8b8113515fd06a5e5d77c83e/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1cf01971c4f2c5553b772a542e4aaf191789cd331bc2cd4ff0e6e65ba49e1e97", size = 572431 }, + { url = "https://files.pythonhosted.org/packages/85/ed/adab103321c0a6565d5ae1c2998349bc3ee175b82ccc5ae8fc04cc413075/rpds_py-2026.6.3-cp313-cp313-win32.whl", hash = "sha256:8c3d1e9c15b9d51ca0391e13da1a25a0a4df3c58a37c9dc368e0736cf7f69df0", size = 201710 }, + { url = "https://files.pythonhosted.org/packages/7b/ed/a03b09668e74e5dabbf2e211f6468e1820c0552f7b0500082da31841bf7b/rpds_py-2026.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:9250a9a0a6fd4648b3f868da8d91a4c52b5811a62df58e753d50ae4454a36f80", size = 219454 }, + { url = "https://files.pythonhosted.org/packages/27/17/b8642c12930b71bc2b25831f6708ccf0f75abcd11883932ec9ce54ba3a78/rpds_py-2026.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:900a67df3fd1660b035a4761c4ce73c382ea6b35f90f9863c36c6fd8bf8b09bb", size = 215063 }, ] [[package]] name = "ruamel-yaml" version = "0.19.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/3b/ebda527b56beb90cb7652cb1c7e4f91f48649fbcd8d2eb2fb6e77cd3329b/ruamel_yaml-0.19.1.tar.gz", hash = "sha256:53eb66cd27849eff968ebf8f0bf61f46cdac2da1d1f3576dd4ccee9b25c31993", size = 142709, upload-time = "2026-01-02T16:50:31.84Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/3b/ebda527b56beb90cb7652cb1c7e4f91f48649fbcd8d2eb2fb6e77cd3329b/ruamel_yaml-0.19.1.tar.gz", hash = "sha256:53eb66cd27849eff968ebf8f0bf61f46cdac2da1d1f3576dd4ccee9b25c31993", size = 142709 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/0c/51f6841f1d84f404f92463fc2b1ba0da357ca1e3db6b7fbda26956c3b82a/ruamel_yaml-0.19.1-py3-none-any.whl", hash = "sha256:27592957fedf6e0b62f281e96effd28043345e0e66001f97683aa9a40c667c93", size = 118102, upload-time = "2026-01-02T16:50:29.201Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0c/51f6841f1d84f404f92463fc2b1ba0da357ca1e3db6b7fbda26956c3b82a/ruamel_yaml-0.19.1-py3-none-any.whl", hash = "sha256:27592957fedf6e0b62f281e96effd28043345e0e66001f97683aa9a40c667c93", size = 118102 }, ] [[package]] name = "ruff" version = "0.16.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/94/1e5e4967626faf12fa56999cd6222dff6992ceb086ad7945756baf70c7a7/ruff-0.16.0.tar.gz", hash = "sha256:e460aafd5495ec89efaa6ced2e4a9a581116451e1c88b9d37ef497e0f8e93982", size = 4790557, upload-time = "2026-07-23T19:11:30.981Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4b/81/1c8818fee7ce1a04cd7d1b3172e0a8f8e4f1dc4feb7fc390e16daa8af323/ruff-0.16.0-py3-none-linux_armv6l.whl", hash = "sha256:e5115729eb08c585e5121978ba5d5b60caeae394ce21b9fb5e6cd33a1c6c9b1e", size = 10754633, upload-time = "2026-07-23T19:10:46.415Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/23/df/beaf59c09d68db84304d555f188b276a77132a5d5b0b67a5c762aa143628/ruff-0.16.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3c954b1d580bfa035b41654f7858cc7e71d5fc3ac5b723dd62bd9133830ed522", size = 10969164, upload-time = "2026-07-23T19:10:50.271Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/ce/741cd197496a1abbf51352710fd15ed995d2a2be87189c1da26a450d6e83/ruff-0.16.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e01c21d10eb1b29f47b7454e1f4056db9a3f0260c646aa88457c610291db9f81", size = 10488846, upload-time = "2026-07-23T19:10:52.639Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/52/2a/a2db8e88cade358f5cdcb05674a917751074109315d014eb6352d9a893f7/ruff-0.16.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e364e5ed22ed8dc05082fd78e35308618260907ac2d3c1d637b2e682415b6c9", size = 10889729, upload-time = "2026-07-23T19:10:54.89Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/65/62a771694ebd63029dc953e27dbad40e1588bd4860ff9fe881018fddaa49/ruff-0.16.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d327b8fc113a1d4421a04f3839d3752057c8dd1ee320223a6f3f52d04ada462a", size = 10568275, upload-time = "2026-07-23T19:10:56.993Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/e2/ced249fe8af5f086c5c58cc21cc3356d50f32f7401c5df87050c999620a7/ruff-0.16.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b50c55e263103586b3dcf5f73d479eb8cb5fdb6098fec59a62891dab653717", size = 11385112, upload-time = "2026-07-23T19:10:59.615Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/0b/05154977a8fd69eeb6c103271f55403bfd8711f5c0f8ed07489d95a504e7/ruff-0.16.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ff4a79ce3ec0172f3241943835de1c4cb4e2dcd07f0f8c2d02603dbbbee4b17", size = 12207008, upload-time = "2026-07-23T19:11:02.154Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/29/98225831a3a1eab0e02f4acc6ca6559a98611dcc68b6965ff4b7234627c1/ruff-0.16.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e95c448fca1fb2a18372a9440926c5a6ee789639bb975c72e7ae6d0b04218ab4", size = 11650842, upload-time = "2026-07-23T19:11:04.557Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/66/6bd3cf90500653d55dc0ffc8507aa8300bd49d0214b2e8cb4d3fef2943ba/ruff-0.16.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f11a8d11010301d0a398a2fdef67691feca7294da6aef55e2150e8fa2cd520b", size = 11400718, upload-time = "2026-07-23T19:11:09.233Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8e/a2/a54eb4eae05d66364050a5d3b8a9c5ef88196531b3cbe7109d873f87f819/ruff-0.16.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:48044c678e9cb8698246c99b14aaccfa6601dea7379eb48a6f8f73f7a6d86cd0", size = 11426177, upload-time = "2026-07-23T19:11:11.994Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/be/16e3eea4b2a478a496919f5e36f17c4559e54620bd3bbac5d6affa068006/ruff-0.16.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7aa0959bad8eb8bef50340154fc9b58678dae31fa4293afa38b44b6e552c0213", size = 10856126, upload-time = "2026-07-23T19:11:14.221Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/84/252eb8b868a16eec7257c14f504f77537e734b2d69c762e639e588e304a3/ruff-0.16.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:28ea2b7df8ebf7f9da6b7d47b230ab48f387c0a29be3b474c4d0740e197bb9af", size = 10571208, upload-time = "2026-07-23T19:11:16.378Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/09/817a482f542f7570cbb4554b26e896610c7114f539b1d9e2d2145bf6bef6/ruff-0.16.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:33a3dfac8c35f81498dea9181bccc2f4c4bc8f1521a1dd9406e77643e0f0fb09", size = 11063329, upload-time = "2026-07-23T19:11:19.173Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/23/9403c180ca1cb9b1f7335f5c3e5305c09d49ea5b345196682a36028bde4a/ruff-0.16.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a5237a0bda500d30d81b8e07a6973a5cbc772864cbf746ae2f4e8a2e01c9f4ed", size = 11489751, upload-time = "2026-07-23T19:11:21.74Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/1d/1b2ef7bcde851c78d7f17f1cca13fd6dc695fc4b3d6197941e72cae5b132/ruff-0.16.0-py3-none-win32.whl", hash = "sha256:7fab76fa065c873f41ff744347c6e77bcc3dfec4bcc754dc26b63d23c0f7f5fb", size = 10785885, upload-time = "2026-07-23T19:11:23.947Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/a3/d5e4ef7a56be3f928ffb90b94c25ba7d3cb9c7fe0736aeaaedf361770712/ruff-0.16.0-py3-none-win_amd64.whl", hash = "sha256:429c117f022bf481fabd9d551e7a3952b24c65e6ef44337ea09d90bebef14472", size = 11923141, upload-time = "2026-07-23T19:11:26.409Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/9a/8415f2657cbe200f41a4531ccededf135505a92d4a012229121f885b26f9/ruff-0.16.0-py3-none-win_arm64.whl", hash = "sha256:14296fedcd2705c77ab8235439278bbb38f285cf7da5528b00b3e330c3d4872d", size = 11273407, upload-time = "2026-07-23T19:11:28.705Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/94/1e5e4967626faf12fa56999cd6222dff6992ceb086ad7945756baf70c7a7/ruff-0.16.0.tar.gz", hash = "sha256:e460aafd5495ec89efaa6ced2e4a9a581116451e1c88b9d37ef497e0f8e93982", size = 4790557 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/81/1c8818fee7ce1a04cd7d1b3172e0a8f8e4f1dc4feb7fc390e16daa8af323/ruff-0.16.0-py3-none-linux_armv6l.whl", hash = "sha256:e5115729eb08c585e5121978ba5d5b60caeae394ce21b9fb5e6cd33a1c6c9b1e", size = 10754633 }, + { url = "https://files.pythonhosted.org/packages/23/df/beaf59c09d68db84304d555f188b276a77132a5d5b0b67a5c762aa143628/ruff-0.16.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3c954b1d580bfa035b41654f7858cc7e71d5fc3ac5b723dd62bd9133830ed522", size = 10969164 }, + { url = "https://files.pythonhosted.org/packages/42/ce/741cd197496a1abbf51352710fd15ed995d2a2be87189c1da26a450d6e83/ruff-0.16.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e01c21d10eb1b29f47b7454e1f4056db9a3f0260c646aa88457c610291db9f81", size = 10488846 }, + { url = "https://files.pythonhosted.org/packages/52/2a/a2db8e88cade358f5cdcb05674a917751074109315d014eb6352d9a893f7/ruff-0.16.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e364e5ed22ed8dc05082fd78e35308618260907ac2d3c1d637b2e682415b6c9", size = 10889729 }, + { url = "https://files.pythonhosted.org/packages/42/65/62a771694ebd63029dc953e27dbad40e1588bd4860ff9fe881018fddaa49/ruff-0.16.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d327b8fc113a1d4421a04f3839d3752057c8dd1ee320223a6f3f52d04ada462a", size = 10568275 }, + { url = "https://files.pythonhosted.org/packages/3f/e2/ced249fe8af5f086c5c58cc21cc3356d50f32f7401c5df87050c999620a7/ruff-0.16.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b50c55e263103586b3dcf5f73d479eb8cb5fdb6098fec59a62891dab653717", size = 11385112 }, + { url = "https://files.pythonhosted.org/packages/87/0b/05154977a8fd69eeb6c103271f55403bfd8711f5c0f8ed07489d95a504e7/ruff-0.16.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ff4a79ce3ec0172f3241943835de1c4cb4e2dcd07f0f8c2d02603dbbbee4b17", size = 12207008 }, + { url = "https://files.pythonhosted.org/packages/fb/29/98225831a3a1eab0e02f4acc6ca6559a98611dcc68b6965ff4b7234627c1/ruff-0.16.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e95c448fca1fb2a18372a9440926c5a6ee789639bb975c72e7ae6d0b04218ab4", size = 11650842 }, + { url = "https://files.pythonhosted.org/packages/91/66/6bd3cf90500653d55dc0ffc8507aa8300bd49d0214b2e8cb4d3fef2943ba/ruff-0.16.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f11a8d11010301d0a398a2fdef67691feca7294da6aef55e2150e8fa2cd520b", size = 11400718 }, + { url = "https://files.pythonhosted.org/packages/8e/a2/a54eb4eae05d66364050a5d3b8a9c5ef88196531b3cbe7109d873f87f819/ruff-0.16.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:48044c678e9cb8698246c99b14aaccfa6601dea7379eb48a6f8f73f7a6d86cd0", size = 11426177 }, + { url = "https://files.pythonhosted.org/packages/1a/be/16e3eea4b2a478a496919f5e36f17c4559e54620bd3bbac5d6affa068006/ruff-0.16.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7aa0959bad8eb8bef50340154fc9b58678dae31fa4293afa38b44b6e552c0213", size = 10856126 }, + { url = "https://files.pythonhosted.org/packages/a2/84/252eb8b868a16eec7257c14f504f77537e734b2d69c762e639e588e304a3/ruff-0.16.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:28ea2b7df8ebf7f9da6b7d47b230ab48f387c0a29be3b474c4d0740e197bb9af", size = 10571208 }, + { url = "https://files.pythonhosted.org/packages/21/09/817a482f542f7570cbb4554b26e896610c7114f539b1d9e2d2145bf6bef6/ruff-0.16.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:33a3dfac8c35f81498dea9181bccc2f4c4bc8f1521a1dd9406e77643e0f0fb09", size = 11063329 }, + { url = "https://files.pythonhosted.org/packages/2e/23/9403c180ca1cb9b1f7335f5c3e5305c09d49ea5b345196682a36028bde4a/ruff-0.16.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a5237a0bda500d30d81b8e07a6973a5cbc772864cbf746ae2f4e8a2e01c9f4ed", size = 11489751 }, + { url = "https://files.pythonhosted.org/packages/b2/1d/1b2ef7bcde851c78d7f17f1cca13fd6dc695fc4b3d6197941e72cae5b132/ruff-0.16.0-py3-none-win32.whl", hash = "sha256:7fab76fa065c873f41ff744347c6e77bcc3dfec4bcc754dc26b63d23c0f7f5fb", size = 10785885 }, + { url = "https://files.pythonhosted.org/packages/b2/a3/d5e4ef7a56be3f928ffb90b94c25ba7d3cb9c7fe0736aeaaedf361770712/ruff-0.16.0-py3-none-win_amd64.whl", hash = "sha256:429c117f022bf481fabd9d551e7a3952b24c65e6ef44337ea09d90bebef14472", size = 11923141 }, + { url = "https://files.pythonhosted.org/packages/cb/9a/8415f2657cbe200f41a4531ccededf135505a92d4a012229121f885b26f9/ruff-0.16.0-py3-none-win_arm64.whl", hash = "sha256:14296fedcd2705c77ab8235439278bbb38f285cf7da5528b00b3e330c3d4872d", size = 11273407 }, ] [[package]] name = "rustworkx" version = "0.18.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/1a/545aa3a3e251e9da00e4acf0e5472b7fbbb15360f56d9d5342c1f93b8b93/rustworkx-0.18.0.tar.gz", hash = "sha256:5ca9cf8dbee50f8def012119ebb64771ae86916993417415aba9e845831cb436", size = 894567, upload-time = "2026-06-18T04:38:56.141Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/1a/545aa3a3e251e9da00e4acf0e5472b7fbbb15360f56d9d5342c1f93b8b93/rustworkx-0.18.0.tar.gz", hash = "sha256:5ca9cf8dbee50f8def012119ebb64771ae86916993417415aba9e845831cb436", size = 894567 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/70/18b310752b0652d4a755b46853268c00c33401101a47f87697ad25966453/rustworkx-0.18.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7440ba70b87bd16811d92e57d76108840dbdd89aa2fc55e4d324fa2fb6b7f9c9", size = 2295936, upload-time = "2026-06-18T04:38:01.598Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/4e/09152f4422204f020346a8a2b0e2f05f12d8cc60eeeee99b24f649985514/rustworkx-0.18.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:7fce5218ebfb8d8f5313def1f15aad8d3c3c2bbe03e33805dff8cf8bb70370a1", size = 2145057, upload-time = "2026-06-18T04:38:03.253Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/68/69198f41f7f9c39fb5b2e561bf41d4cbd117fa5dfdf4631d8ba28e5ff69b/rustworkx-0.18.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7e0c626f76bc71d414a02502be7ec0ac2dd6eca369886bc66a2650607f2d9de6", size = 2391659, upload-time = "2026-06-18T04:38:04.942Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/81/8ac568efe0289b0ecd826cd697c3581b6a25e134145926cbfef762656167/rustworkx-0.18.0-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:91b37c5bb54e233e16c4f47383385f17be03e6a344821c2f6a39a0aebee54538", size = 2189469, upload-time = "2026-06-18T04:38:06.51Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f2/a4/96492d7af2ddcd15368f80329e3514060b122f306c4406fac98c08a97865/rustworkx-0.18.0-cp310-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:bcd15f7a637ca0654f329ed42a6db0cf7eac15ed89e0b32cb9d16b1b21937979", size = 2504116, upload-time = "2026-06-18T04:38:43.441Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/b0/005383bd7dc110b06ca731bd2115482f3a8c6389e0c8fe1f7f259380c4c8/rustworkx-0.18.0-cp310-abi3-manylinux_2_28_s390x.whl", hash = "sha256:567ace3b0d8ac709dc4ad4ce164472f5f59508739355221480170327a6736777", size = 3170967, upload-time = "2026-06-18T04:38:39.929Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/2f/95ca9ef9285cc6793b3e041efca6c5a194ca6731b0af732631ee074a67b3/rustworkx-0.18.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b91cdcffeab5f498de44905a373e47e345da8f6c4f40fc969421548c4e7a5219", size = 2254008, upload-time = "2026-06-18T04:38:08.245Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/7b/9df6a80162e6f90fd9945e3f8063c2aa41285c27aefce1d171f99c2b829f/rustworkx-0.18.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:03dd1ab42974bc0ff957eccc330c0c0d9887d88240c0cd050039e215af5a3c45", size = 2447140, upload-time = "2026-06-18T04:38:09.767Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/b3/4d159b33bbc73dbebad050a0226dcfb0753d7f05fa55a8d5351e85c8c953/rustworkx-0.18.0-cp310-abi3-win32.whl", hash = "sha256:eb87a45864ffe36e4d86e826d12bb54dac9e4f76c214997dee624281d8711684", size = 2057237, upload-time = "2026-06-18T04:38:11.28Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/1b/b0dc8d3751c0c58d16db72bff2954a9d3871c166147007590a3aaec4d42e/rustworkx-0.18.0-cp310-abi3-win_amd64.whl", hash = "sha256:602df896b4479b83c6456f702f8ba2ac1cbb972b30723d5fe2e84e6ff3de7d70", size = 2289224, upload-time = "2026-06-18T04:38:12.961Z" }, + { url = "https://files.pythonhosted.org/packages/2a/70/18b310752b0652d4a755b46853268c00c33401101a47f87697ad25966453/rustworkx-0.18.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7440ba70b87bd16811d92e57d76108840dbdd89aa2fc55e4d324fa2fb6b7f9c9", size = 2295936 }, + { url = "https://files.pythonhosted.org/packages/02/4e/09152f4422204f020346a8a2b0e2f05f12d8cc60eeeee99b24f649985514/rustworkx-0.18.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:7fce5218ebfb8d8f5313def1f15aad8d3c3c2bbe03e33805dff8cf8bb70370a1", size = 2145057 }, + { url = "https://files.pythonhosted.org/packages/22/68/69198f41f7f9c39fb5b2e561bf41d4cbd117fa5dfdf4631d8ba28e5ff69b/rustworkx-0.18.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7e0c626f76bc71d414a02502be7ec0ac2dd6eca369886bc66a2650607f2d9de6", size = 2391659 }, + { url = "https://files.pythonhosted.org/packages/e1/81/8ac568efe0289b0ecd826cd697c3581b6a25e134145926cbfef762656167/rustworkx-0.18.0-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:91b37c5bb54e233e16c4f47383385f17be03e6a344821c2f6a39a0aebee54538", size = 2189469 }, + { url = "https://files.pythonhosted.org/packages/f2/a4/96492d7af2ddcd15368f80329e3514060b122f306c4406fac98c08a97865/rustworkx-0.18.0-cp310-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:bcd15f7a637ca0654f329ed42a6db0cf7eac15ed89e0b32cb9d16b1b21937979", size = 2504116 }, + { url = "https://files.pythonhosted.org/packages/4d/b0/005383bd7dc110b06ca731bd2115482f3a8c6389e0c8fe1f7f259380c4c8/rustworkx-0.18.0-cp310-abi3-manylinux_2_28_s390x.whl", hash = "sha256:567ace3b0d8ac709dc4ad4ce164472f5f59508739355221480170327a6736777", size = 3170967 }, + { url = "https://files.pythonhosted.org/packages/0d/2f/95ca9ef9285cc6793b3e041efca6c5a194ca6731b0af732631ee074a67b3/rustworkx-0.18.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b91cdcffeab5f498de44905a373e47e345da8f6c4f40fc969421548c4e7a5219", size = 2254008 }, + { url = "https://files.pythonhosted.org/packages/19/7b/9df6a80162e6f90fd9945e3f8063c2aa41285c27aefce1d171f99c2b829f/rustworkx-0.18.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:03dd1ab42974bc0ff957eccc330c0c0d9887d88240c0cd050039e215af5a3c45", size = 2447140 }, + { url = "https://files.pythonhosted.org/packages/5d/b3/4d159b33bbc73dbebad050a0226dcfb0753d7f05fa55a8d5351e85c8c953/rustworkx-0.18.0-cp310-abi3-win32.whl", hash = "sha256:eb87a45864ffe36e4d86e826d12bb54dac9e4f76c214997dee624281d8711684", size = 2057237 }, + { url = "https://files.pythonhosted.org/packages/99/1b/b0dc8d3751c0c58d16db72bff2954a9d3871c166147007590a3aaec4d42e/rustworkx-0.18.0-cp310-abi3-win_amd64.whl", hash = "sha256:602df896b4479b83c6456f702f8ba2ac1cbb972b30723d5fe2e84e6ff3de7d70", size = 2289224 }, ] [[package]] name = "schemez" version = "2.2.29" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docstring-parser" }, { name = "griffelib" }, { name = "pydantic" }, { name = "universal-pathlib" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/f9/394ef53eca56a08448feebd4645fc1f10719e9286faaaf19b02277ec03be/schemez-2.2.29.tar.gz", hash = "sha256:801fd18eeda003c061f43d1d8943fe206fd3d64dc2da0531bda49334c9056579", size = 76147, upload-time = "2026-03-16T01:02:52.627Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/f9/394ef53eca56a08448feebd4645fc1f10719e9286faaaf19b02277ec03be/schemez-2.2.29.tar.gz", hash = "sha256:801fd18eeda003c061f43d1d8943fe206fd3d64dc2da0531bda49334c9056579", size = 76147 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d8/97/086c3f07ba3a0bbe13e553e59666bba49e7393f3a9cb451e6dc3867c2ea8/schemez-2.2.29-py3-none-any.whl", hash = "sha256:7517451ee5c0a8d3b3ebcd5327622ac3c8e9b09e3f7fad476c5ffd9e78f16d47", size = 94033, upload-time = "2026-03-16T01:02:51.055Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/086c3f07ba3a0bbe13e553e59666bba49e7393f3a9cb451e6dc3867c2ea8/schemez-2.2.29-py3-none-any.whl", hash = "sha256:7517451ee5c0a8d3b3ebcd5327622ac3c8e9b09e3f7fad476c5ffd9e78f16d47", size = 94033 }, ] [package.optional-dependencies] @@ -4708,16 +4411,16 @@ codegen = [ [[package]] name = "searchly" version = "2.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyenv", extra = ["httpx"] }, { name = "pydantic" }, { name = "schemez" }, { name = "universal-pathlib" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/99/adf947a5815289e0aea96080e2714b31212331701647cc8a12789ffd91cf/searchly-2.1.0.tar.gz", hash = "sha256:63b861aecfb2938b5484a4566eeb4e8909cd6b8ea468d80490af69bbd490fe7c", size = 17852, upload-time = "2026-01-04T06:50:14.096Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/99/adf947a5815289e0aea96080e2714b31212331701647cc8a12789ffd91cf/searchly-2.1.0.tar.gz", hash = "sha256:63b861aecfb2938b5484a4566eeb4e8909cd6b8ea468d80490af69bbd490fe7c", size = 17852 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/69/02d619394e196cc4b57b841790f769c6fcf2050ad0249880a0e1b9064ab6/searchly-2.1.0-py3-none-any.whl", hash = "sha256:70272f8e7e6c08ffd6ac2963e9c7aba6769afe97295b1030fe88abc8cea6c310", size = 32982, upload-time = "2026-01-04T06:50:15.455Z" }, + { url = "https://files.pythonhosted.org/packages/67/69/02d619394e196cc4b57b841790f769c6fcf2050ad0249880a0e1b9064ab6/searchly-2.1.0-py3-none-any.whl", hash = "sha256:70272f8e7e6c08ffd6ac2963e9c7aba6769afe97295b1030fe88abc8cea6c310", size = 32982 }, ] [package.optional-dependencies] @@ -4730,157 +4433,157 @@ all = [ [[package]] name = "secretstorage" version = "3.5.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography" }, - { name = "jeepney" }, + { name = "cryptography", marker = "sys_platform != 'win32'" }, + { name = "jeepney", marker = "sys_platform != 'win32'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, + { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554 }, ] [[package]] name = "semver" version = "3.0.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/d1/d3159231aec234a59dd7d601e9dd9fe96f3afff15efd33c1070019b26132/semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602", size = 269730, upload-time = "2025-01-24T13:19:27.617Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/d1/d3159231aec234a59dd7d601e9dd9fe96f3afff15efd33c1070019b26132/semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602", size = 269730 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/24/4d91e05817e92e3a61c8a21e08fd0f390f5301f1c448b137c57c4bc6e543/semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746", size = 17912, upload-time = "2025-01-24T13:19:24.949Z" }, + { url = "https://files.pythonhosted.org/packages/a6/24/4d91e05817e92e3a61c8a21e08fd0f390f5301f1c448b137c57c4bc6e543/semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746", size = 17912 }, ] [[package]] name = "setuptools" version = "83.0.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090 }, ] [[package]] name = "shellingham" version = "1.5.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, ] [[package]] name = "six" version = "1.17.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, ] [[package]] name = "slack-sdk" version = "3.43.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/75/a4964eb771a0c74d79ee7a3bee6fb5d9718909dd1b675e80d62a6a0ad90a/slack_sdk-3.43.0.tar.gz", hash = "sha256:0553152e46c4259eb69f7464cdadc35ba4802ca10f9f5a849c92cf03d6c2ba07", size = 252769, upload-time = "2026-06-30T18:04:41.59Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/75/a4964eb771a0c74d79ee7a3bee6fb5d9718909dd1b675e80d62a6a0ad90a/slack_sdk-3.43.0.tar.gz", hash = "sha256:0553152e46c4259eb69f7464cdadc35ba4802ca10f9f5a849c92cf03d6c2ba07", size = 252769 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/55/42141b8338d46323d5b3c6095201b044c670c20f898643b322ea9b1543a1/slack_sdk-3.43.0-py2.py3-none-any.whl", hash = "sha256:4b6557c65577fc172f685af218b811f9f3b4909e24cddd839ada09565f10c585", size = 315866, upload-time = "2026-06-30T18:04:39.636Z" }, + { url = "https://files.pythonhosted.org/packages/e4/55/42141b8338d46323d5b3c6095201b044c670c20f898643b322ea9b1543a1/slack_sdk-3.43.0-py2.py3-none-any.whl", hash = "sha256:4b6557c65577fc172f685af218b811f9f3b4909e24cddd839ada09565f10c585", size = 315866 }, ] [[package]] name = "slackify-markdown" version = "0.2.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8d/07/e6f7fe419b21e7bc198f62c9074f7d5ab398b67dc455ccb3190dc31f91f7/slackify_markdown-0.2.4.tar.gz", hash = "sha256:90b57c0a4ef81306c2208573ab4d3afc945797eed0dd04c4876b4a0ca7222619", size = 13604, upload-time = "2026-05-25T15:04:08.074Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/07/e6f7fe419b21e7bc198f62c9074f7d5ab398b67dc455ccb3190dc31f91f7/slackify_markdown-0.2.4.tar.gz", hash = "sha256:90b57c0a4ef81306c2208573ab4d3afc945797eed0dd04c4876b4a0ca7222619", size = 13604 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b9/36/b4f9788907b95b5f217fa9602c94f97ceb2af902aaa2396f37ee7b1c74a0/slackify_markdown-0.2.4-py3-none-any.whl", hash = "sha256:5dd7539facafb6c0add7d895bf3501ba25cd7539ee8e06fc0a3adfef237d647c", size = 7453, upload-time = "2026-05-25T15:04:06.825Z" }, + { url = "https://files.pythonhosted.org/packages/b9/36/b4f9788907b95b5f217fa9602c94f97ceb2af902aaa2396f37ee7b1c74a0/slackify_markdown-0.2.4-py3-none-any.whl", hash = "sha256:5dd7539facafb6c0add7d895bf3501ba25cd7539ee8e06fc0a3adfef237d647c", size = 7453 }, ] [[package]] name = "slashed" version = "1.2.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bashlex" }, { name = "psygnal" }, { name = "universal-pathlib" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/08/667f754d5e9ae6b59fd93d5f91e4bb70a54ca6daff00daa117748c4e9a10/slashed-1.2.1.tar.gz", hash = "sha256:35928d84c7813ae6a744aa4a772d1526b56d69b7a8a8d42005ae3b1667505ee5", size = 48309, upload-time = "2026-02-26T12:10:22.819Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/08/667f754d5e9ae6b59fd93d5f91e4bb70a54ca6daff00daa117748c4e9a10/slashed-1.2.1.tar.gz", hash = "sha256:35928d84c7813ae6a744aa4a772d1526b56d69b7a8a8d42005ae3b1667505ee5", size = 48309 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c3/b6/906a4894d28eda3b15d2409aebf0943826b3aa1b611528ef5434c44b47f8/slashed-1.2.1-py3-none-any.whl", hash = "sha256:e6b381d6e5f6d6bb9529c2be0c8f9be83687d5797f99839609b78fc13f166848", size = 61284, upload-time = "2026-02-26T12:10:21.45Z" }, + { url = "https://files.pythonhosted.org/packages/c3/b6/906a4894d28eda3b15d2409aebf0943826b3aa1b611528ef5434c44b47f8/slashed-1.2.1-py3-none-any.whl", hash = "sha256:e6b381d6e5f6d6bb9529c2be0c8f9be83687d5797f99839609b78fc13f166848", size = 61284 }, ] [[package]] name = "smmap" version = "5.0.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/ea/49c993d6dfdd7338c9b1000a0f36817ed7ec84577ae2e52f890d1a4ff909/smmap-5.0.3.tar.gz", hash = "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", size = 22506, upload-time = "2026-03-09T03:43:26.1Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/ea/49c993d6dfdd7338c9b1000a0f36817ed7ec84577ae2e52f890d1a4ff909/smmap-5.0.3.tar.gz", hash = "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", size = 22506 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390 }, ] [[package]] name = "sniffio" version = "1.3.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/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" }, + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, ] [[package]] name = "socksio" version = "1.0.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/5c/48a7d9495be3d1c651198fd99dbb6ce190e2274d0f28b9051307bdec6b85/socksio-1.0.0.tar.gz", hash = "sha256:f88beb3da5b5c38b9890469de67d0cb0f9d494b78b106ca1845f96c10b91c4ac", size = 19055, upload-time = "2020-04-17T15:50:34.664Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/5c/48a7d9495be3d1c651198fd99dbb6ce190e2274d0f28b9051307bdec6b85/socksio-1.0.0.tar.gz", hash = "sha256:f88beb3da5b5c38b9890469de67d0cb0f9d494b78b106ca1845f96c10b91c4ac", size = 19055 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/c3/6eeb6034408dac0fa653d126c9204ade96b819c936e136c5e8a6897eee9c/socksio-1.0.0-py3-none-any.whl", hash = "sha256:95dc1f15f9b34e8d7b16f06d74b8ccf48f609af32ab33c608d08761c5dcbb1f3", size = 12763, upload-time = "2020-04-17T15:50:31.878Z" }, + { url = "https://files.pythonhosted.org/packages/37/c3/6eeb6034408dac0fa653d126c9204ade96b819c936e136c5e8a6897eee9c/socksio-1.0.0-py3-none-any.whl", hash = "sha256:95dc1f15f9b34e8d7b16f06d74b8ccf48f609af32ab33c608d08761c5dcbb1f3", size = 12763 }, ] [[package]] name = "sounddevice" version = "0.5.5" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/f9/2592608737553638fca98e21e54bfec40bf577bb98a61b2770c912aab25e/sounddevice-0.5.5.tar.gz", hash = "sha256:22487b65198cb5bf2208755105b524f78ad173e5ab6b445bdab1c989f6698df3", size = 143191, upload-time = "2026-01-23T18:36:43.529Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/f9/2592608737553638fca98e21e54bfec40bf577bb98a61b2770c912aab25e/sounddevice-0.5.5.tar.gz", hash = "sha256:22487b65198cb5bf2208755105b524f78ad173e5ab6b445bdab1c989f6698df3", size = 143191 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/0a/478e441fd049002cf308520c0d62dd8333e7c6cc8d997f0dda07b9fbcc46/sounddevice-0.5.5-py3-none-any.whl", hash = "sha256:30ff99f6c107f49d25ad16a45cacd8d91c25a1bcdd3e81a206b921a3a6405b1f", size = 32807, upload-time = "2026-01-23T18:36:35.649Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/56/f9/c037c35f6d0b6bc3bc7bfb314f1d6f1f9a341328ef47cd63fc4f850a7b27/sounddevice-0.5.5-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:05eb9fd6c54c38d67741441c19164c0dae8ce80453af2d8c4ad2e7823d15b722", size = 108557, upload-time = "2026-01-23T18:36:37.41Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/a1/d19dd9889cd4bce2e233c4fac007cd8daaf5b9fe6e6a5d432cf17be0b807/sounddevice-0.5.5-py3-none-win32.whl", hash = "sha256:1234cc9b4c9df97b6cbe748146ae0ec64dd7d6e44739e8e42eaa5b595313a103", size = 317765, upload-time = "2026-01-23T18:36:39.047Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c3/0e/002ed7c4c1c2ab69031f78989d3b789fee3a7fba9e586eb2b81688bf4961/sounddevice-0.5.5-py3-none-win_amd64.whl", hash = "sha256:cfc6b2c49fb7f555591c78cb8ecf48d6a637fd5b6e1db5fec6ed9365d64b3519", size = 365324, upload-time = "2026-01-23T18:36:40.496Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/39/a61d4b83a7746b70d23d9173be688c0c6bfc7173772344b7442c2c155497/sounddevice-0.5.5-py3-none-win_arm64.whl", hash = "sha256:3861901ddd8230d2e0e8ae62ac320cdd4c688d81df89da036dcb812f757bb3e6", size = 317115, upload-time = "2026-01-23T18:36:42.235Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0a/478e441fd049002cf308520c0d62dd8333e7c6cc8d997f0dda07b9fbcc46/sounddevice-0.5.5-py3-none-any.whl", hash = "sha256:30ff99f6c107f49d25ad16a45cacd8d91c25a1bcdd3e81a206b921a3a6405b1f", size = 32807 }, + { url = "https://files.pythonhosted.org/packages/56/f9/c037c35f6d0b6bc3bc7bfb314f1d6f1f9a341328ef47cd63fc4f850a7b27/sounddevice-0.5.5-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:05eb9fd6c54c38d67741441c19164c0dae8ce80453af2d8c4ad2e7823d15b722", size = 108557 }, + { url = "https://files.pythonhosted.org/packages/88/a1/d19dd9889cd4bce2e233c4fac007cd8daaf5b9fe6e6a5d432cf17be0b807/sounddevice-0.5.5-py3-none-win32.whl", hash = "sha256:1234cc9b4c9df97b6cbe748146ae0ec64dd7d6e44739e8e42eaa5b595313a103", size = 317765 }, + { url = "https://files.pythonhosted.org/packages/c3/0e/002ed7c4c1c2ab69031f78989d3b789fee3a7fba9e586eb2b81688bf4961/sounddevice-0.5.5-py3-none-win_amd64.whl", hash = "sha256:cfc6b2c49fb7f555591c78cb8ecf48d6a637fd5b6e1db5fec6ed9365d64b3519", size = 365324 }, + { url = "https://files.pythonhosted.org/packages/4e/39/a61d4b83a7746b70d23d9173be688c0c6bfc7173772344b7442c2c155497/sounddevice-0.5.5-py3-none-win_arm64.whl", hash = "sha256:3861901ddd8230d2e0e8ae62ac320cdd4c688d81df89da036dcb812f757bb3e6", size = 317115 }, ] [[package]] name = "soupsieve" version = "2.9.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/38/e12680bbe6b4f8f3d17adcaf38d26850aa756c85cf4a80e79fc12a018fe8/soupsieve-2.9.1.tar.gz", hash = "sha256:c33e6605bbc71dd628b00c632d58ae607c22bade247e52553928f83bbb75b4ba", size = 122261, upload-time = "2026-07-21T16:57:17.452Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/38/e12680bbe6b4f8f3d17adcaf38d26850aa756c85cf4a80e79fc12a018fe8/soupsieve-2.9.1.tar.gz", hash = "sha256:c33e6605bbc71dd628b00c632d58ae607c22bade247e52553928f83bbb75b4ba", size = 122261 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/2c/437fe806897c2d6cfdc3ee43a18da8bf8e568530a4ae9bac781541ca9896/soupsieve-2.9.1-py3-none-any.whl", hash = "sha256:4f4477399246b7a0c720a88ca2454b11cd6bb9ae4c9d170140786e916776c14c", size = 37404, upload-time = "2026-07-21T16:57:16.421Z" }, + { url = "https://files.pythonhosted.org/packages/0f/2c/437fe806897c2d6cfdc3ee43a18da8bf8e568530a4ae9bac781541ca9896/soupsieve-2.9.1-py3-none-any.whl", hash = "sha256:4f4477399246b7a0c720a88ca2454b11cd6bb9ae4c9d170140786e916776c14c", size = 37404 }, ] [[package]] name = "sqlalchemy" version = "2.0.51" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/f1/a7a892f18d4d224e6b26f706531eafccc41e37594d37d304786969ee13cb/sqlalchemy-2.0.51.tar.gz", hash = "sha256:804dccd8a4a6242c4e30ad961e540e18a588f6527202f2d6791b01845d59fdc9", size = 9912201, upload-time = "2026-06-15T15:41:20.012Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/f1/a7a892f18d4d224e6b26f706531eafccc41e37594d37d304786969ee13cb/sqlalchemy-2.0.51.tar.gz", hash = "sha256:804dccd8a4a6242c4e30ad961e540e18a588f6527202f2d6791b01845d59fdc9", size = 9912201 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/54/fe/a210d52fd1a90ecfae8a78e9d8b27e18d733d60818a8bf250ff690b75120/sqlalchemy-2.0.51-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c2056838b6685b72fdb36c99996cf862753461a62f2e84f4196371d3b2d6a07", size = 2157184, upload-time = "2026-06-15T16:08:50.374Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/17/6b/2dce8369b199cb855110e056032f94a9f66dacc2237d3d39c115a86eac56/sqlalchemy-2.0.51-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:483b11bd46bf35fc14c52faf338b04300c9e6ce554bce9b11be85bfec3bc3195", size = 3284735, upload-time = "2026-06-15T16:19:46.934Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/ff/dbc495b8a14da840faffb353857a72d4190113cac33727906fb997047f0f/sqlalchemy-2.0.51-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1bed1ee8b01da6088210aa9412023326fb98a599ba502e6118308601dcbef77f", size = 3302756, upload-time = "2026-06-15T16:26:41.336Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cf/d5/fde8f4dddcf518ee15ab35a7c6a28acc32c8ba548d1d2aa451f96e6dbb0b/sqlalchemy-2.0.51-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:72ca54c952107ba5cd58854b67a5a6268631289d21651a1235396f3b98b47400", size = 3232055, upload-time = "2026-06-15T16:19:49.286Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/d1/43d3a0ac955a58601c24fa23038b1c55ee3a1ec02c0f96ebb1eae2bcf614/sqlalchemy-2.0.51-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b3e693d15533a45cd5906f0589f9c35090bef6ef45bf1e8195c424aa0ae06a8d", size = 3269850, upload-time = "2026-06-15T16:26:43.017Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/df/de669c7054cd47c4439ac34b1b2ee8b804a794791fbb10720e997a2c87c7/sqlalchemy-2.0.51-cp313-cp313-win32.whl", hash = "sha256:b93ab07b5292dbe7e6b8da89475275e7042744283921344b56105f3eeb0f828b", size = 2117721, upload-time = "2026-06-15T16:23:12.36Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/8a/403c51d064196bae20a0bc2476577f83a3f8dd299719a97417086b7f2ec5/sqlalchemy-2.0.51-cp313-cp313-win_amd64.whl", hash = "sha256:0f053118c30e53161857a953e4de667d90e274980dccbe5dd3829bbbeece72a5", size = 2143615, upload-time = "2026-06-15T16:23:13.906Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/22/dbf013a12ec759e54a34a119e9e217435b3f71b2dd5c61a7ade0a25dae87/sqlalchemy-2.0.51-py3-none-any.whl", hash = "sha256:bb024d8b621d0be75f4f44ecc7c950450026e76d66dc8f791bb5331d7fed59d5", size = 1944334, upload-time = "2026-06-15T16:09:22.418Z" }, + { url = "https://files.pythonhosted.org/packages/54/fe/a210d52fd1a90ecfae8a78e9d8b27e18d733d60818a8bf250ff690b75120/sqlalchemy-2.0.51-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c2056838b6685b72fdb36c99996cf862753461a62f2e84f4196371d3b2d6a07", size = 2157184 }, + { url = "https://files.pythonhosted.org/packages/17/6b/2dce8369b199cb855110e056032f94a9f66dacc2237d3d39c115a86eac56/sqlalchemy-2.0.51-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:483b11bd46bf35fc14c52faf338b04300c9e6ce554bce9b11be85bfec3bc3195", size = 3284735 }, + { url = "https://files.pythonhosted.org/packages/53/ff/dbc495b8a14da840faffb353857a72d4190113cac33727906fb997047f0f/sqlalchemy-2.0.51-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1bed1ee8b01da6088210aa9412023326fb98a599ba502e6118308601dcbef77f", size = 3302756 }, + { url = "https://files.pythonhosted.org/packages/cf/d5/fde8f4dddcf518ee15ab35a7c6a28acc32c8ba548d1d2aa451f96e6dbb0b/sqlalchemy-2.0.51-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:72ca54c952107ba5cd58854b67a5a6268631289d21651a1235396f3b98b47400", size = 3232055 }, + { url = "https://files.pythonhosted.org/packages/67/d1/43d3a0ac955a58601c24fa23038b1c55ee3a1ec02c0f96ebb1eae2bcf614/sqlalchemy-2.0.51-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b3e693d15533a45cd5906f0589f9c35090bef6ef45bf1e8195c424aa0ae06a8d", size = 3269850 }, + { url = "https://files.pythonhosted.org/packages/94/df/de669c7054cd47c4439ac34b1b2ee8b804a794791fbb10720e997a2c87c7/sqlalchemy-2.0.51-cp313-cp313-win32.whl", hash = "sha256:b93ab07b5292dbe7e6b8da89475275e7042744283921344b56105f3eeb0f828b", size = 2117721 }, + { url = "https://files.pythonhosted.org/packages/d0/8a/403c51d064196bae20a0bc2476577f83a3f8dd299719a97417086b7f2ec5/sqlalchemy-2.0.51-cp313-cp313-win_amd64.whl", hash = "sha256:0f053118c30e53161857a953e4de667d90e274980dccbe5dd3829bbbeece72a5", size = 2143615 }, + { url = "https://files.pythonhosted.org/packages/e2/22/dbf013a12ec759e54a34a119e9e217435b3f71b2dd5c61a7ade0a25dae87/sqlalchemy-2.0.51-py3-none-any.whl", hash = "sha256:bb024d8b621d0be75f4f44ecc7c950450026e76d66dc8f791bb5331d7fed59d5", size = 1944334 }, ] [package.optional-dependencies] @@ -4893,184 +4596,184 @@ aiosqlite = [ [[package]] name = "sqlmodel" version = "0.0.39" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "sqlalchemy" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/ee/22a0559283c3cf6048678e787ed5d4959dcd00dedd8ba4567eeae684eeb1/sqlmodel-0.0.39.tar.gz", hash = "sha256:23d8e50a8d8ee936032ed79c55023a5d618dd6bc3c510bbf4909d1a7a605a570", size = 91057, upload-time = "2026-06-25T13:01:38.475Z" } +sdist = { url = "https://files.pythonhosted.org/packages/68/ee/22a0559283c3cf6048678e787ed5d4959dcd00dedd8ba4567eeae684eeb1/sqlmodel-0.0.39.tar.gz", hash = "sha256:23d8e50a8d8ee936032ed79c55023a5d618dd6bc3c510bbf4909d1a7a605a570", size = 91057 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cf/7d/b9813a582d4eb310be35e1fc7dfaae71207d7b62e9e53be314ebd251b53b/sqlmodel-0.0.39-py3-none-any.whl", hash = "sha256:90ebe92ce5cc11d7fff8dc7cb594790a102333c8fe7c14865254f6fc5c939795", size = 29680, upload-time = "2026-06-25T13:01:37.494Z" }, + { url = "https://files.pythonhosted.org/packages/cf/7d/b9813a582d4eb310be35e1fc7dfaae71207d7b62e9e53be314ebd251b53b/sqlmodel-0.0.39-py3-none-any.whl", hash = "sha256:90ebe92ce5cc11d7fff8dc7cb594790a102333c8fe7c14865254f6fc5c939795", size = 29680 }, ] [[package]] name = "sse-starlette" version = "3.4.6" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "starlette" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/10/a34c656829ffc1c4b22ef36d70d9ebb6b99c020e2aeb17cee5485099f028/sse_starlette-3.4.6.tar.gz", hash = "sha256:725f8a1bd6d26ae1b2c9610c0ef5065dfdd496f3988d28adcf8c4b49dc25c627", size = 32542, upload-time = "2026-07-20T14:16:32.201Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/10/a34c656829ffc1c4b22ef36d70d9ebb6b99c020e2aeb17cee5485099f028/sse_starlette-3.4.6.tar.gz", hash = "sha256:725f8a1bd6d26ae1b2c9610c0ef5065dfdd496f3988d28adcf8c4b49dc25c627", size = 32542 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/36/e10c1d1b7ca881d2625db2ec28508578499187bb1c389952c398474e1834/sse_starlette-3.4.6-py3-none-any.whl", hash = "sha256:56217ab4c9a9f9c5db7b21e08732d3e7c2b807f45231ad23de0551a24c4a41f6", size = 16516, upload-time = "2026-07-20T14:16:30.978Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/e10c1d1b7ca881d2625db2ec28508578499187bb1c389952c398474e1834/sse_starlette-3.4.6-py3-none-any.whl", hash = "sha256:56217ab4c9a9f9c5db7b21e08732d3e7c2b807f45231ad23de0551a24c4a41f6", size = 16516 }, ] [[package]] name = "sseclient-py" version = "1.9.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/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" }, + { url = "https://files.pythonhosted.org/packages/4d/2e/59920f7d66b7f9932a3d83dd0ec53fab001be1e058bf582606fe414a5198/sseclient_py-1.9.0-py3-none-any.whl", hash = "sha256:340062b1587fc2880892811e2ab5b176d98ef3eee98b3672ff3a3ba1e8ed0f6f", size = 8351 }, ] [[package]] name = "starlette" version = "1.3.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/e3/7c1dc7381d9f8ab7d854328ebfa884e62cb3f3d8549ddfd37c7814f42afa/starlette-1.3.1.tar.gz", hash = "sha256:05d0213193f2fbaae60e2ecb593b4add4262ad4e46536b54abe36f11a71724e0", size = 2703240, upload-time = "2026-06-12T09:23:11.602Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/e3/7c1dc7381d9f8ab7d854328ebfa884e62cb3f3d8549ddfd37c7814f42afa/starlette-1.3.1.tar.gz", hash = "sha256:05d0213193f2fbaae60e2ecb593b4add4262ad4e46536b54abe36f11a71724e0", size = 2703240 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/bb/2799cc2ede3ed41131f8975621e7213dfc7ef4acbbaadfa440f32500c370/starlette-1.3.1-py3-none-any.whl", hash = "sha256:c7372aae11c3c3f26a42df7bd626cec2f47d03483d261d369516a615a53714c6", size = 73632, upload-time = "2026-06-12T09:23:10.017Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bb/2799cc2ede3ed41131f8975621e7213dfc7ef4acbbaadfa440f32500c370/starlette-1.3.1-py3-none-any.whl", hash = "sha256:c7372aae11c3c3f26a42df7bd626cec2f47d03483d261d369516a615a53714c6", size = 73632 }, ] [[package]] name = "structlog" version = "26.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5e/89/b4a0bcfdf4f71a3dea31379f095929613d7e4528a0996bca6aa964cd0dca/structlog-26.1.0.tar.gz", hash = "sha256:f63a716cbd1b1291cf7661de7794b455acfa4c43c5bcf1630e6ad5ddc1adb3b7", size = 1459881, upload-time = "2026-06-06T07:33:39.348Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/89/b4a0bcfdf4f71a3dea31379f095929613d7e4528a0996bca6aa964cd0dca/structlog-26.1.0.tar.gz", hash = "sha256:f63a716cbd1b1291cf7661de7794b455acfa4c43c5bcf1630e6ad5ddc1adb3b7", size = 1459881 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/18/489c97b834dfff9cf2fc2507cede4bcd4b11e67f84bc462acd1992496f86/structlog-26.1.0-py3-none-any.whl", hash = "sha256:e081a26d6c373e6d201eca24eede26d8ffab07f88f477822e679183428d3d91e", size = 73764, upload-time = "2026-06-06T07:33:38.046Z" }, + { url = "https://files.pythonhosted.org/packages/a9/18/489c97b834dfff9cf2fc2507cede4bcd4b11e67f84bc462acd1992496f86/structlog-26.1.0-py3-none-any.whl", hash = "sha256:e081a26d6c373e6d201eca24eede26d8ffab07f88f477822e679183428d3d91e", size = 73764 }, ] [[package]] name = "sublime-search" version = "0.5.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/c9/134ea2f0569f432439e8d5d4b834a9445064720bec13f9304aaa836cdb34/sublime_search-0.5.0.tar.gz", hash = "sha256:c316df5cc5481e602205a5abff5e669b1bb960afb25e6578abfc15a23bdd1ce1", size = 44314, upload-time = "2026-01-30T04:26:32.34Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/c8/848124cf507fb58956ea4058045e654cbfac9fb684a85435e67d9d62c0e9/sublime_search-0.5.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6f7edd7dd33aac1036af793f0bf8fc0d65233803280a9ac9d7fb01c54a19cb9f", size = 970575, upload-time = "2026-01-30T04:25:55.346Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/5b/360045d55180358b242a913d11528745e5fa001575606dc7a88c8346c168/sublime_search-0.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7dda52fc8c1cfd23764813a70f767f62fcd78fb703759e73fd69d5902c6a8df9", size = 923303, upload-time = "2026-01-30T04:25:49.275Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/36/e3d4542b8bc3ab244f0405e2da9e89f4fe60a07d7f6a6b427d5a9e815e63/sublime_search-0.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5eba812aaa5335b8d18f741ba6a8f8a9ce34fb277021e809738991ac88a34b5", size = 1044339, upload-time = "2026-01-30T04:24:59.107Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/63/8b77d4bdf761abc41edd616dfda907b2bd0d82b6b43ad1c28958a9474150/sublime_search-0.5.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5393bc2abe371aa1c49c99ddcb170a2a2526f6e99cd724aeb2621e63e776d9ab", size = 999821, upload-time = "2026-01-30T04:25:08.129Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/89/4c32e535172269899f1b92ec75b80e8b21a6f3f806831e46baa982ece336/sublime_search-0.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8586c501e25c8f148643052b3441729190e390115e480051da6c05f00848fa71", size = 1220622, upload-time = "2026-01-30T04:25:18.464Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/93/e6/e72fca8916a6e149bcd7f388b2487f4fecca0c2d888ffa5f53d75bb988f2/sublime_search-0.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d02882d07a246092dd544ca56d52493dbf4333a006b4ba41a56c7dde22412c", size = 1108664, upload-time = "2026-01-30T04:25:28.086Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/08/94/0eaa0e2f7e1d664b0a538d2292fd11776d471322055970b778f4bfa622de/sublime_search-0.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4439832149ad6cac4cdd051feb584be31eccf3fa5fcf8a2259c4e0dd5113887d", size = 1065522, upload-time = "2026-01-30T04:25:43.296Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/37/fc178eabbd15e7fd26cf3672ab10b45f657ec32b793a98e8d7e1ab73be66/sublime_search-0.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:203c79a7b1b1989acf215c850dd7b9070e3db8742cd782dc9f7186bc07f10592", size = 1093571, upload-time = "2026-01-30T04:25:37.107Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/64/68f01cdcf27ee3b6da7a7829ade6fb6002f51ae4f1081ebda473c5fa3e99/sublime_search-0.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5c8d5798549bd60f11f99dc4a999ded9d572c6f26a4febe46f8ff11a2ca32936", size = 1220745, upload-time = "2026-01-30T04:25:59.892Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/22/e417f582863e96ab8953dc026243ca5cb2b5b026ef5f85adfca0b8abd9b7/sublime_search-0.5.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bd07603402f0078d225513154bfbfde50d28566004f15b0097bb995767273e85", size = 1265335, upload-time = "2026-01-30T04:26:09.102Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/cb/40df16111219449ef63a543371c5782e43a3a75dd844c7ff2056320495e4/sublime_search-0.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9fbb0abdae6f4241c91c041f23977a7836a3632da2efee76e170857393b813c6", size = 1275562, upload-time = "2026-01-30T04:26:17.235Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/8a/f7dc6351e154fc50ca6f27c5a983f7b42b6ec991a2b328f3dcbb9e5b5d56/sublime_search-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d1ad4e2adbe6e8c744e67ee497e1cd4b149e9b1ccfea1d99e1697224d49d3d0", size = 1301079, upload-time = "2026-01-30T04:26:26.852Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a8/fc/c6f965abc719c722c57ed04ea6d63ec6c0178d8118cf1b71952e43c29d1d/sublime_search-0.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:9822ba29d5f5e72d7f52fa8408cc3e8179be63476483aa6a97aa21a202b62f05", size = 819477, upload-time = "2026-01-30T04:26:35.295Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/98/6a5ce632354d0788f3d4b11c909f9c378431c2809bc4720e20b6d6271fcb/sublime_search-0.5.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b98724b9e6b0c64dcde9affa49bcce521970abb492e2f8a76d0a177d8b93236b", size = 1044689, upload-time = "2026-01-30T04:25:00.239Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/e3/8b26728a1047c5aac97c0b337f4eed16098f95425bb055af40f22c0d21c3/sublime_search-0.5.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a4dd8dcfd68a966265202c8aa62be6ec61b51579b095eab728f84be23063c6b0", size = 997831, upload-time = "2026-01-30T04:25:09.614Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/61/d11af20984ef94d50d28b36a1fb017c0c7c5bc1868ff10a400f8c693cc41/sublime_search-0.5.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:67f3329c45152e712fcdefc74d2e0f2d7382b72c62ff4b0e5750c25cc5edde61", size = 1220861, upload-time = "2026-01-30T04:25:19.918Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/ec/ad95b318462bfcb43ea1117c7129b84cb8afedb83eea62522a9d5f0a767b/sublime_search-0.5.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48120a3b1f4c8383fbe43dadcea6a50e974ed162febbe407091dd028a5d228dc", size = 1108905, upload-time = "2026-01-30T04:25:29.601Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/97/263582e7135c552d562fbd69a7ad216892331e445fc1c2acce3c2dde4af9/sublime_search-0.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a2ab2477cf307d301c133a0350426bb22a5727fd060e3fe201852910ccb26e13", size = 1220691, upload-time = "2026-01-30T04:26:01.145Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/39/93/3f88bbb6821332194e729af5add9eabc90c0a7e24359546e06313961c5a8/sublime_search-0.5.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:c7670d48b647fda37c279013db03400dbcfd44cc508a69ae690fe9a9e00d7ee0", size = 1264224, upload-time = "2026-01-30T04:26:10.226Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/73/b7/48c07d3c293328d18f70b1ecba1ff781e9dc7bde9fc4a8b97aba2411c587/sublime_search-0.5.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3dc9511d4a47fc616656c3b82322a20ffaf283d29560134169673206c4133b1d", size = 1274424, upload-time = "2026-01-30T04:26:18.85Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/74/78/17b7947310115e9c006eb05e1b4f1458fedd12864245f675454dd7be9ce6/sublime_search-0.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:052bc85ba46b34dbb462d3e7a1c2b982fdccb88bf225ba95952ed2cef3ad898c", size = 1302705, upload-time = "2026-01-30T04:26:27.966Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c9/134ea2f0569f432439e8d5d4b834a9445064720bec13f9304aaa836cdb34/sublime_search-0.5.0.tar.gz", hash = "sha256:c316df5cc5481e602205a5abff5e669b1bb960afb25e6578abfc15a23bdd1ce1", size = 44314 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/c8/848124cf507fb58956ea4058045e654cbfac9fb684a85435e67d9d62c0e9/sublime_search-0.5.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6f7edd7dd33aac1036af793f0bf8fc0d65233803280a9ac9d7fb01c54a19cb9f", size = 970575 }, + { url = "https://files.pythonhosted.org/packages/60/5b/360045d55180358b242a913d11528745e5fa001575606dc7a88c8346c168/sublime_search-0.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7dda52fc8c1cfd23764813a70f767f62fcd78fb703759e73fd69d5902c6a8df9", size = 923303 }, + { url = "https://files.pythonhosted.org/packages/90/36/e3d4542b8bc3ab244f0405e2da9e89f4fe60a07d7f6a6b427d5a9e815e63/sublime_search-0.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5eba812aaa5335b8d18f741ba6a8f8a9ce34fb277021e809738991ac88a34b5", size = 1044339 }, + { url = "https://files.pythonhosted.org/packages/d0/63/8b77d4bdf761abc41edd616dfda907b2bd0d82b6b43ad1c28958a9474150/sublime_search-0.5.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5393bc2abe371aa1c49c99ddcb170a2a2526f6e99cd724aeb2621e63e776d9ab", size = 999821 }, + { url = "https://files.pythonhosted.org/packages/e0/89/4c32e535172269899f1b92ec75b80e8b21a6f3f806831e46baa982ece336/sublime_search-0.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8586c501e25c8f148643052b3441729190e390115e480051da6c05f00848fa71", size = 1220622 }, + { url = "https://files.pythonhosted.org/packages/93/e6/e72fca8916a6e149bcd7f388b2487f4fecca0c2d888ffa5f53d75bb988f2/sublime_search-0.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d02882d07a246092dd544ca56d52493dbf4333a006b4ba41a56c7dde22412c", size = 1108664 }, + { url = "https://files.pythonhosted.org/packages/08/94/0eaa0e2f7e1d664b0a538d2292fd11776d471322055970b778f4bfa622de/sublime_search-0.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4439832149ad6cac4cdd051feb584be31eccf3fa5fcf8a2259c4e0dd5113887d", size = 1065522 }, + { url = "https://files.pythonhosted.org/packages/5c/37/fc178eabbd15e7fd26cf3672ab10b45f657ec32b793a98e8d7e1ab73be66/sublime_search-0.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:203c79a7b1b1989acf215c850dd7b9070e3db8742cd782dc9f7186bc07f10592", size = 1093571 }, + { url = "https://files.pythonhosted.org/packages/0e/64/68f01cdcf27ee3b6da7a7829ade6fb6002f51ae4f1081ebda473c5fa3e99/sublime_search-0.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5c8d5798549bd60f11f99dc4a999ded9d572c6f26a4febe46f8ff11a2ca32936", size = 1220745 }, + { url = "https://files.pythonhosted.org/packages/2a/22/e417f582863e96ab8953dc026243ca5cb2b5b026ef5f85adfca0b8abd9b7/sublime_search-0.5.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bd07603402f0078d225513154bfbfde50d28566004f15b0097bb995767273e85", size = 1265335 }, + { url = "https://files.pythonhosted.org/packages/f1/cb/40df16111219449ef63a543371c5782e43a3a75dd844c7ff2056320495e4/sublime_search-0.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9fbb0abdae6f4241c91c041f23977a7836a3632da2efee76e170857393b813c6", size = 1275562 }, + { url = "https://files.pythonhosted.org/packages/e4/8a/f7dc6351e154fc50ca6f27c5a983f7b42b6ec991a2b328f3dcbb9e5b5d56/sublime_search-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d1ad4e2adbe6e8c744e67ee497e1cd4b149e9b1ccfea1d99e1697224d49d3d0", size = 1301079 }, + { url = "https://files.pythonhosted.org/packages/a8/fc/c6f965abc719c722c57ed04ea6d63ec6c0178d8118cf1b71952e43c29d1d/sublime_search-0.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:9822ba29d5f5e72d7f52fa8408cc3e8179be63476483aa6a97aa21a202b62f05", size = 819477 }, + { url = "https://files.pythonhosted.org/packages/31/98/6a5ce632354d0788f3d4b11c909f9c378431c2809bc4720e20b6d6271fcb/sublime_search-0.5.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b98724b9e6b0c64dcde9affa49bcce521970abb492e2f8a76d0a177d8b93236b", size = 1044689 }, + { url = "https://files.pythonhosted.org/packages/b1/e3/8b26728a1047c5aac97c0b337f4eed16098f95425bb055af40f22c0d21c3/sublime_search-0.5.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a4dd8dcfd68a966265202c8aa62be6ec61b51579b095eab728f84be23063c6b0", size = 997831 }, + { url = "https://files.pythonhosted.org/packages/1e/61/d11af20984ef94d50d28b36a1fb017c0c7c5bc1868ff10a400f8c693cc41/sublime_search-0.5.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:67f3329c45152e712fcdefc74d2e0f2d7382b72c62ff4b0e5750c25cc5edde61", size = 1220861 }, + { url = "https://files.pythonhosted.org/packages/f6/ec/ad95b318462bfcb43ea1117c7129b84cb8afedb83eea62522a9d5f0a767b/sublime_search-0.5.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48120a3b1f4c8383fbe43dadcea6a50e974ed162febbe407091dd028a5d228dc", size = 1108905 }, + { url = "https://files.pythonhosted.org/packages/b1/97/263582e7135c552d562fbd69a7ad216892331e445fc1c2acce3c2dde4af9/sublime_search-0.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a2ab2477cf307d301c133a0350426bb22a5727fd060e3fe201852910ccb26e13", size = 1220691 }, + { url = "https://files.pythonhosted.org/packages/39/93/3f88bbb6821332194e729af5add9eabc90c0a7e24359546e06313961c5a8/sublime_search-0.5.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:c7670d48b647fda37c279013db03400dbcfd44cc508a69ae690fe9a9e00d7ee0", size = 1264224 }, + { url = "https://files.pythonhosted.org/packages/73/b7/48c07d3c293328d18f70b1ecba1ff781e9dc7bde9fc4a8b97aba2411c587/sublime_search-0.5.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3dc9511d4a47fc616656c3b82322a20ffaf283d29560134169673206c4133b1d", size = 1274424 }, + { url = "https://files.pythonhosted.org/packages/74/78/17b7947310115e9c006eb05e1b4f1458fedd12864245f675454dd7be9ce6/sublime_search-0.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:052bc85ba46b34dbb462d3e7a1c2b982fdccb88bf225ba95952ed2cef3ad898c", size = 1302705 }, ] [[package]] name = "syrupy" version = "5.5.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/39/17dde9f0c76cc5abcdeef1b2243791bb850d498f784147b8e460dd23abe8/syrupy-5.5.3.tar.gz", hash = "sha256:fa21e4ae77c89ec5abfca513338d8a7eb916da6618ca0f8db301476e0768e57a", size = 91614, upload-time = "2026-07-11T15:54:31.46Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/39/17dde9f0c76cc5abcdeef1b2243791bb850d498f784147b8e460dd23abe8/syrupy-5.5.3.tar.gz", hash = "sha256:fa21e4ae77c89ec5abfca513338d8a7eb916da6618ca0f8db301476e0768e57a", size = 91614 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/f9/617a194c1a4203279998e1859426cf2635042533a99a93d63d3ee1fb967e/syrupy-5.5.3-py3-none-any.whl", hash = "sha256:0b260a0c9dad55e1fb83818973dc36fbc1aea3fd5381592f442a986686c4171a", size = 54959, upload-time = "2026-07-11T15:54:29.836Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f9/617a194c1a4203279998e1859426cf2635042533a99a93d63d3ee1fb967e/syrupy-5.5.3-py3-none-any.whl", hash = "sha256:0b260a0c9dad55e1fb83818973dc36fbc1aea3fd5381592f442a986686c4171a", size = 54959 }, ] [[package]] name = "tabulate" version = "0.10.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/46/58/8c37dea7bbf769b20d58e7ace7e5edfe65b849442b00ffcdd56be88697c6/tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d", size = 91754, upload-time = "2026-03-04T18:55:34.402Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/46/58/8c37dea7bbf769b20d58e7ace7e5edfe65b849442b00ffcdd56be88697c6/tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d", size = 91754 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3", size = 39814, upload-time = "2026-03-04T18:55:31.284Z" }, + { url = "https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3", size = 39814 }, ] [[package]] name = "tenacity" version = "9.1.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/c6/ee486fd809e357697ee8a44d3d69222b344920433d3b6666ccd9b374630c/tenacity-9.1.4.tar.gz", hash = "sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a", size = 49413, upload-time = "2026-02-07T10:45:33.841Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/c6/ee486fd809e357697ee8a44d3d69222b344920433d3b6666ccd9b374630c/tenacity-9.1.4.tar.gz", hash = "sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a", size = 49413 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/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" }, + { url = "https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55", size = 28926 }, ] [[package]] name = "text-unidecode" version = "1.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload-time = "2019-08-30T21:36:45.405Z" } +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 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/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" }, + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154 }, ] [[package]] name = "tiktoken" version = "0.13.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "regex" }, { name = "requests" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/e5/5f3cb2159769d0f4324c0e9e87f9de3c4b1cd45848a96b2eb3566ad5ca77/tiktoken-0.13.0.tar.gz", hash = "sha256:c9435714c3a84c2319499de9a300c0e604449dd0799ff246458b3bb6a7f433c1", size = 38986, upload-time = "2026-05-15T04:51:27.153Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/e5/5f3cb2159769d0f4324c0e9e87f9de3c4b1cd45848a96b2eb3566ad5ca77/tiktoken-0.13.0.tar.gz", hash = "sha256:c9435714c3a84c2319499de9a300c0e604449dd0799ff246458b3bb6a7f433c1", size = 38986 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9c/83/b096c859c2a47c11731bf2f5885f4028b809dfe2396582883eed9cae372f/tiktoken-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5df5d1507bd245f1ccad4a074698240021239e455eb0bb4ced4e3d7181872154", size = 1034228, upload-time = "2026-05-15T04:50:40.988Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/61/c68e123b6d753e3fc2751e9b18e732c9d8bf1e1926762e736eee935d931c/tiktoken-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8fe806a50664e83a6ffd56cbd1e4f5dcc6cd32a3e7538f70dc38b1a271384545", size = 982978, upload-time = "2026-05-15T04:50:42.195Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ef/8b/96cc178cc584e65d363134500f297790b06cd48cdeb1e8fcf7bbe60f4715/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:125bc05005e747f993a83dc67934249932d6e4209854452cd4c0b1d53fba3ba2", size = 1116355, upload-time = "2026-05-15T04:50:43.564Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/f5/bab735d2c72ea55404b295d02d092644eb5f7cc6205e34d35eb9abfb9ab2/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5e6358911cab4adee6712da27d65573496a4f68cf8a2b5fca6a4ad10fc5748cf", size = 1135772, upload-time = "2026-05-15T04:50:44.782Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/b9/6de04ebdf904edfaad87788011b3735087a0c9ea671b9027e1e4e965e8c8/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:975cbd78d085d75d26b59660e262736dcaed1e35f8f142cd6291025c01d25486", size = 1182415, upload-time = "2026-05-15T04:50:46.422Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/9c/470a05f3b1caf038f44880e334d47ab674e0c80d514c66b375d14d5afa10/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ab9bc99fa020a4c283424590ecd7f3afd70c1c281cb3fa3192a6c3af9f9615", size = 1239879, upload-time = "2026-05-15T04:50:48.052Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/a6/c1936d16055436cb32e6c6128d68629622e00f4768562f55653752d34768/tiktoken-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:6b1615f0ff71953d19729ceb18865429c185b0a23c5353f1bbca34a394bf60f7", size = 874829, upload-time = "2026-05-15T04:50:49.202Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/07/acb5992c3772b5a36284f742cfb7a5895aa4471d1848ac31464ad50d7fdf/tiktoken-0.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6eb4a5bfbc6426938026b1a334e898ac53541360d62d8c689870160cc80abd67", size = 1033600, upload-time = "2026-05-15T04:50:50.4Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/14/e9/742e9aec30f59b9f161f7ff7cd072e02ea836c9e1c0854a8076dfcd40d5c/tiktoken-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:43cee3e5400573b2046fbf092cc7a5bc30164f9e4c95ce20714da929df48737a", size = 982516, upload-time = "2026-05-15T04:50:52.03Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/74/ca1541b053e7648254d2e4b42a253e1bb4359f2c91a0a8d49228c794e1a0/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7de52e3f566d19b3b11bd37eea552c6c305ad74081f736882bd44d148ed4c48d", size = 1115518, upload-time = "2026-05-15T04:50:53.543Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/46/e3/93825eaf5a4a504795b787e5d5dea07fbeb3dabf97aa7b450be8bde59c89/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:51384448aa508e4df84c0f7c1dc3211c7f7b8096325660ee5fc82f3e11b381ce", size = 1136867, upload-time = "2026-05-15T04:50:55.191Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/46/002b68de6827091d5ae90b048f326e8aad8d953520950e5ce1508879414f/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e28157350f7ebf35008dd8e9e0fdb621f976e4230c881099c85e8cf07eaa50e2", size = 1181826, upload-time = "2026-05-15T04:50:56.296Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/c6/d393e3185a276505182f7abd93fe714f3c444a2be9180798fa052347504e/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:165cf1820ea4a354985c2490a5205d4cc74661c934aca79dd0368232fff94e0f", size = 1239489, upload-time = "2026-05-15T04:50:57.918Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/4d/bc07d1f1635d4897a202acc0ae11c2886eaa7325c359ba4741b47bf8e225/tiktoken-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6c43a675ca14f6f2749ba7f12075d37456015a24b859f2517b9beb4ef30807ec", size = 873820, upload-time = "2026-05-15T04:50:59.528Z" }, + { url = "https://files.pythonhosted.org/packages/9c/83/b096c859c2a47c11731bf2f5885f4028b809dfe2396582883eed9cae372f/tiktoken-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5df5d1507bd245f1ccad4a074698240021239e455eb0bb4ced4e3d7181872154", size = 1034228 }, + { url = "https://files.pythonhosted.org/packages/53/61/c68e123b6d753e3fc2751e9b18e732c9d8bf1e1926762e736eee935d931c/tiktoken-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8fe806a50664e83a6ffd56cbd1e4f5dcc6cd32a3e7538f70dc38b1a271384545", size = 982978 }, + { url = "https://files.pythonhosted.org/packages/ef/8b/96cc178cc584e65d363134500f297790b06cd48cdeb1e8fcf7bbe60f4715/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:125bc05005e747f993a83dc67934249932d6e4209854452cd4c0b1d53fba3ba2", size = 1116355 }, + { url = "https://files.pythonhosted.org/packages/86/f5/bab735d2c72ea55404b295d02d092644eb5f7cc6205e34d35eb9abfb9ab2/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5e6358911cab4adee6712da27d65573496a4f68cf8a2b5fca6a4ad10fc5748cf", size = 1135772 }, + { url = "https://files.pythonhosted.org/packages/4e/b9/6de04ebdf904edfaad87788011b3735087a0c9ea671b9027e1e4e965e8c8/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:975cbd78d085d75d26b59660e262736dcaed1e35f8f142cd6291025c01d25486", size = 1182415 }, + { url = "https://files.pythonhosted.org/packages/0d/9c/470a05f3b1caf038f44880e334d47ab674e0c80d514c66b375d14d5afa10/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ab9bc99fa020a4c283424590ecd7f3afd70c1c281cb3fa3192a6c3af9f9615", size = 1239879 }, + { url = "https://files.pythonhosted.org/packages/42/a6/c1936d16055436cb32e6c6128d68629622e00f4768562f55653752d34768/tiktoken-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:6b1615f0ff71953d19729ceb18865429c185b0a23c5353f1bbca34a394bf60f7", size = 874829 }, + { url = "https://files.pythonhosted.org/packages/d6/07/acb5992c3772b5a36284f742cfb7a5895aa4471d1848ac31464ad50d7fdf/tiktoken-0.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6eb4a5bfbc6426938026b1a334e898ac53541360d62d8c689870160cc80abd67", size = 1033600 }, + { url = "https://files.pythonhosted.org/packages/14/e9/742e9aec30f59b9f161f7ff7cd072e02ea836c9e1c0854a8076dfcd40d5c/tiktoken-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:43cee3e5400573b2046fbf092cc7a5bc30164f9e4c95ce20714da929df48737a", size = 982516 }, + { url = "https://files.pythonhosted.org/packages/72/74/ca1541b053e7648254d2e4b42a253e1bb4359f2c91a0a8d49228c794e1a0/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7de52e3f566d19b3b11bd37eea552c6c305ad74081f736882bd44d148ed4c48d", size = 1115518 }, + { url = "https://files.pythonhosted.org/packages/46/e3/93825eaf5a4a504795b787e5d5dea07fbeb3dabf97aa7b450be8bde59c89/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:51384448aa508e4df84c0f7c1dc3211c7f7b8096325660ee5fc82f3e11b381ce", size = 1136867 }, + { url = "https://files.pythonhosted.org/packages/8c/46/002b68de6827091d5ae90b048f326e8aad8d953520950e5ce1508879414f/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e28157350f7ebf35008dd8e9e0fdb621f976e4230c881099c85e8cf07eaa50e2", size = 1181826 }, + { url = "https://files.pythonhosted.org/packages/db/c6/d393e3185a276505182f7abd93fe714f3c444a2be9180798fa052347504e/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:165cf1820ea4a354985c2490a5205d4cc74661c934aca79dd0368232fff94e0f", size = 1239489 }, + { url = "https://files.pythonhosted.org/packages/b7/4d/bc07d1f1635d4897a202acc0ae11c2886eaa7325c359ba4741b47bf8e225/tiktoken-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6c43a675ca14f6f2749ba7f12075d37456015a24b859f2517b9beb4ef30807ec", size = 873820 }, ] [[package]] name = "tokenizers" version = "0.23.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/60/21f715d9faba5f5407ff759472ade058ec4a507ad62bcea47cb847239a73/tokenizers-0.23.1.tar.gz", hash = "sha256:1feeeadf865a7915adc25445dea30e9933e593c31bb96c277cee36de227c8bfa", size = 365748, upload-time = "2026-04-27T14:43:25.606Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/60/21f715d9faba5f5407ff759472ade058ec4a507ad62bcea47cb847239a73/tokenizers-0.23.1.tar.gz", hash = "sha256:1feeeadf865a7915adc25445dea30e9933e593c31bb96c277cee36de227c8bfa", size = 365748 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/39/b87a87d5bb9470610b80a2d31df42fcffeaf35118b8b97952b2aff598cc7/tokenizers-0.23.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e03d6ffcbe0d56ee9c1ccd070e70a13fa750727c0277e138152acbc0252c2224", size = 3146732, upload-time = "2026-04-27T14:43:15.427Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/6a/068ed9f6e444c9d7e9d55ce134181325700f3d7f30410721bdc8f848d727/tokenizers-0.23.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:e0948bbb1ac1d7cdfc9fb6d62c596e3b7550036ad60ecd654a66ad273326324e", size = 3054954, upload-time = "2026-04-27T14:43:13.745Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/36/e006edf031154cba92b8416057d92c3abe3635e4c4b0aa0b5b9bb39dde70/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf13402aff9bc533c89cb849ec3b412dc3fbeacc9744840e423d7bf3f7dc0e3", size = 3374081, upload-time = "2026-04-27T14:43:01.241Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/ef/7735d226f9c7f874a6bee5e3f27fb25ecabdf207d37b8cf45286d0795893/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f836ca703b89ae07919a309f9651f7a88fd5a33d5f718ba5ad0870ec0256bad6", size = 3247641, upload-time = "2026-04-27T14:43:03.856Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b9/d9/24827036f6e21297bfffda0768e58eb6096a4f411e932964a01707857931/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae848657742035523fdf261773630cb819a26995fcd3d9ecae0c1daf6e5a4959", size = 3585624, upload-time = "2026-04-27T14:43:10.664Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/9a/22f3582b3a4f49358293a5206e25317621ee4526bfe9cdaa0f07a12e770e/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53b09e85775d5187941e7bab30e941b4134ab4a7dd8c68e783d231fb7ca27c51", size = 3844062, upload-time = "2026-04-27T14:43:05.643Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/65/b8f8814eef95800f20721384136d9a1d22241d50b2874357cb70542c392f/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea5a0ce170074329faaa8ea3f6400ecde604b6678192688533af80980daae71a", size = 3460098, upload-time = "2026-04-27T14:43:08.854Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/d5/1353e5f677ec27c2494fb6a6725e82d56c985f53e90ec511369e7e4f02c6/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5075b405006415ea148a992d093699c66eb01952bf59f4d5727089a98bda45a4", size = 3346235, upload-time = "2026-04-27T14:43:12.377Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/89/39b6b8fc073fb6d413d0147aa333dc7eff7be65639ac9d19930a0b21bf33/tokenizers-0.23.1-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:56f3a77de629917652f876294dc9fe6bad4a0c43bc229dc72e59bb23a0f4729a", size = 3426398, upload-time = "2026-04-27T14:43:07.264Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/80/127c854da64827e5b79264ce524993a90dddcb320e5cd42412c5c02f9e8a/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9d10a6d957ef01896dc274e890eee27d41bd0e74ef31e60616f0fc311345184e", size = 9823279, upload-time = "2026-04-27T14:43:17.222Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/ba/44c2502feb1a058f096ddfb4e0996ef3225a01a388e1a9b094e91689fe93/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:1974288a609c343774f1b897c8b482c791ab17b75ab5c8c2b1737565c1d82288", size = 9644986, upload-time = "2026-04-27T14:43:19.45Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/c1/464019a9fb059870bfe4eebb4ba12208f3042035e258bf5e782906bd3847/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:120468fb4c24faf0543c835a4fabafa4deb3f20a035c9b6e83d0b553a97615d4", size = 9976181, upload-time = "2026-04-27T14:43:21.463Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/94/3ac1432bda31626071e9b6a12709b97ae05131c804b94c8f3ac622c5da32/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e3d8f40ea6268047de7046906326abed5134f27d4e8447b23763afe5808c8a96", size = 10113853, upload-time = "2026-04-27T14:43:23.617Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/dd/631b21433c771b1382535326f0eca80b9c9cee2e64961dd993bc9ac4669e/tokenizers-0.23.1-cp310-abi3-win32.whl", hash = "sha256:93120a930b919416da7cd10a2f606ac9919cc69cacae7980fa2140e277660948", size = 2536263, upload-time = "2026-04-27T14:43:29.888Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/97/c9/2553f72aaf65a2797d4229e37fa7fbe38ffbf3e32912d31bdd78b3323e59/tokenizers-0.23.1-cp310-abi3-win_amd64.whl", hash = "sha256:e7bfaf995c1bdbbd21d13539decb6650967013759318627d85daeb7881af16b7", size = 2798223, upload-time = "2026-04-27T14:43:28.51Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/2b/2be299bab55fc595e3d38567edb1a87f86e594842968fa9515a07bdcf422/tokenizers-0.23.1-cp310-abi3-win_arm64.whl", hash = "sha256:a26197957d8e4425dfba746315f3c425ea00cfa8367c5fbc4ec73447893dcea9", size = 2664127, upload-time = "2026-04-27T14:43:26.949Z" }, + { url = "https://files.pythonhosted.org/packages/87/39/b87a87d5bb9470610b80a2d31df42fcffeaf35118b8b97952b2aff598cc7/tokenizers-0.23.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e03d6ffcbe0d56ee9c1ccd070e70a13fa750727c0277e138152acbc0252c2224", size = 3146732 }, + { url = "https://files.pythonhosted.org/packages/e2/6a/068ed9f6e444c9d7e9d55ce134181325700f3d7f30410721bdc8f848d727/tokenizers-0.23.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:e0948bbb1ac1d7cdfc9fb6d62c596e3b7550036ad60ecd654a66ad273326324e", size = 3054954 }, + { url = "https://files.pythonhosted.org/packages/6c/36/e006edf031154cba92b8416057d92c3abe3635e4c4b0aa0b5b9bb39dde70/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf13402aff9bc533c89cb849ec3b412dc3fbeacc9744840e423d7bf3f7dc0e3", size = 3374081 }, + { url = "https://files.pythonhosted.org/packages/a2/ef/7735d226f9c7f874a6bee5e3f27fb25ecabdf207d37b8cf45286d0795893/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f836ca703b89ae07919a309f9651f7a88fd5a33d5f718ba5ad0870ec0256bad6", size = 3247641 }, + { url = "https://files.pythonhosted.org/packages/b9/d9/24827036f6e21297bfffda0768e58eb6096a4f411e932964a01707857931/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae848657742035523fdf261773630cb819a26995fcd3d9ecae0c1daf6e5a4959", size = 3585624 }, + { url = "https://files.pythonhosted.org/packages/0c/9a/22f3582b3a4f49358293a5206e25317621ee4526bfe9cdaa0f07a12e770e/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53b09e85775d5187941e7bab30e941b4134ab4a7dd8c68e783d231fb7ca27c51", size = 3844062 }, + { url = "https://files.pythonhosted.org/packages/7e/65/b8f8814eef95800f20721384136d9a1d22241d50b2874357cb70542c392f/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea5a0ce170074329faaa8ea3f6400ecde604b6678192688533af80980daae71a", size = 3460098 }, + { url = "https://files.pythonhosted.org/packages/0d/d5/1353e5f677ec27c2494fb6a6725e82d56c985f53e90ec511369e7e4f02c6/tokenizers-0.23.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5075b405006415ea148a992d093699c66eb01952bf59f4d5727089a98bda45a4", size = 3346235 }, + { url = "https://files.pythonhosted.org/packages/71/89/39b6b8fc073fb6d413d0147aa333dc7eff7be65639ac9d19930a0b21bf33/tokenizers-0.23.1-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:56f3a77de629917652f876294dc9fe6bad4a0c43bc229dc72e59bb23a0f4729a", size = 3426398 }, + { url = "https://files.pythonhosted.org/packages/0f/80/127c854da64827e5b79264ce524993a90dddcb320e5cd42412c5c02f9e8a/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9d10a6d957ef01896dc274e890eee27d41bd0e74ef31e60616f0fc311345184e", size = 9823279 }, + { url = "https://files.pythonhosted.org/packages/fe/ba/44c2502feb1a058f096ddfb4e0996ef3225a01a388e1a9b094e91689fe93/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:1974288a609c343774f1b897c8b482c791ab17b75ab5c8c2b1737565c1d82288", size = 9644986 }, + { url = "https://files.pythonhosted.org/packages/9e/c1/464019a9fb059870bfe4eebb4ba12208f3042035e258bf5e782906bd3847/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:120468fb4c24faf0543c835a4fabafa4deb3f20a035c9b6e83d0b553a97615d4", size = 9976181 }, + { url = "https://files.pythonhosted.org/packages/79/94/3ac1432bda31626071e9b6a12709b97ae05131c804b94c8f3ac622c5da32/tokenizers-0.23.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e3d8f40ea6268047de7046906326abed5134f27d4e8447b23763afe5808c8a96", size = 10113853 }, + { url = "https://files.pythonhosted.org/packages/6a/dd/631b21433c771b1382535326f0eca80b9c9cee2e64961dd993bc9ac4669e/tokenizers-0.23.1-cp310-abi3-win32.whl", hash = "sha256:93120a930b919416da7cd10a2f606ac9919cc69cacae7980fa2140e277660948", size = 2536263 }, + { url = "https://files.pythonhosted.org/packages/97/c9/2553f72aaf65a2797d4229e37fa7fbe38ffbf3e32912d31bdd78b3323e59/tokenizers-0.23.1-cp310-abi3-win_amd64.whl", hash = "sha256:e7bfaf995c1bdbbd21d13539decb6650967013759318627d85daeb7881af16b7", size = 2798223 }, + { url = "https://files.pythonhosted.org/packages/cd/2b/2be299bab55fc595e3d38567edb1a87f86e594842968fa9515a07bdcf422/tokenizers-0.23.1-cp310-abi3-win_arm64.whl", hash = "sha256:a26197957d8e4425dfba746315f3c425ea00cfa8367c5fbc4ec73447893dcea9", size = 2664127 }, ] [[package]] name = "tokonomics" version = "1.2.18" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyenv", extra = ["httpx"] }, { name = "httpx" }, @@ -5078,42 +4781,42 @@ dependencies = [ { name = "pydantic" }, { name = "schemez" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/0a/c8093f6836f898a9f587aa30786bba25f08e92c9c11f13f9e638b0b97688/tokonomics-1.2.18.tar.gz", hash = "sha256:6b40461c8c8ce71f4bc378c61a4743a55b20b5ddee50d27b9398c85c29279c17", size = 65636, upload-time = "2026-02-25T21:23:44.719Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/0a/c8093f6836f898a9f587aa30786bba25f08e92c9c11f13f9e638b0b97688/tokonomics-1.2.18.tar.gz", hash = "sha256:6b40461c8c8ce71f4bc378c61a4743a55b20b5ddee50d27b9398c85c29279c17", size = 65636 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/c4/fc9b68acb9d10a44b2c7121c8e02094c46244f9e7b07fa86ef47ee2d1073/tokonomics-1.2.18-py3-none-any.whl", hash = "sha256:8ff42a59c16be309a0d8d29e66a079f0b1ed72dce4380a545d8f20c32e4c9ab8", size = 103907, upload-time = "2026-02-25T21:23:43.281Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c4/fc9b68acb9d10a44b2c7121c8e02094c46244f9e7b07fa86ef47ee2d1073/tokonomics-1.2.18-py3-none-any.whl", hash = "sha256:8ff42a59c16be309a0d8d29e66a079f0b1ed72dce4380a545d8f20c32e4c9ab8", size = 103907 }, ] [[package]] name = "tomli" version = "2.4.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866 }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887 }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704 }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628 }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180 }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674 }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976 }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755 }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265 }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583 }, ] [[package]] name = "tomli-w" version = "1.2.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184, upload-time = "2025-01-15T12:07:24.262Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675, upload-time = "2025-01-15T12:07:22.074Z" }, + { url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675 }, ] [[package]] name = "toprompt" version = "1.0.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "clinspector" }, { name = "fieldz" }, @@ -5121,378 +4824,378 @@ dependencies = [ { name = "pydantic" }, { name = "sqlmodel" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1b/18/2a0be0481f39259e51781db49c5bb9b7fdb15883ae4794578f8668ecea5b/toprompt-1.0.0.tar.gz", hash = "sha256:9303c46a466c02152473d815e549ee507337b3b5c550fe1b5e5b65420f5464fa", size = 11336, upload-time = "2025-10-07T20:15:20.097Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/18/2a0be0481f39259e51781db49c5bb9b7fdb15883ae4794578f8668ecea5b/toprompt-1.0.0.tar.gz", hash = "sha256:9303c46a466c02152473d815e549ee507337b3b5c550fe1b5e5b65420f5464fa", size = 11336 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/9b/92fb91f937412b7fc7fd1121bafcfe247fe01c4117984c084227419a664f/toprompt-1.0.0-py3-none-any.whl", hash = "sha256:97edd8dfb941dc44374fd84959cd5f9dae9111e58202da714346bae3e18138f1", size = 12109, upload-time = "2025-10-07T20:15:19.077Z" }, + { url = "https://files.pythonhosted.org/packages/f6/9b/92fb91f937412b7fc7fd1121bafcfe247fe01c4117984c084227419a664f/toprompt-1.0.0-py3-none-any.whl", hash = "sha256:97edd8dfb941dc44374fd84959cd5f9dae9111e58202da714346bae3e18138f1", size = 12109 }, ] [[package]] name = "tqdm" version = "4.69.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dd/84/da0e5038228fa34dfd77c5026b173ed035d2a3ba31f1077590c013de2bff/tqdm-4.69.1.tar.gz", hash = "sha256:2be21080a0ce17e902c2f1baeb6a74bf551b67bbdfa4bc0109fad471d0b4cb0d", size = 793046, upload-time = "2026-07-24T14:22:02.08Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/84/da0e5038228fa34dfd77c5026b173ed035d2a3ba31f1077590c013de2bff/tqdm-4.69.1.tar.gz", hash = "sha256:2be21080a0ce17e902c2f1baeb6a74bf551b67bbdfa4bc0109fad471d0b4cb0d", size = 793046 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/50/5817619a0fca56aff06383dbfde7ae017b3ca383915b3f1e4713164273cf/tqdm-4.69.1-py3-none-any.whl", hash = "sha256:0a654b96f7a2660cceb615b56f307ec2bef96c515409014a429a561981ab52b4", size = 675452, upload-time = "2026-07-24T14:22:00.048Z" }, + { url = "https://files.pythonhosted.org/packages/01/50/5817619a0fca56aff06383dbfde7ae017b3ca383915b3f1e4713164273cf/tqdm-4.69.1-py3-none-any.whl", hash = "sha256:0a654b96f7a2660cceb615b56f307ec2bef96c515409014a429a561981ab52b4", size = 675452 }, ] [[package]] name = "tree-sitter" version = "0.26.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/03/5600b84aff2e6c4fe80cfebb4063fe2f50299521befe5f6092ab8c082f4a/tree_sitter-0.26.0.tar.gz", hash = "sha256:b40c219edccc4564530c96f8f1556f6202b37cda964d1cbd7bd2b7e68b40a245", size = 191423, upload-time = "2026-06-30T12:14:27.933Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/03/5600b84aff2e6c4fe80cfebb4063fe2f50299521befe5f6092ab8c082f4a/tree_sitter-0.26.0.tar.gz", hash = "sha256:b40c219edccc4564530c96f8f1556f6202b37cda964d1cbd7bd2b7e68b40a245", size = 191423 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/b0/465257cf8f972ad9f9812ec1cbaa8ec210ebebb601ade9a15881aa2436b4/tree_sitter-0.26.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ed0889dbed843ce45ede9f5169c0b2dea2222f12685844a03fadb81f12705867", size = 148893, upload-time = "2026-06-30T12:14:10.541Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/ec/19d093e854b45e807fecfdd26105c266f43aeecc39c4dc97992a7074ad5a/tree_sitter-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6189c6c340c7384357711e3d92645e96bfb79f7a502f86de1ebdb23eb43f7dab", size = 140829, upload-time = "2026-06-30T12:14:11.626Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9b/ee/87e74671ed63a837e7a1f17ab94aa3913871e033b27523d8e7b83d6f7ad0/tree_sitter-0.26.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ff2e0750b7daa722302838356d7b65e303829b7eb73c915df127ddba115e1d1", size = 639334, upload-time = "2026-06-30T12:14:12.836Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/e7/f7e04cd9dff6b6ac0adf23922796fbc76accd4cf4bcda50542748d485679/tree_sitter-0.26.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7075ef857ef86f327dbb72d1e2574dda78db5754b3a1fca6506acd7fe5d561a7", size = 668102, upload-time = "2026-06-30T12:14:14.035Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/90/0bfb16b7894fea728c774a89d5af421a9368a2f913bbd4e8dcab7caaecfb/tree_sitter-0.26.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:26c996c1edfee86e977bb3f5462e74fcec0d0b0db1e85a3c475875763caa03be", size = 648560, upload-time = "2026-06-30T12:14:15.302Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/e6/0fe05ba396e9623b0ae40ccf34171336b8701ec8d7bd0ee9f5224d638665/tree_sitter-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00289bfe7978f3e0dc0ce69813a20fa9f44ea4c100b3ec62043e5eb74ccfc3a2", size = 665121, upload-time = "2026-06-30T12:14:16.403Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/d2/a944b1ca35bed6068dc84a9967aaf3049d8cc0b7a36179eea8787270a6ab/tree_sitter-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:93e220cab7e6a823efeb2046c49171427de92ef71c7c681c01820d14d8d3721f", size = 129615, upload-time = "2026-06-30T12:14:17.463Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/09/ef/c7ca48293580d2249f36940c4eed5b4ddeb9ce75baf9a4ef30621987e0c7/tree_sitter-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:b31a8195d2f224224c530ac814632d98c1dcc123d227442c07c736e86b70d564", size = 116525, upload-time = "2026-06-30T12:14:18.53Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b0/465257cf8f972ad9f9812ec1cbaa8ec210ebebb601ade9a15881aa2436b4/tree_sitter-0.26.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ed0889dbed843ce45ede9f5169c0b2dea2222f12685844a03fadb81f12705867", size = 148893 }, + { url = "https://files.pythonhosted.org/packages/a1/ec/19d093e854b45e807fecfdd26105c266f43aeecc39c4dc97992a7074ad5a/tree_sitter-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6189c6c340c7384357711e3d92645e96bfb79f7a502f86de1ebdb23eb43f7dab", size = 140829 }, + { url = "https://files.pythonhosted.org/packages/9b/ee/87e74671ed63a837e7a1f17ab94aa3913871e033b27523d8e7b83d6f7ad0/tree_sitter-0.26.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ff2e0750b7daa722302838356d7b65e303829b7eb73c915df127ddba115e1d1", size = 639334 }, + { url = "https://files.pythonhosted.org/packages/66/e7/f7e04cd9dff6b6ac0adf23922796fbc76accd4cf4bcda50542748d485679/tree_sitter-0.26.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7075ef857ef86f327dbb72d1e2574dda78db5754b3a1fca6506acd7fe5d561a7", size = 668102 }, + { url = "https://files.pythonhosted.org/packages/d3/90/0bfb16b7894fea728c774a89d5af421a9368a2f913bbd4e8dcab7caaecfb/tree_sitter-0.26.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:26c996c1edfee86e977bb3f5462e74fcec0d0b0db1e85a3c475875763caa03be", size = 648560 }, + { url = "https://files.pythonhosted.org/packages/cd/e6/0fe05ba396e9623b0ae40ccf34171336b8701ec8d7bd0ee9f5224d638665/tree_sitter-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00289bfe7978f3e0dc0ce69813a20fa9f44ea4c100b3ec62043e5eb74ccfc3a2", size = 665121 }, + { url = "https://files.pythonhosted.org/packages/eb/d2/a944b1ca35bed6068dc84a9967aaf3049d8cc0b7a36179eea8787270a6ab/tree_sitter-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:93e220cab7e6a823efeb2046c49171427de92ef71c7c681c01820d14d8d3721f", size = 129615 }, + { url = "https://files.pythonhosted.org/packages/09/ef/c7ca48293580d2249f36940c4eed5b4ddeb9ce75baf9a4ef30621987e0c7/tree_sitter-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:b31a8195d2f224224c530ac814632d98c1dcc123d227442c07c736e86b70d564", size = 116525 }, ] [[package]] name = "tree-sitter-c" version = "0.24.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/c9/3834f3d9278251aea7312274971bc4c45b17aec2490fd4b884d93bd7019a/tree_sitter_c-0.24.2.tar.gz", hash = "sha256:1628584df0299b5a340aa63f8e67b6c97c91517f52fa7e7a4c557e40adb330a9", size = 228397, upload-time = "2026-04-22T08:06:14.491Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/c9/3834f3d9278251aea7312274971bc4c45b17aec2490fd4b884d93bd7019a/tree_sitter_c-0.24.2.tar.gz", hash = "sha256:1628584df0299b5a340aa63f8e67b6c97c91517f52fa7e7a4c557e40adb330a9", size = 228397 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/c1/26ed17730ec2c17bedc1b673349e5e0a466c578e3eb0327c3b73cf52bf97/tree_sitter_c-0.24.2-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:4d4579a8b54f0a442f903d88d3304cab77cd5c2031d4015baa4f2f8e15d6dcb7", size = 81016, upload-time = "2026-04-22T08:06:07.208Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/1c/1140db75e7e375cda3c68792a33826c4fd40b5b98c3259d93c75f6c8368f/tree_sitter_c-0.24.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:97bc80a224d48215d4e6e6376bf30d114f4c317b8145ff1b02afe785d4ba7bdd", size = 86213, upload-time = "2026-04-22T08:06:08.136Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/8c/0dfb88d726f8821d1c4c36042f092be974a800afd734307a595b8604190c/tree_sitter_c-0.24.2-cp310-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5041ef67eb68ce6bc8bb0b1f8ef3a5585ce523dae0c7eec109ab0627dd75aede", size = 94264, upload-time = "2026-04-22T08:06:08.918Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/78/47dc570e7aee6b0a1ecc2520b30639cc2b06003154c9ab0672d86bf720d5/tree_sitter_c-0.24.2-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c098bedcd5ac86ff93fa734d51d1dd86aed40fd5ed7d634c7af11380a0469969", size = 94560, upload-time = "2026-04-22T08:06:09.852Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/29/37/75d59d3f74f4cfc00f04472917e933d8a9c9fdc6eff980ef9552e010e6aa/tree_sitter_c-0.24.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:82842c5a5f2acd93f4de10038c33ac179c8979defc39376f990348d6289e933b", size = 94023, upload-time = "2026-04-22T08:06:10.682Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/57/8fc655d5a446a70a637e92b98bd2fdaab88bf5bb5b36076ac4add544808d/tree_sitter_c-0.24.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2b42e8e22202c251f8629306f9321233542e07a6e01611b5fe83489272143eb", size = 94160, upload-time = "2026-04-22T08:06:11.497Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/f7/72a1d6b42dd31fd37e03ff67e7dc5ee572301499e6b216002b8dd42a1714/tree_sitter_c-0.24.2-cp310-abi3-win_amd64.whl", hash = "sha256:abb549225091f7b25df2dd3a0143ece6e208f7055d8bcb4700b41ee79b9ef1e1", size = 84669, upload-time = "2026-04-22T08:06:12.347Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/9d/7475d9ae8ef679aa36c7dfe6c903ab78e573651c68b6ef9862d6a3f994db/tree_sitter_c-0.24.2-cp310-abi3-win_arm64.whl", hash = "sha256:4a2f4371cd816cc3153458f69062135ebb2ea5f275ddd90494e5c823d778204a", size = 82956, upload-time = "2026-04-22T08:06:13.364Z" }, + { url = "https://files.pythonhosted.org/packages/28/c1/26ed17730ec2c17bedc1b673349e5e0a466c578e3eb0327c3b73cf52bf97/tree_sitter_c-0.24.2-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:4d4579a8b54f0a442f903d88d3304cab77cd5c2031d4015baa4f2f8e15d6dcb7", size = 81016 }, + { url = "https://files.pythonhosted.org/packages/c1/1c/1140db75e7e375cda3c68792a33826c4fd40b5b98c3259d93c75f6c8368f/tree_sitter_c-0.24.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:97bc80a224d48215d4e6e6376bf30d114f4c317b8145ff1b02afe785d4ba7bdd", size = 86213 }, + { url = "https://files.pythonhosted.org/packages/e9/8c/0dfb88d726f8821d1c4c36042f092be974a800afd734307a595b8604190c/tree_sitter_c-0.24.2-cp310-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5041ef67eb68ce6bc8bb0b1f8ef3a5585ce523dae0c7eec109ab0627dd75aede", size = 94264 }, + { url = "https://files.pythonhosted.org/packages/87/78/47dc570e7aee6b0a1ecc2520b30639cc2b06003154c9ab0672d86bf720d5/tree_sitter_c-0.24.2-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c098bedcd5ac86ff93fa734d51d1dd86aed40fd5ed7d634c7af11380a0469969", size = 94560 }, + { url = "https://files.pythonhosted.org/packages/29/37/75d59d3f74f4cfc00f04472917e933d8a9c9fdc6eff980ef9552e010e6aa/tree_sitter_c-0.24.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:82842c5a5f2acd93f4de10038c33ac179c8979defc39376f990348d6289e933b", size = 94023 }, + { url = "https://files.pythonhosted.org/packages/64/57/8fc655d5a446a70a637e92b98bd2fdaab88bf5bb5b36076ac4add544808d/tree_sitter_c-0.24.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2b42e8e22202c251f8629306f9321233542e07a6e01611b5fe83489272143eb", size = 94160 }, + { url = "https://files.pythonhosted.org/packages/c1/f7/72a1d6b42dd31fd37e03ff67e7dc5ee572301499e6b216002b8dd42a1714/tree_sitter_c-0.24.2-cp310-abi3-win_amd64.whl", hash = "sha256:abb549225091f7b25df2dd3a0143ece6e208f7055d8bcb4700b41ee79b9ef1e1", size = 84669 }, + { url = "https://files.pythonhosted.org/packages/e2/9d/7475d9ae8ef679aa36c7dfe6c903ab78e573651c68b6ef9862d6a3f994db/tree_sitter_c-0.24.2-cp310-abi3-win_arm64.whl", hash = "sha256:4a2f4371cd816cc3153458f69062135ebb2ea5f275ddd90494e5c823d778204a", size = 82956 }, ] [[package]] name = "tree-sitter-cpp" version = "0.23.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/20/2c/4dd63d705a8933543cad9b92ff31be849b164fec91a6eb63475ebc9ce668/tree_sitter_cpp-0.23.4.tar.gz", hash = "sha256:6a59c4cebb1ad1dc2e8d586cf8a72b39d21b8108b7b139d089719e81a339e41d", size = 940358, upload-time = "2024-11-11T06:59:24.934Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/2c/4dd63d705a8933543cad9b92ff31be849b164fec91a6eb63475ebc9ce668/tree_sitter_cpp-0.23.4.tar.gz", hash = "sha256:6a59c4cebb1ad1dc2e8d586cf8a72b39d21b8108b7b139d089719e81a339e41d", size = 940358 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b6/ac/11d56670f7b048362db872ca866fd00ba2002a322ab179f047b7c0fb2910/tree_sitter_cpp-0.23.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aacb1759f0efd9dbc25bd8ee88184a340483018869f75412d9c3bc32c039a520", size = 287861, upload-time = "2024-11-11T06:59:15.005Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/1c/0337c016bdc00a77a3326d12f10ee836401dd28f27db6fd5b7734bfb21ed/tree_sitter_cpp-0.23.4-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc3c404d9f0cbd87951213a85440afbf4c31e718f8d907fa9ee12bea4b8d276f", size = 315513, upload-time = "2024-11-11T06:59:16.679Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/7b/dd38c049b10ed7fda118b903a1d28a8b55a36b98c30606ef90e8f374c6de/tree_sitter_cpp-0.23.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc43ddf1279d5d5a4ef190373f4cb16522801bec4492bcd4754edf2aeba2b7b", size = 334813, upload-time = "2024-11-11T06:59:18.253Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/4d/23e390234d2acd351f5563b1079c515d7c1fe13ddb7392cee543be74dda3/tree_sitter_cpp-0.23.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:773d2cafc08bbc0f998687fa33f42f378c1a371cdb582870c4d13abb06092706", size = 316110, upload-time = "2024-11-11T06:59:19.823Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/32/c7/b94a7e0e803af9d3bd4608fb4f0cfb2e9e233abaf0a38c928bfb0b1a025d/tree_sitter_cpp-0.23.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:247d127f0eb6574b0f6b30c0151e0bd0774e2e7acf9c558bdf9fbb8adc2e80c0", size = 308242, upload-time = "2024-11-11T06:59:21.466Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/7e/909e52b3dec09c475140b0e175511e275d0d00ba2dbd7c68102d377ae0f6/tree_sitter_cpp-0.23.4-cp39-abi3-win_amd64.whl", hash = "sha256:68606a45bea92669d155399e1239f771a7767d8683cd8f8e30e7d813107030ca", size = 290997, upload-time = "2024-11-11T06:59:22.432Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/6a/65435d4d1f4c735be7ffe52d7c2e7b8a7f7c2790343a2719c60c548611c8/tree_sitter_cpp-0.23.4-cp39-abi3-win_arm64.whl", hash = "sha256:712f84f18be94cbe2a148fa4fdf40fcf4a8c25a8f7670efb9f8a47ddec2fc281", size = 288203, upload-time = "2024-11-11T06:59:23.404Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ac/11d56670f7b048362db872ca866fd00ba2002a322ab179f047b7c0fb2910/tree_sitter_cpp-0.23.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aacb1759f0efd9dbc25bd8ee88184a340483018869f75412d9c3bc32c039a520", size = 287861 }, + { url = "https://files.pythonhosted.org/packages/12/1c/0337c016bdc00a77a3326d12f10ee836401dd28f27db6fd5b7734bfb21ed/tree_sitter_cpp-0.23.4-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc3c404d9f0cbd87951213a85440afbf4c31e718f8d907fa9ee12bea4b8d276f", size = 315513 }, + { url = "https://files.pythonhosted.org/packages/b3/7b/dd38c049b10ed7fda118b903a1d28a8b55a36b98c30606ef90e8f374c6de/tree_sitter_cpp-0.23.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc43ddf1279d5d5a4ef190373f4cb16522801bec4492bcd4754edf2aeba2b7b", size = 334813 }, + { url = "https://files.pythonhosted.org/packages/6a/4d/23e390234d2acd351f5563b1079c515d7c1fe13ddb7392cee543be74dda3/tree_sitter_cpp-0.23.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:773d2cafc08bbc0f998687fa33f42f378c1a371cdb582870c4d13abb06092706", size = 316110 }, + { url = "https://files.pythonhosted.org/packages/32/c7/b94a7e0e803af9d3bd4608fb4f0cfb2e9e233abaf0a38c928bfb0b1a025d/tree_sitter_cpp-0.23.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:247d127f0eb6574b0f6b30c0151e0bd0774e2e7acf9c558bdf9fbb8adc2e80c0", size = 308242 }, + { url = "https://files.pythonhosted.org/packages/37/7e/909e52b3dec09c475140b0e175511e275d0d00ba2dbd7c68102d377ae0f6/tree_sitter_cpp-0.23.4-cp39-abi3-win_amd64.whl", hash = "sha256:68606a45bea92669d155399e1239f771a7767d8683cd8f8e30e7d813107030ca", size = 290997 }, + { url = "https://files.pythonhosted.org/packages/d4/6a/65435d4d1f4c735be7ffe52d7c2e7b8a7f7c2790343a2719c60c548611c8/tree_sitter_cpp-0.23.4-cp39-abi3-win_arm64.whl", hash = "sha256:712f84f18be94cbe2a148fa4fdf40fcf4a8c25a8f7670efb9f8a47ddec2fc281", size = 288203 }, ] [[package]] name = "tree-sitter-go" version = "0.25.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/05/727308adbbc79bcb1c92fc0ea10556a735f9d0f0a5435a18f59d40f7fd77/tree_sitter_go-0.25.0.tar.gz", hash = "sha256:a7466e9b8d94dda94cae8d91629f26edb2d26166fd454d4831c3bf6dfa2e8d68", size = 93890, upload-time = "2025-08-29T06:20:25.044Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/05/727308adbbc79bcb1c92fc0ea10556a735f9d0f0a5435a18f59d40f7fd77/tree_sitter_go-0.25.0.tar.gz", hash = "sha256:a7466e9b8d94dda94cae8d91629f26edb2d26166fd454d4831c3bf6dfa2e8d68", size = 93890 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/aa/0984707acc2b9bb461fe4a41e7e0fc5b2b1e245c32820f0c83b3c602957c/tree_sitter_go-0.25.0-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b852993063a3429a443e7bd0aa376dd7dd329d595819fabf56ac4cf9d7257b54", size = 47117, upload-time = "2025-08-29T06:20:14.286Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/32/16/dd4cb124b35e99239ab3624225da07d4cb8da4d8564ed81d03fcb3a6ba9f/tree_sitter_go-0.25.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:503b81a2b4c31e302869a1de3a352ad0912ccab3df9ac9950197b0a9ceeabd8f", size = 48674, upload-time = "2025-08-29T06:20:17.557Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/fb/b30d63a08044115d8b8bd196c6c2ab4325fb8db5757249a4ef0563966e2e/tree_sitter_go-0.25.0-cp310-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04b3b3cb4aff18e74e28d49b716c6f24cb71ddfdd66768987e26e4d0fa812f74", size = 66418, upload-time = "2025-08-29T06:20:18.345Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/21/d3d88a30ad007419b2c97b3baeeef7431407faf9f686195b6f1cad0aedf9/tree_sitter_go-0.25.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:148255aca2f54b90d48c48a9dbb4c7faad6cad310a980b2c5a5a9822057ed145", size = 72006, upload-time = "2025-08-29T06:20:19.14Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/d0/0dd6442353ced8a88bbda9e546f4ea29e381b59b5a40b122e5abb586bb6c/tree_sitter_go-0.25.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4d338116cdf8a6c6ff990d2441929b41323ef17c710407abe0993c13417d6aad", size = 70603, upload-time = "2025-08-29T06:20:21.544Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/e2/ee5e09f63504fc286539535d374d2eaa0e7d489b80f8f744bb3962aff22a/tree_sitter_go-0.25.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5608e089d2a29fa8d2b327abeb2ad1cdb8e223c440a6b0ceab0d3fa80bdeebae", size = 66088, upload-time = "2025-08-29T06:20:22.336Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6e/b6/d9142583374720e79aca9ccb394b3795149a54c012e1dfd80738df2d984e/tree_sitter_go-0.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:30d4ada57a223dfc2c32d942f44d284d40f3d1215ddcf108f96807fd36d53022", size = 48152, upload-time = "2025-08-29T06:20:23.089Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/00/9a2638e7339236f5b01622952a4d71c1474dd3783d1982a89555fc1f03b1/tree_sitter_go-0.25.0-cp310-abi3-win_arm64.whl", hash = "sha256:d5d62362059bf79997340773d47cc7e7e002883b527a05cca829c46e40b70ded", size = 46752, upload-time = "2025-08-29T06:20:24.235Z" }, + { url = "https://files.pythonhosted.org/packages/ca/aa/0984707acc2b9bb461fe4a41e7e0fc5b2b1e245c32820f0c83b3c602957c/tree_sitter_go-0.25.0-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b852993063a3429a443e7bd0aa376dd7dd329d595819fabf56ac4cf9d7257b54", size = 47117 }, + { url = "https://files.pythonhosted.org/packages/32/16/dd4cb124b35e99239ab3624225da07d4cb8da4d8564ed81d03fcb3a6ba9f/tree_sitter_go-0.25.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:503b81a2b4c31e302869a1de3a352ad0912ccab3df9ac9950197b0a9ceeabd8f", size = 48674 }, + { url = "https://files.pythonhosted.org/packages/86/fb/b30d63a08044115d8b8bd196c6c2ab4325fb8db5757249a4ef0563966e2e/tree_sitter_go-0.25.0-cp310-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04b3b3cb4aff18e74e28d49b716c6f24cb71ddfdd66768987e26e4d0fa812f74", size = 66418 }, + { url = "https://files.pythonhosted.org/packages/26/21/d3d88a30ad007419b2c97b3baeeef7431407faf9f686195b6f1cad0aedf9/tree_sitter_go-0.25.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:148255aca2f54b90d48c48a9dbb4c7faad6cad310a980b2c5a5a9822057ed145", size = 72006 }, + { url = "https://files.pythonhosted.org/packages/cd/d0/0dd6442353ced8a88bbda9e546f4ea29e381b59b5a40b122e5abb586bb6c/tree_sitter_go-0.25.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4d338116cdf8a6c6ff990d2441929b41323ef17c710407abe0993c13417d6aad", size = 70603 }, + { url = "https://files.pythonhosted.org/packages/01/e2/ee5e09f63504fc286539535d374d2eaa0e7d489b80f8f744bb3962aff22a/tree_sitter_go-0.25.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5608e089d2a29fa8d2b327abeb2ad1cdb8e223c440a6b0ceab0d3fa80bdeebae", size = 66088 }, + { url = "https://files.pythonhosted.org/packages/6e/b6/d9142583374720e79aca9ccb394b3795149a54c012e1dfd80738df2d984e/tree_sitter_go-0.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:30d4ada57a223dfc2c32d942f44d284d40f3d1215ddcf108f96807fd36d53022", size = 48152 }, + { url = "https://files.pythonhosted.org/packages/9e/00/9a2638e7339236f5b01622952a4d71c1474dd3783d1982a89555fc1f03b1/tree_sitter_go-0.25.0-cp310-abi3-win_arm64.whl", hash = "sha256:d5d62362059bf79997340773d47cc7e7e002883b527a05cca829c46e40b70ded", size = 46752 }, ] [[package]] name = "tree-sitter-javascript" version = "0.25.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/59/e0/e63103c72a9d3dfd89a31e02e660263ad84b7438e5f44ee82e443e65bbde/tree_sitter_javascript-0.25.0.tar.gz", hash = "sha256:329b5414874f0588a98f1c291f1b28138286617aa907746ffe55adfdcf963f38", size = 132338, upload-time = "2025-09-01T07:13:44.792Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/e0/e63103c72a9d3dfd89a31e02e660263ad84b7438e5f44ee82e443e65bbde/tree_sitter_javascript-0.25.0.tar.gz", hash = "sha256:329b5414874f0588a98f1c291f1b28138286617aa907746ffe55adfdcf963f38", size = 132338 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/df/5106ac250cd03661ebc3cc75da6b3d9f6800a3606393a0122eca58038104/tree_sitter_javascript-0.25.0-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b70f887fb269d6e58c349d683f59fa647140c410cfe2bee44a883b20ec92e3dc", size = 64052, upload-time = "2025-09-01T07:13:36.865Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/8f/6b4b2bc90d8ab3955856ce852cc9d1e82c81d7ab9646385f0e75ffd5b5d3/tree_sitter_javascript-0.25.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:8264a996b8845cfce06965152a013b5d9cbb7d199bc3503e12b5682e62bb1de1", size = 66440, upload-time = "2025-09-01T07:13:37.962Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/c4/7da74ecdcd8a398f88bd003a87c65403b5fe0e958cdd43fbd5fd4a398fcf/tree_sitter_javascript-0.25.0-cp310-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9dc04ba91fc8583344e57c1f1ed5b2c97ecaaf47480011b92fbeab8dda96db75", size = 99728, upload-time = "2025-09-01T07:13:38.755Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/c8/97da3af4796495e46421e9344738addb3602fa6426ea695be3fcbadbee37/tree_sitter_javascript-0.25.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:199d09985190852e0912da2b8d26c932159be314bc04952cf917ed0e4c633e6b", size = 106072, upload-time = "2025-09-01T07:13:39.798Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/be/c964e8130be08cc9bd6627d845f0e4460945b158429d39510953bbcb8fcc/tree_sitter_javascript-0.25.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dfcf789064c58dc13c0a4edb550acacfc6f0f280577f1e7a00de3e89fc7f8ddc", size = 104388, upload-time = "2025-09-01T07:13:40.866Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/89/9b773dee0f8961d1bb8d7baf0a204ab587618df19897c1ef260916f318ec/tree_sitter_javascript-0.25.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b852d3aee8a36186dbcc32c798b11b4869f9b5041743b63b65c2ef793db7a54", size = 98377, upload-time = "2025-09-01T07:13:41.838Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/dc/d90cb1790f8cec9b4878d278ad9faf7c8f893189ce0f855304fd704fc274/tree_sitter_javascript-0.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:e5ed840f5bd4a3f0272e441d19429b26eedc257abe5574c8546da6b556865e3c", size = 62975, upload-time = "2025-09-01T07:13:42.828Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/1f/f9eba1038b7d4394410f3c0a6ec2122b590cd7acb03f196e52fa57ebbe72/tree_sitter_javascript-0.25.0-cp310-abi3-win_arm64.whl", hash = "sha256:622a69d677aa7f6ee2931d8c77c981a33f0ebb6d275aa9d43d3397c879a9bb0b", size = 61668, upload-time = "2025-09-01T07:13:43.803Z" }, + { url = "https://files.pythonhosted.org/packages/2c/df/5106ac250cd03661ebc3cc75da6b3d9f6800a3606393a0122eca58038104/tree_sitter_javascript-0.25.0-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b70f887fb269d6e58c349d683f59fa647140c410cfe2bee44a883b20ec92e3dc", size = 64052 }, + { url = "https://files.pythonhosted.org/packages/b1/8f/6b4b2bc90d8ab3955856ce852cc9d1e82c81d7ab9646385f0e75ffd5b5d3/tree_sitter_javascript-0.25.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:8264a996b8845cfce06965152a013b5d9cbb7d199bc3503e12b5682e62bb1de1", size = 66440 }, + { url = "https://files.pythonhosted.org/packages/5f/c4/7da74ecdcd8a398f88bd003a87c65403b5fe0e958cdd43fbd5fd4a398fcf/tree_sitter_javascript-0.25.0-cp310-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9dc04ba91fc8583344e57c1f1ed5b2c97ecaaf47480011b92fbeab8dda96db75", size = 99728 }, + { url = "https://files.pythonhosted.org/packages/96/c8/97da3af4796495e46421e9344738addb3602fa6426ea695be3fcbadbee37/tree_sitter_javascript-0.25.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:199d09985190852e0912da2b8d26c932159be314bc04952cf917ed0e4c633e6b", size = 106072 }, + { url = "https://files.pythonhosted.org/packages/13/be/c964e8130be08cc9bd6627d845f0e4460945b158429d39510953bbcb8fcc/tree_sitter_javascript-0.25.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dfcf789064c58dc13c0a4edb550acacfc6f0f280577f1e7a00de3e89fc7f8ddc", size = 104388 }, + { url = "https://files.pythonhosted.org/packages/ee/89/9b773dee0f8961d1bb8d7baf0a204ab587618df19897c1ef260916f318ec/tree_sitter_javascript-0.25.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b852d3aee8a36186dbcc32c798b11b4869f9b5041743b63b65c2ef793db7a54", size = 98377 }, + { url = "https://files.pythonhosted.org/packages/3b/dc/d90cb1790f8cec9b4878d278ad9faf7c8f893189ce0f855304fd704fc274/tree_sitter_javascript-0.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:e5ed840f5bd4a3f0272e441d19429b26eedc257abe5574c8546da6b556865e3c", size = 62975 }, + { url = "https://files.pythonhosted.org/packages/2e/1f/f9eba1038b7d4394410f3c0a6ec2122b590cd7acb03f196e52fa57ebbe72/tree_sitter_javascript-0.25.0-cp310-abi3-win_arm64.whl", hash = "sha256:622a69d677aa7f6ee2931d8c77c981a33f0ebb6d275aa9d43d3397c879a9bb0b", size = 61668 }, ] [[package]] name = "tree-sitter-json" version = "0.24.8" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d7/29/e92df6dca3a6b2ab1c179978be398059817e1173fbacd47e832aaff3446b/tree_sitter_json-0.24.8.tar.gz", hash = "sha256:ca8486e52e2d261819311d35cf98656123d59008c3b7dcf91e61d2c0c6f3120e", size = 8155, upload-time = "2024-11-11T06:05:00.667Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/29/e92df6dca3a6b2ab1c179978be398059817e1173fbacd47e832aaff3446b/tree_sitter_json-0.24.8.tar.gz", hash = "sha256:ca8486e52e2d261819311d35cf98656123d59008c3b7dcf91e61d2c0c6f3120e", size = 8155 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/41/84866232980fb3cf0cff46f5af2dbb9bfa3324b32614c6a9af3d08926b72/tree_sitter_json-0.24.8-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:59ac06c6db1877d0e2076bce54a5fddcdd2fc38ca778905662e80fa9ffcea2ab", size = 8718, upload-time = "2024-11-11T06:04:49.779Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/31/102c15948d97b135611d6a995c97a3933c0e9745f25737723977f58e142c/tree_sitter_json-0.24.8-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:62b4c45b561db31436a81a3f037f71ec29049f4fc9bf5269b6ec3ebaaa35a1cd", size = 9163, upload-time = "2024-11-11T06:04:51.275Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/64/aa44ea2f3d2e76ec086ce83902eb26b2ed0a92d3fd5e2714c9cb007e90d1/tree_sitter_json-0.24.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8627f7d375fda9fc193ebee368c453f374f65c2f25c58b6fea4e6b49a7fccbc", size = 17726, upload-time = "2024-11-11T06:04:52.732Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/08/10001992526670e0d6f24c571b179f0ece90e5e014a4b98a3ce076884f32/tree_sitter_json-0.24.8-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85cca779872f7278f3a74eb38533d34b9c4de4fd548615e3361fa64fe350ad0a", size = 17236, upload-time = "2024-11-11T06:04:54.189Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/64/908e9e0bd84fe3c81c564115d3bbe0e49b0e152784bbaf153d749d00bbe6/tree_sitter_json-0.24.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:deeb45850dcc52990fbb52c80196492a099e3fa3512d928a390a91cf061068cc", size = 16071, upload-time = "2024-11-11T06:04:55.628Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/df/31daab1eedb445bef208a04fc35428de3afe2b37075fec84d7737e1c69de/tree_sitter_json-0.24.8-cp39-abi3-win_amd64.whl", hash = "sha256:e4849a03cd7197267b2688a4506a90a13568a8e0e8588080bd0212fcb38974e3", size = 11457, upload-time = "2024-11-11T06:04:57.698Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/3d/902d2f3125b6b90cebf404b63ca775bc6d82071ccc76c0d10fabfeb2febe/tree_sitter_json-0.24.8-cp39-abi3-win_arm64.whl", hash = "sha256:591e0096c882d12668b88f30d3ca6f85b9db3406910eaaab6afb6b17d65367dd", size = 10174, upload-time = "2024-11-11T06:04:59.309Z" }, + { url = "https://files.pythonhosted.org/packages/42/41/84866232980fb3cf0cff46f5af2dbb9bfa3324b32614c6a9af3d08926b72/tree_sitter_json-0.24.8-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:59ac06c6db1877d0e2076bce54a5fddcdd2fc38ca778905662e80fa9ffcea2ab", size = 8718 }, + { url = "https://files.pythonhosted.org/packages/5c/31/102c15948d97b135611d6a995c97a3933c0e9745f25737723977f58e142c/tree_sitter_json-0.24.8-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:62b4c45b561db31436a81a3f037f71ec29049f4fc9bf5269b6ec3ebaaa35a1cd", size = 9163 }, + { url = "https://files.pythonhosted.org/packages/28/64/aa44ea2f3d2e76ec086ce83902eb26b2ed0a92d3fd5e2714c9cb007e90d1/tree_sitter_json-0.24.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8627f7d375fda9fc193ebee368c453f374f65c2f25c58b6fea4e6b49a7fccbc", size = 17726 }, + { url = "https://files.pythonhosted.org/packages/77/08/10001992526670e0d6f24c571b179f0ece90e5e014a4b98a3ce076884f32/tree_sitter_json-0.24.8-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85cca779872f7278f3a74eb38533d34b9c4de4fd548615e3361fa64fe350ad0a", size = 17236 }, + { url = "https://files.pythonhosted.org/packages/92/64/908e9e0bd84fe3c81c564115d3bbe0e49b0e152784bbaf153d749d00bbe6/tree_sitter_json-0.24.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:deeb45850dcc52990fbb52c80196492a099e3fa3512d928a390a91cf061068cc", size = 16071 }, + { url = "https://files.pythonhosted.org/packages/53/df/31daab1eedb445bef208a04fc35428de3afe2b37075fec84d7737e1c69de/tree_sitter_json-0.24.8-cp39-abi3-win_amd64.whl", hash = "sha256:e4849a03cd7197267b2688a4506a90a13568a8e0e8588080bd0212fcb38974e3", size = 11457 }, + { url = "https://files.pythonhosted.org/packages/6c/3d/902d2f3125b6b90cebf404b63ca775bc6d82071ccc76c0d10fabfeb2febe/tree_sitter_json-0.24.8-cp39-abi3-win_arm64.whl", hash = "sha256:591e0096c882d12668b88f30d3ca6f85b9db3406910eaaab6afb6b17d65367dd", size = 10174 }, ] [[package]] name = "tree-sitter-language-pack" version = "1.13.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tree-sitter" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/9e/01be7a94fc69204350dc99707730aa4f32906cdb8b0b5856ff43fd0c60d5/tree_sitter_language_pack-1.13.3.tar.gz", hash = "sha256:e0e0287bf5a2f3d8a382136b1565206988417ece502b796f4b6f7fefb832963c", size = 82100, upload-time = "2026-07-21T14:10:20.469Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/9e/01be7a94fc69204350dc99707730aa4f32906cdb8b0b5856ff43fd0c60d5/tree_sitter_language_pack-1.13.3.tar.gz", hash = "sha256:e0e0287bf5a2f3d8a382136b1565206988417ece502b796f4b6f7fefb832963c", size = 82100 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/75/a0/69ac382a8e610a2e521fd1c661a59127b5387fad8789355c9fa60b27765a/tree_sitter_language_pack-1.13.3-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9229a14185583a0acfd9946154d491908078cc7a54150bf03268aed5a67cf3c3", size = 2141847, upload-time = "2026-07-21T14:10:11.626Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bb/57/24ea7493d5704fcce545707732c652d7fd1cbe82c6f824cdc26554124069/tree_sitter_language_pack-1.13.3-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:8435aabc1e5537e97e0a5893b6bf8d501ee7e55f93ee813e98711c5787fdbf78", size = 2033141, upload-time = "2026-07-21T14:10:13.131Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/02/b476c812681922ac2763100aeb98040b880e6fae9bf5960068fb5652356d/tree_sitter_language_pack-1.13.3-cp310-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:3096595f83c3ad1c8cdace1db737e074f4ef3c798534deb2fe758acda0d7e211", size = 2190490, upload-time = "2026-07-21T14:10:14.66Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6e/f8/bfb863ffd53eb888308ffebeb9f73ed24bda0eac10393b9ec1b6774abe06/tree_sitter_language_pack-1.13.3-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ebcd8fa9435ff956bd82eeea21f492fb2ccfefd9be909fe5cdebabb892c4b034", size = 2301379, upload-time = "2026-07-21T14:10:16.147Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/32/5a395972eee620b763493f6abf527dd76dea0cef91010ab348137cb51a2d/tree_sitter_language_pack-1.13.3-cp310-abi3-win_amd64.whl", hash = "sha256:c67c322370c30fa802e01532933709d0c29de8337d911eb693692a996993e55d", size = 2076066, upload-time = "2026-07-21T14:10:17.614Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/56/b2cbaaaadbcadc90355f3bc7ecf9bb9f842ffd328ee9fb6b33518c93c360/tree_sitter_language_pack-1.13.3-cp310-abi3-win_arm64.whl", hash = "sha256:49eb4d6f532556076a885b36aab51919ae6ab396401144e4f73e4a0c9ead0219", size = 1987435, upload-time = "2026-07-21T14:10:19.367Z" }, + { url = "https://files.pythonhosted.org/packages/75/a0/69ac382a8e610a2e521fd1c661a59127b5387fad8789355c9fa60b27765a/tree_sitter_language_pack-1.13.3-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9229a14185583a0acfd9946154d491908078cc7a54150bf03268aed5a67cf3c3", size = 2141847 }, + { url = "https://files.pythonhosted.org/packages/bb/57/24ea7493d5704fcce545707732c652d7fd1cbe82c6f824cdc26554124069/tree_sitter_language_pack-1.13.3-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:8435aabc1e5537e97e0a5893b6bf8d501ee7e55f93ee813e98711c5787fdbf78", size = 2033141 }, + { url = "https://files.pythonhosted.org/packages/4e/02/b476c812681922ac2763100aeb98040b880e6fae9bf5960068fb5652356d/tree_sitter_language_pack-1.13.3-cp310-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:3096595f83c3ad1c8cdace1db737e074f4ef3c798534deb2fe758acda0d7e211", size = 2190490 }, + { url = "https://files.pythonhosted.org/packages/6e/f8/bfb863ffd53eb888308ffebeb9f73ed24bda0eac10393b9ec1b6774abe06/tree_sitter_language_pack-1.13.3-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ebcd8fa9435ff956bd82eeea21f492fb2ccfefd9be909fe5cdebabb892c4b034", size = 2301379 }, + { url = "https://files.pythonhosted.org/packages/5b/32/5a395972eee620b763493f6abf527dd76dea0cef91010ab348137cb51a2d/tree_sitter_language_pack-1.13.3-cp310-abi3-win_amd64.whl", hash = "sha256:c67c322370c30fa802e01532933709d0c29de8337d911eb693692a996993e55d", size = 2076066 }, + { url = "https://files.pythonhosted.org/packages/ff/56/b2cbaaaadbcadc90355f3bc7ecf9bb9f842ffd328ee9fb6b33518c93c360/tree_sitter_language_pack-1.13.3-cp310-abi3-win_arm64.whl", hash = "sha256:49eb4d6f532556076a885b36aab51919ae6ab396401144e4f73e4a0c9ead0219", size = 1987435 }, ] [[package]] name = "tree-sitter-python" version = "0.25.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/8b/c992ff0e768cb6768d5c96234579bf8842b3a633db641455d86dd30d5dac/tree_sitter_python-0.25.0.tar.gz", hash = "sha256:b13e090f725f5b9c86aa455a268553c65cadf325471ad5b65cd29cac8a1a68ac", size = 159845, upload-time = "2025-09-11T06:47:58.159Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/8b/c992ff0e768cb6768d5c96234579bf8842b3a633db641455d86dd30d5dac/tree_sitter_python-0.25.0.tar.gz", hash = "sha256:b13e090f725f5b9c86aa455a268553c65cadf325471ad5b65cd29cac8a1a68ac", size = 159845 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cf/64/a4e503c78a4eb3ac46d8e72a29c1b1237fa85238d8e972b063e0751f5a94/tree_sitter_python-0.25.0-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:14a79a47ddef72f987d5a2c122d148a812169d7484ff5c75a3db9609d419f361", size = 73790, upload-time = "2025-09-11T06:47:47.652Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/1d/60d8c2a0cc63d6ec4ba4e99ce61b802d2e39ef9db799bdf2a8f932a6cd4b/tree_sitter_python-0.25.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:480c21dbd995b7fe44813e741d71fed10ba695e7caab627fb034e3828469d762", size = 76691, upload-time = "2025-09-11T06:47:49.038Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/aa/cb/d9b0b67d037922d60cbe0359e0c86457c2da721bc714381a63e2c8e35eba/tree_sitter_python-0.25.0-cp310-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:86f118e5eecad616ecdb81d171a36dde9bef5a0b21ed71ea9c3e390813c3baf5", size = 108133, upload-time = "2025-09-11T06:47:50.499Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/bd/bf4787f57e6b2860f3f1c8c62f045b39fb32d6bac4b53d7a9e66de968440/tree_sitter_python-0.25.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be71650ca2b93b6e9649e5d65c6811aad87a7614c8c1003246b303f6b150f61b", size = 110603, upload-time = "2025-09-11T06:47:51.985Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/25/feff09f5c2f32484fbce15db8b49455c7572346ce61a699a41972dea7318/tree_sitter_python-0.25.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6d5b5799628cc0f24691ab2a172a8e676f668fe90dc60468bee14084a35c16d", size = 108998, upload-time = "2025-09-11T06:47:53.046Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/75/69/4946da3d6c0df316ccb938316ce007fb565d08f89d02d854f2d308f0309f/tree_sitter_python-0.25.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:71959832fc5d9642e52c11f2f7d79ae520b461e63334927e93ca46cd61cd9683", size = 107268, upload-time = "2025-09-11T06:47:54.388Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/a2/996fc2dfa1076dc460d3e2f3c75974ea4b8f02f6bc925383aaae519920e8/tree_sitter_python-0.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:9bcde33f18792de54ee579b00e1b4fe186b7926825444766f849bf7181793a76", size = 76073, upload-time = "2025-09-11T06:47:55.773Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/19/4b5569d9b1ebebb5907d11554a96ef3fa09364a30fcfabeff587495b512f/tree_sitter_python-0.25.0-cp310-abi3-win_arm64.whl", hash = "sha256:0fbf6a3774ad7e89ee891851204c2e2c47e12b63a5edbe2e9156997731c128bb", size = 74169, upload-time = "2025-09-11T06:47:56.747Z" }, + { url = "https://files.pythonhosted.org/packages/cf/64/a4e503c78a4eb3ac46d8e72a29c1b1237fa85238d8e972b063e0751f5a94/tree_sitter_python-0.25.0-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:14a79a47ddef72f987d5a2c122d148a812169d7484ff5c75a3db9609d419f361", size = 73790 }, + { url = "https://files.pythonhosted.org/packages/e6/1d/60d8c2a0cc63d6ec4ba4e99ce61b802d2e39ef9db799bdf2a8f932a6cd4b/tree_sitter_python-0.25.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:480c21dbd995b7fe44813e741d71fed10ba695e7caab627fb034e3828469d762", size = 76691 }, + { url = "https://files.pythonhosted.org/packages/aa/cb/d9b0b67d037922d60cbe0359e0c86457c2da721bc714381a63e2c8e35eba/tree_sitter_python-0.25.0-cp310-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:86f118e5eecad616ecdb81d171a36dde9bef5a0b21ed71ea9c3e390813c3baf5", size = 108133 }, + { url = "https://files.pythonhosted.org/packages/40/bd/bf4787f57e6b2860f3f1c8c62f045b39fb32d6bac4b53d7a9e66de968440/tree_sitter_python-0.25.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be71650ca2b93b6e9649e5d65c6811aad87a7614c8c1003246b303f6b150f61b", size = 110603 }, + { url = "https://files.pythonhosted.org/packages/5d/25/feff09f5c2f32484fbce15db8b49455c7572346ce61a699a41972dea7318/tree_sitter_python-0.25.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6d5b5799628cc0f24691ab2a172a8e676f668fe90dc60468bee14084a35c16d", size = 108998 }, + { url = "https://files.pythonhosted.org/packages/75/69/4946da3d6c0df316ccb938316ce007fb565d08f89d02d854f2d308f0309f/tree_sitter_python-0.25.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:71959832fc5d9642e52c11f2f7d79ae520b461e63334927e93ca46cd61cd9683", size = 107268 }, + { url = "https://files.pythonhosted.org/packages/ed/a2/996fc2dfa1076dc460d3e2f3c75974ea4b8f02f6bc925383aaae519920e8/tree_sitter_python-0.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:9bcde33f18792de54ee579b00e1b4fe186b7926825444766f849bf7181793a76", size = 76073 }, + { url = "https://files.pythonhosted.org/packages/07/19/4b5569d9b1ebebb5907d11554a96ef3fa09364a30fcfabeff587495b512f/tree_sitter_python-0.25.0-cp310-abi3-win_arm64.whl", hash = "sha256:0fbf6a3774ad7e89ee891851204c2e2c47e12b63a5edbe2e9156997731c128bb", size = 74169 }, ] [[package]] name = "tree-sitter-rust" version = "0.24.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/87/75cbd22b927267d310f76cca1ab3c1d9d41035dfa3eb9cc95f96ee199440/tree_sitter_rust-0.24.2.tar.gz", hash = "sha256:54fb02a5911e345308b405174465112479f56dc39e3f1e7744d7568595f00db9", size = 339341, upload-time = "2026-03-27T21:08:55.629Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/87/75cbd22b927267d310f76cca1ab3c1d9d41035dfa3eb9cc95f96ee199440/tree_sitter_rust-0.24.2.tar.gz", hash = "sha256:54fb02a5911e345308b405174465112479f56dc39e3f1e7744d7568595f00db9", size = 339341 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/24/2b2d33af5e27c84a4fde4e8cd2594bb4ab1e1cf48756a9f40dadc84956cc/tree_sitter_rust-0.24.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3620cfd12340efa43082d45df76349ff511893a9c361da2f8d6d51e307020a59", size = 129507, upload-time = "2026-03-27T21:08:47.585Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/2a/cf39f881a545360b5a86bb1accba1f4acc713daab01fb9edd35b6e84f473/tree_sitter_rust-0.24.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:01a46622735498493f29f3e628a90de95c96a07bfbeb88996243eb986b1cee36", size = 136812, upload-time = "2026-03-27T21:08:48.761Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/45/a051bbd3045a61182dde25b93ae9a33d2677c935b16952283e12eaf46051/tree_sitter_rust-0.24.2-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e033c5a93b57c88e0a835880de39fc802909ff69f57aaff6000211c196ea5190", size = 164706, upload-time = "2026-03-27T21:08:49.605Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/f6/a5a146df5c0a5daea3ffcd5d7245775fe7f084357770d5a313dd6245ae78/tree_sitter_rust-0.24.2-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9d76d1208c3638b871236090759dfc13d478921320653a6c9da5336e7c58f65a", size = 170310, upload-time = "2026-03-27T21:08:50.424Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/a8/f85b1ca75e01361ca5f92d226593ca4857cea49551b9f6c8fa6fc08ea917/tree_sitter_rust-0.24.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:87930163a462408c49ab62c667e74029bc26b4cc7123dd1bdc7352215786c64a", size = 168668, upload-time = "2026-03-27T21:08:51.404Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/e1/3519f866a4679ca36acd9f5a06a779ecb8a92b18887c5546458d521df557/tree_sitter_rust-0.24.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:da2b86099028fd42c6cd32878b7b16b01f8aac0f7b0e98742b7fa6bc3cf09b89", size = 162403, upload-time = "2026-03-27T21:08:52.588Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/34/71/7ef609894dbfe5699eb16f7471f9b8af1d958d8ba3e29c238d7607e8cb47/tree_sitter_rust-0.24.2-cp39-abi3-win_amd64.whl", hash = "sha256:4529c125d928882ddfb879fdc6bc0704913261ecc078b6fa7902559e0daf200d", size = 129422, upload-time = "2026-03-27T21:08:54.031Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b9/d8/050a781172745bc345f98abb7c56e72022ea0790f8e793de981c83c2ef15/tree_sitter_rust-0.24.2-cp39-abi3-win_arm64.whl", hash = "sha256:66ba90f61bd54f4c4f5d30434957daf64507c16b0313df76becb37d63f70a227", size = 128245, upload-time = "2026-03-27T21:08:54.803Z" }, + { url = "https://files.pythonhosted.org/packages/d0/24/2b2d33af5e27c84a4fde4e8cd2594bb4ab1e1cf48756a9f40dadc84956cc/tree_sitter_rust-0.24.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3620cfd12340efa43082d45df76349ff511893a9c361da2f8d6d51e307020a59", size = 129507 }, + { url = "https://files.pythonhosted.org/packages/78/2a/cf39f881a545360b5a86bb1accba1f4acc713daab01fb9edd35b6e84f473/tree_sitter_rust-0.24.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:01a46622735498493f29f3e628a90de95c96a07bfbeb88996243eb986b1cee36", size = 136812 }, + { url = "https://files.pythonhosted.org/packages/ca/45/a051bbd3045a61182dde25b93ae9a33d2677c935b16952283e12eaf46051/tree_sitter_rust-0.24.2-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e033c5a93b57c88e0a835880de39fc802909ff69f57aaff6000211c196ea5190", size = 164706 }, + { url = "https://files.pythonhosted.org/packages/b5/f6/a5a146df5c0a5daea3ffcd5d7245775fe7f084357770d5a313dd6245ae78/tree_sitter_rust-0.24.2-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9d76d1208c3638b871236090759dfc13d478921320653a6c9da5336e7c58f65a", size = 170310 }, + { url = "https://files.pythonhosted.org/packages/95/a8/f85b1ca75e01361ca5f92d226593ca4857cea49551b9f6c8fa6fc08ea917/tree_sitter_rust-0.24.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:87930163a462408c49ab62c667e74029bc26b4cc7123dd1bdc7352215786c64a", size = 168668 }, + { url = "https://files.pythonhosted.org/packages/a2/e1/3519f866a4679ca36acd9f5a06a779ecb8a92b18887c5546458d521df557/tree_sitter_rust-0.24.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:da2b86099028fd42c6cd32878b7b16b01f8aac0f7b0e98742b7fa6bc3cf09b89", size = 162403 }, + { url = "https://files.pythonhosted.org/packages/34/71/7ef609894dbfe5699eb16f7471f9b8af1d958d8ba3e29c238d7607e8cb47/tree_sitter_rust-0.24.2-cp39-abi3-win_amd64.whl", hash = "sha256:4529c125d928882ddfb879fdc6bc0704913261ecc078b6fa7902559e0daf200d", size = 129422 }, + { url = "https://files.pythonhosted.org/packages/b9/d8/050a781172745bc345f98abb7c56e72022ea0790f8e793de981c83c2ef15/tree_sitter_rust-0.24.2-cp39-abi3-win_arm64.whl", hash = "sha256:66ba90f61bd54f4c4f5d30434957daf64507c16b0313df76becb37d63f70a227", size = 128245 }, ] [[package]] name = "tree-sitter-typescript" version = "0.23.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/fc/bb52958f7e399250aee093751e9373a6311cadbe76b6e0d109b853757f35/tree_sitter_typescript-0.23.2.tar.gz", hash = "sha256:7b167b5827c882261cb7a50dfa0fb567975f9b315e87ed87ad0a0a3aedb3834d", size = 773053, upload-time = "2024-11-11T02:36:11.396Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/fc/bb52958f7e399250aee093751e9373a6311cadbe76b6e0d109b853757f35/tree_sitter_typescript-0.23.2.tar.gz", hash = "sha256:7b167b5827c882261cb7a50dfa0fb567975f9b315e87ed87ad0a0a3aedb3834d", size = 773053 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/95/4c00680866280e008e81dd621fd4d3f54aa3dad1b76b857a19da1b2cc426/tree_sitter_typescript-0.23.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3cd752d70d8e5371fdac6a9a4df9d8924b63b6998d268586f7d374c9fba2a478", size = 286677, upload-time = "2024-11-11T02:35:58.839Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/2f/1f36fda564518d84593f2740d5905ac127d590baf5c5753cef2a88a89c15/tree_sitter_typescript-0.23.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c7cc1b0ff5d91bac863b0e38b1578d5505e718156c9db577c8baea2557f66de8", size = 302008, upload-time = "2024-11-11T02:36:00.733Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/2d/975c2dad292aa9994f982eb0b69cc6fda0223e4b6c4ea714550477d8ec3a/tree_sitter_typescript-0.23.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b1eed5b0b3a8134e86126b00b743d667ec27c63fc9de1b7bb23168803879e31", size = 351987, upload-time = "2024-11-11T02:36:02.669Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/d1/a71c36da6e2b8a4ed5e2970819b86ef13ba77ac40d9e333cb17df6a2c5db/tree_sitter_typescript-0.23.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e96d36b85bcacdeb8ff5c2618d75593ef12ebaf1b4eace3477e2bdb2abb1752c", size = 344960, upload-time = "2024-11-11T02:36:04.443Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/cb/f57b149d7beed1a85b8266d0c60ebe4c46e79c9ba56bc17b898e17daf88e/tree_sitter_typescript-0.23.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8d4f0f9bcb61ad7b7509d49a1565ff2cc363863644a234e1e0fe10960e55aea0", size = 340245, upload-time = "2024-11-11T02:36:06.473Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/ab/dd84f0e2337296a5f09749f7b5483215d75c8fa9e33738522e5ed81f7254/tree_sitter_typescript-0.23.2-cp39-abi3-win_amd64.whl", hash = "sha256:3f730b66396bc3e11811e4465c41ee45d9e9edd6de355a58bbbc49fa770da8f9", size = 278015, upload-time = "2024-11-11T02:36:07.631Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9f/e4/81f9a935789233cf412a0ed5fe04c883841d2c8fb0b7e075958a35c65032/tree_sitter_typescript-0.23.2-cp39-abi3-win_arm64.whl", hash = "sha256:05db58f70b95ef0ea126db5560f3775692f609589ed6f8dd0af84b7f19f1cbb7", size = 274052, upload-time = "2024-11-11T02:36:09.514Z" }, + { url = "https://files.pythonhosted.org/packages/28/95/4c00680866280e008e81dd621fd4d3f54aa3dad1b76b857a19da1b2cc426/tree_sitter_typescript-0.23.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3cd752d70d8e5371fdac6a9a4df9d8924b63b6998d268586f7d374c9fba2a478", size = 286677 }, + { url = "https://files.pythonhosted.org/packages/8f/2f/1f36fda564518d84593f2740d5905ac127d590baf5c5753cef2a88a89c15/tree_sitter_typescript-0.23.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c7cc1b0ff5d91bac863b0e38b1578d5505e718156c9db577c8baea2557f66de8", size = 302008 }, + { url = "https://files.pythonhosted.org/packages/96/2d/975c2dad292aa9994f982eb0b69cc6fda0223e4b6c4ea714550477d8ec3a/tree_sitter_typescript-0.23.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b1eed5b0b3a8134e86126b00b743d667ec27c63fc9de1b7bb23168803879e31", size = 351987 }, + { url = "https://files.pythonhosted.org/packages/49/d1/a71c36da6e2b8a4ed5e2970819b86ef13ba77ac40d9e333cb17df6a2c5db/tree_sitter_typescript-0.23.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e96d36b85bcacdeb8ff5c2618d75593ef12ebaf1b4eace3477e2bdb2abb1752c", size = 344960 }, + { url = "https://files.pythonhosted.org/packages/7f/cb/f57b149d7beed1a85b8266d0c60ebe4c46e79c9ba56bc17b898e17daf88e/tree_sitter_typescript-0.23.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8d4f0f9bcb61ad7b7509d49a1565ff2cc363863644a234e1e0fe10960e55aea0", size = 340245 }, + { url = "https://files.pythonhosted.org/packages/8b/ab/dd84f0e2337296a5f09749f7b5483215d75c8fa9e33738522e5ed81f7254/tree_sitter_typescript-0.23.2-cp39-abi3-win_amd64.whl", hash = "sha256:3f730b66396bc3e11811e4465c41ee45d9e9edd6de355a58bbbc49fa770da8f9", size = 278015 }, + { url = "https://files.pythonhosted.org/packages/9f/e4/81f9a935789233cf412a0ed5fe04c883841d2c8fb0b7e075958a35c65032/tree_sitter_typescript-0.23.2-cp39-abi3-win_arm64.whl", hash = "sha256:05db58f70b95ef0ea126db5560f3775692f609589ed6f8dd0af84b7f19f1cbb7", size = 274052 }, ] [[package]] name = "tree-sitter-yaml" version = "0.7.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/b6/941d356ac70c90b9d2927375259e3a4204f38f7499ec6e7e8a95b9664689/tree_sitter_yaml-0.7.2.tar.gz", hash = "sha256:756db4c09c9d9e97c81699e8f941cb8ce4e51104927f6090eefe638ee567d32c", size = 84882, upload-time = "2025-10-07T14:40:36.071Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/b6/941d356ac70c90b9d2927375259e3a4204f38f7499ec6e7e8a95b9664689/tree_sitter_yaml-0.7.2.tar.gz", hash = "sha256:756db4c09c9d9e97c81699e8f941cb8ce4e51104927f6090eefe638ee567d32c", size = 84882 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/38/29/c0b8dbff302c49ff4284666ffb6f2f21145006843bb4c3a9a85d0ec0b7ae/tree_sitter_yaml-0.7.2-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7e269ddcfcab8edb14fbb1f1d34eed1e1e26888f78f94eedfe7cc98c60f8bc9f", size = 43898, upload-time = "2025-10-07T14:40:29.486Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/0d/15a5add06b3932b5e4ce5f5e8e179197097decfe82a0ef000952c8b98216/tree_sitter_yaml-0.7.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:0807b7966e23ddf7dddc4545216e28b5a58cdadedcecca86b8d8c74271a07870", size = 44691, upload-time = "2025-10-07T14:40:30.369Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/92/c4b896c90d08deb8308fadbad2210fdcc4c66c44ab4292eac4e80acb4b61/tree_sitter_yaml-0.7.2-cp310-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f1a5c60c98b6c4c037aae023569f020d0c489fad8dc26fdfd5510363c9c29a41", size = 91430, upload-time = "2025-10-07T14:40:31.16Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/59/61f1fed31eb6d46ff080b8c0d53658cf29e10263f41ef5fe34768908037a/tree_sitter_yaml-0.7.2-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88636d19d0654fd24f4f242eaaafa90f6f5ebdba8a62e4b32d251ed156c51a2a", size = 92428, upload-time = "2025-10-07T14:40:31.954Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/62/a33a04d19b7f9a0ded780b9c9fcc6279e37c5d00b89b00425bb807a22cc2/tree_sitter_yaml-0.7.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1d2e8f0bb14aa4537320952d0f9607eef3021d5aada8383c34ebeece17db1e06", size = 90580, upload-time = "2025-10-07T14:40:33.037Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/e7/9525defa7b30792623f56b1fba9bbba361752348875b165b8975b87398fd/tree_sitter_yaml-0.7.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:74ca712c50fc9d7dbc68cb36b4a7811d6e67a5466b5a789f19bf8dd6084ef752", size = 90455, upload-time = "2025-10-07T14:40:33.778Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4a/d6/8d1e1ace03db3b02e64e91daf21d1347941d1bbecc606a5473a1a605250d/tree_sitter_yaml-0.7.2-cp310-abi3-win_amd64.whl", hash = "sha256:7587b5ca00fc4f9a548eff649697a3b395370b2304b399ceefa2087d8a6c9186", size = 45514, upload-time = "2025-10-07T14:40:34.562Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d8/c7/dcf3ea1c4f5da9b10353b9af4455d756c92d728a8f58f03c480d3ef0ead5/tree_sitter_yaml-0.7.2-cp310-abi3-win_arm64.whl", hash = "sha256:f63c227b18e7ce7587bce124578f0bbf1f890ac63d3e3cd027417574273642c4", size = 44065, upload-time = "2025-10-07T14:40:35.337Z" }, + { url = "https://files.pythonhosted.org/packages/38/29/c0b8dbff302c49ff4284666ffb6f2f21145006843bb4c3a9a85d0ec0b7ae/tree_sitter_yaml-0.7.2-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7e269ddcfcab8edb14fbb1f1d34eed1e1e26888f78f94eedfe7cc98c60f8bc9f", size = 43898 }, + { url = "https://files.pythonhosted.org/packages/18/0d/15a5add06b3932b5e4ce5f5e8e179197097decfe82a0ef000952c8b98216/tree_sitter_yaml-0.7.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:0807b7966e23ddf7dddc4545216e28b5a58cdadedcecca86b8d8c74271a07870", size = 44691 }, + { url = "https://files.pythonhosted.org/packages/72/92/c4b896c90d08deb8308fadbad2210fdcc4c66c44ab4292eac4e80acb4b61/tree_sitter_yaml-0.7.2-cp310-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f1a5c60c98b6c4c037aae023569f020d0c489fad8dc26fdfd5510363c9c29a41", size = 91430 }, + { url = "https://files.pythonhosted.org/packages/89/59/61f1fed31eb6d46ff080b8c0d53658cf29e10263f41ef5fe34768908037a/tree_sitter_yaml-0.7.2-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88636d19d0654fd24f4f242eaaafa90f6f5ebdba8a62e4b32d251ed156c51a2a", size = 92428 }, + { url = "https://files.pythonhosted.org/packages/e3/62/a33a04d19b7f9a0ded780b9c9fcc6279e37c5d00b89b00425bb807a22cc2/tree_sitter_yaml-0.7.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1d2e8f0bb14aa4537320952d0f9607eef3021d5aada8383c34ebeece17db1e06", size = 90580 }, + { url = "https://files.pythonhosted.org/packages/6c/e7/9525defa7b30792623f56b1fba9bbba361752348875b165b8975b87398fd/tree_sitter_yaml-0.7.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:74ca712c50fc9d7dbc68cb36b4a7811d6e67a5466b5a789f19bf8dd6084ef752", size = 90455 }, + { url = "https://files.pythonhosted.org/packages/4a/d6/8d1e1ace03db3b02e64e91daf21d1347941d1bbecc606a5473a1a605250d/tree_sitter_yaml-0.7.2-cp310-abi3-win_amd64.whl", hash = "sha256:7587b5ca00fc4f9a548eff649697a3b395370b2304b399ceefa2087d8a6c9186", size = 45514 }, + { url = "https://files.pythonhosted.org/packages/d8/c7/dcf3ea1c4f5da9b10353b9af4455d756c92d728a8f58f03c480d3ef0ead5/tree_sitter_yaml-0.7.2-cp310-abi3-win_arm64.whl", hash = "sha256:f63c227b18e7ce7587bce124578f0bbf1f890ac63d3e3cd027417574273642c4", size = 44065 }, ] [[package]] name = "truststore" version = "0.10.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/a3/1585216310e344e8102c22482f6060c7a6ea0322b63e026372e6dcefcfd6/truststore-0.10.4.tar.gz", hash = "sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301", size = 26169, upload-time = "2025-08-12T18:49:02.73Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/a3/1585216310e344e8102c22482f6060c7a6ea0322b63e026372e6dcefcfd6/truststore-0.10.4.tar.gz", hash = "sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301", size = 26169 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/97/56608b2249fe206a67cd573bc93cd9896e1efb9e98bce9c163bcdc704b88/truststore-0.10.4-py3-none-any.whl", hash = "sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981", size = 18660, upload-time = "2025-08-12T18:49:01.46Z" }, + { url = "https://files.pythonhosted.org/packages/19/97/56608b2249fe206a67cd573bc93cd9896e1efb9e98bce9c163bcdc704b88/truststore-0.10.4-py3-none-any.whl", hash = "sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981", size = 18660 }, ] [[package]] name = "ty" version = "0.0.63" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/ce/cbeaa5c7576fec643609dfbf200d59493523b1cc0481d4e7a5effcbf0630/ty-0.0.63.tar.gz", hash = "sha256:c2f66439393b3acac69306c117d4ae44638ce5fffa4a20c21046e85bd473359f", size = 6280695, upload-time = "2026-07-23T11:41:39.845Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/e4/d17a8e113ab15c692fe6fb9c422112d4bee7e829d80ced35826b45d98d98/ty-0.0.63-py3-none-linux_armv6l.whl", hash = "sha256:9a4ef7782e3af314fb63d006bec5ac3025bd70fee774b4dcfb5e44e8564f1994", size = 12056302, upload-time = "2026-07-23T11:41:03.5Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/be/0b/357234c815dc4bfcc88c3f860aa0983fe4228c8aa2a5bb16c35ee08a94af/ty-0.0.63-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:01eab0ab70d51ad10298aa2d4b058b387a1fe93e5ee52d2a1ee23e9c69ba8354", size = 11737674, upload-time = "2026-07-23T11:41:05.862Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/13/193d9aeeb6774690351cff9fafabd3ae9b54cc225d125e07fa004ce23bdc/ty-0.0.63-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a671b61eaad16178389e05b9c108c9cb75ae8d84968fe55906484f55d6268338", size = 11264191, upload-time = "2026-07-23T11:41:07.963Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4f/b7/c5843e16759a2b25fc8a7197473474038e585ac9fdaa6fa16aeb6384bf6a/ty-0.0.63-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b255cc83d95c51bb9ee4931303fdbece8cb1d6d7c655eb77a3f2c8f349fb64d6", size = 11818890, upload-time = "2026-07-23T11:41:09.885Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/20/adf83ae1fc570d9bb449605e1eeeaa523ad2329ca838a636698b5c135d11/ty-0.0.63-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0da1e8183aa4f893421a173904478021498f542ee41273660538da6649a9631c", size = 11853141, upload-time = "2026-07-23T11:41:12.151Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ea/90/f8effd846e3ee13486ea08257c13094d58b9f188c5641bf609d6a7d5c09f/ty-0.0.63-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128f38eb5a67199e3811426386f7ec96f41251ddf45e04ddc0bcbb29d4853245", size = 12545184, upload-time = "2026-07-23T11:41:14.4Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/76/aac3a30d40431eb1d329acea016b248f5b6255e30ef3d28e19447e344be2/ty-0.0.63-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bedf34aff8b0557f2a7119b314a68a9c9e58c1d21554d0e2748f2c5fe6a1f638", size = 13062375, upload-time = "2026-07-23T11:41:16.441Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/3d/0158733932893e17f6008dadd74c8d7aed422fefc66e47fe77888014fe8c/ty-0.0.63-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7328d63c34587606dce02935a25404f54cd0161bfe413b8f7fc21d174aead612", size = 12619461, upload-time = "2026-07-23T11:41:18.538Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f5/be/e280ad095b050778f16f493d49a073fa5f6d8f301d3e2e59be6a672ba05c/ty-0.0.63-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504c4457f3a62afe836c1f26a2c9a12549299095f9cc4146778558df51a7515c", size = 12376402, upload-time = "2026-07-23T11:41:20.482Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/57/619788bf335cb86b090470b557ae1eed33613dc24e12142505d32b462e58/ty-0.0.63-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:7394ed39424b027c89d5f0c818871c791e33958b88f5bb13e14bd4a12a3ca631", size = 12671377, upload-time = "2026-07-23T11:41:22.489Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/a2/0aff2cdd3c98e2c4729337542b8da0ce1980790e1600e0c4a717a1f46293/ty-0.0.63-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:94c3f155230490f8fb505911655e940c630c25cc0c35a76690cb413254fb4437", size = 11768090, upload-time = "2026-07-23T11:41:24.558Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/4a/cdb5f1d26154144dfee08e1bd671daf827238170f7cee9dad43990bb2016/ty-0.0.63-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:c16e1d8b4f0ae99106d5f13a894034a202baf6cdab61e2bb1a239de82904f839", size = 11867747, upload-time = "2026-07-23T11:41:26.794Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/26/ecc09ecb70bc9fbfdf42fa57ff29568f173e8200df575a0d72dc2b8486f9/ty-0.0.63-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b66293dad89eaed4b9fbf3b661614dbeb85b59ba037178a3f9a0adedf264da5c", size = 12120000, upload-time = "2026-07-23T11:41:28.731Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/14/07/862822f9c2c397785b69b25cf79b4dfc3c0d55684b9adf11ac194450f8e1/ty-0.0.63-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8b29cc832e2ec73502c97dd7325d6ae0e085b34a33529a0f785192317d9862fc", size = 12477862, upload-time = "2026-07-23T11:41:30.847Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/c2/50b08b641578d6f48e8aa28a91d0de32c91aa24dd926ed199e8afd2d37ea/ty-0.0.63-py3-none-win32.whl", hash = "sha256:f0a8fbfd1f990c0c5d85cce018d438969ac79e49247e2192c9745394bb7d17ab", size = 11433155, upload-time = "2026-07-23T11:41:33.28Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/2d/d422a5568f0d1f317186be22241288dc6e08b71dc24aca223f22038ac2d2/ty-0.0.63-py3-none-win_amd64.whl", hash = "sha256:2aa2370bdd6f42e9f37518c812379bef70b9162f9e5aad511495229b0b71cb93", size = 12450036, upload-time = "2026-07-23T11:41:35.559Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/35/97/2c9748e28ead0650c7ad3e5f74f178832ceabd7cb5c272a882f29eb32ee4/ty-0.0.63-py3-none-win_arm64.whl", hash = "sha256:95ac1a62162c3c7ac204731e95ebf766d62a46a7bfa238a6acbe923fcb772cb1", size = 11826243, upload-time = "2026-07-23T11:41:37.749Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/ce/cbeaa5c7576fec643609dfbf200d59493523b1cc0481d4e7a5effcbf0630/ty-0.0.63.tar.gz", hash = "sha256:c2f66439393b3acac69306c117d4ae44638ce5fffa4a20c21046e85bd473359f", size = 6280695 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/e4/d17a8e113ab15c692fe6fb9c422112d4bee7e829d80ced35826b45d98d98/ty-0.0.63-py3-none-linux_armv6l.whl", hash = "sha256:9a4ef7782e3af314fb63d006bec5ac3025bd70fee774b4dcfb5e44e8564f1994", size = 12056302 }, + { url = "https://files.pythonhosted.org/packages/be/0b/357234c815dc4bfcc88c3f860aa0983fe4228c8aa2a5bb16c35ee08a94af/ty-0.0.63-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:01eab0ab70d51ad10298aa2d4b058b387a1fe93e5ee52d2a1ee23e9c69ba8354", size = 11737674 }, + { url = "https://files.pythonhosted.org/packages/1c/13/193d9aeeb6774690351cff9fafabd3ae9b54cc225d125e07fa004ce23bdc/ty-0.0.63-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a671b61eaad16178389e05b9c108c9cb75ae8d84968fe55906484f55d6268338", size = 11264191 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/c5843e16759a2b25fc8a7197473474038e585ac9fdaa6fa16aeb6384bf6a/ty-0.0.63-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b255cc83d95c51bb9ee4931303fdbece8cb1d6d7c655eb77a3f2c8f349fb64d6", size = 11818890 }, + { url = "https://files.pythonhosted.org/packages/06/20/adf83ae1fc570d9bb449605e1eeeaa523ad2329ca838a636698b5c135d11/ty-0.0.63-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0da1e8183aa4f893421a173904478021498f542ee41273660538da6649a9631c", size = 11853141 }, + { url = "https://files.pythonhosted.org/packages/ea/90/f8effd846e3ee13486ea08257c13094d58b9f188c5641bf609d6a7d5c09f/ty-0.0.63-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128f38eb5a67199e3811426386f7ec96f41251ddf45e04ddc0bcbb29d4853245", size = 12545184 }, + { url = "https://files.pythonhosted.org/packages/b8/76/aac3a30d40431eb1d329acea016b248f5b6255e30ef3d28e19447e344be2/ty-0.0.63-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bedf34aff8b0557f2a7119b314a68a9c9e58c1d21554d0e2748f2c5fe6a1f638", size = 13062375 }, + { url = "https://files.pythonhosted.org/packages/62/3d/0158733932893e17f6008dadd74c8d7aed422fefc66e47fe77888014fe8c/ty-0.0.63-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7328d63c34587606dce02935a25404f54cd0161bfe413b8f7fc21d174aead612", size = 12619461 }, + { url = "https://files.pythonhosted.org/packages/f5/be/e280ad095b050778f16f493d49a073fa5f6d8f301d3e2e59be6a672ba05c/ty-0.0.63-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504c4457f3a62afe836c1f26a2c9a12549299095f9cc4146778558df51a7515c", size = 12376402 }, + { url = "https://files.pythonhosted.org/packages/57/57/619788bf335cb86b090470b557ae1eed33613dc24e12142505d32b462e58/ty-0.0.63-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:7394ed39424b027c89d5f0c818871c791e33958b88f5bb13e14bd4a12a3ca631", size = 12671377 }, + { url = "https://files.pythonhosted.org/packages/07/a2/0aff2cdd3c98e2c4729337542b8da0ce1980790e1600e0c4a717a1f46293/ty-0.0.63-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:94c3f155230490f8fb505911655e940c630c25cc0c35a76690cb413254fb4437", size = 11768090 }, + { url = "https://files.pythonhosted.org/packages/43/4a/cdb5f1d26154144dfee08e1bd671daf827238170f7cee9dad43990bb2016/ty-0.0.63-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:c16e1d8b4f0ae99106d5f13a894034a202baf6cdab61e2bb1a239de82904f839", size = 11867747 }, + { url = "https://files.pythonhosted.org/packages/7e/26/ecc09ecb70bc9fbfdf42fa57ff29568f173e8200df575a0d72dc2b8486f9/ty-0.0.63-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b66293dad89eaed4b9fbf3b661614dbeb85b59ba037178a3f9a0adedf264da5c", size = 12120000 }, + { url = "https://files.pythonhosted.org/packages/14/07/862822f9c2c397785b69b25cf79b4dfc3c0d55684b9adf11ac194450f8e1/ty-0.0.63-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8b29cc832e2ec73502c97dd7325d6ae0e085b34a33529a0f785192317d9862fc", size = 12477862 }, + { url = "https://files.pythonhosted.org/packages/d0/c2/50b08b641578d6f48e8aa28a91d0de32c91aa24dd926ed199e8afd2d37ea/ty-0.0.63-py3-none-win32.whl", hash = "sha256:f0a8fbfd1f990c0c5d85cce018d438969ac79e49247e2192c9745394bb7d17ab", size = 11433155 }, + { url = "https://files.pythonhosted.org/packages/92/2d/d422a5568f0d1f317186be22241288dc6e08b71dc24aca223f22038ac2d2/ty-0.0.63-py3-none-win_amd64.whl", hash = "sha256:2aa2370bdd6f42e9f37518c812379bef70b9162f9e5aad511495229b0b71cb93", size = 12450036 }, + { url = "https://files.pythonhosted.org/packages/35/97/2c9748e28ead0650c7ad3e5f74f178832ceabd7cb5c272a882f29eb32ee4/ty-0.0.63-py3-none-win_arm64.whl", hash = "sha256:95ac1a62162c3c7ac204731e95ebf766d62a46a7bfa238a6acbe923fcb772cb1", size = 11826243 }, ] [[package]] name = "typeguard" version = "4.5.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/1c/dfba5c4633cafc4c701f237d2ba63b416805047fd6d96aab4cfc40969f98/typeguard-4.5.2.tar.gz", hash = "sha256:5a16dcac23502039299c97c8941651bc33d7ea8cc4b2f7d6bbb1b528f6eea423", size = 80240, upload-time = "2026-05-14T12:59:40.857Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/1c/dfba5c4633cafc4c701f237d2ba63b416805047fd6d96aab4cfc40969f98/typeguard-4.5.2.tar.gz", hash = "sha256:5a16dcac23502039299c97c8941651bc33d7ea8cc4b2f7d6bbb1b528f6eea423", size = 80240 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/29/74eeb4d3f3ae61ca096b018ad486b3b3c74b17bec09ab4edab721cbefec3/typeguard-4.5.2-py3-none-any.whl", hash = "sha256:fcf9de18bd945cdb4c7b996e12b4c51ce83f92f191314a6d7cf1739586ec98cf", size = 36748, upload-time = "2026-05-14T12:59:39.473Z" }, + { url = "https://files.pythonhosted.org/packages/5b/29/74eeb4d3f3ae61ca096b018ad486b3b3c74b17bec09ab4edab721cbefec3/typeguard-4.5.2-py3-none-any.whl", hash = "sha256:fcf9de18bd945cdb4c7b996e12b4c51ce83f92f191314a6d7cf1739586ec98cf", size = 36748 }, ] [[package]] name = "typer" version = "0.27.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "rich" }, { name = "shellingham" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716 }, ] [[package]] name = "types-croniter" version = "6.2.4.20260711" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/e1/ef8900515a103efa41b29ce81e59efb18e72bc9642139c5a3a17f6022641/types_croniter-6.2.4.20260711.tar.gz", hash = "sha256:807793e109f4e0d51ec18f6277a1a5f1d133e425ac6bee3a7c3254ab1793e0ea", size = 12164, upload-time = "2026-07-11T04:51:18.624Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/e1/ef8900515a103efa41b29ce81e59efb18e72bc9642139c5a3a17f6022641/types_croniter-6.2.4.20260711.tar.gz", hash = "sha256:807793e109f4e0d51ec18f6277a1a5f1d133e425ac6bee3a7c3254ab1793e0ea", size = 12164 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c8/3f/896a98180a55f855bd068b97e8c99fd4ce1885a4b43f68fd7b29641084f6/types_croniter-6.2.4.20260711-py3-none-any.whl", hash = "sha256:601b68139a47fe1b2177f433132cc81fd91155f3059a49c5cb63404c389dff01", size = 9746, upload-time = "2026-07-11T04:51:17.662Z" }, + { url = "https://files.pythonhosted.org/packages/c8/3f/896a98180a55f855bd068b97e8c99fd4ce1885a4b43f68fd7b29641084f6/types_croniter-6.2.4.20260711-py3-none-any.whl", hash = "sha256:601b68139a47fe1b2177f433132cc81fd91155f3059a49c5cb63404c389dff01", size = 9746 }, ] [[package]] name = "types-docutils" version = "0.22.3.20260724" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/8f/30e02b59a9aad81eacd3d02fab5365257e89fde56e7acf44a4128f5f80aa/types_docutils-0.22.3.20260724.tar.gz", hash = "sha256:0223ce87f9b8331a5a3a7c7832e828033d289da6b878a0dcfbc74c30ec58850e", size = 57883, upload-time = "2026-07-24T04:58:36.388Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/8f/30e02b59a9aad81eacd3d02fab5365257e89fde56e7acf44a4128f5f80aa/types_docutils-0.22.3.20260724.tar.gz", hash = "sha256:0223ce87f9b8331a5a3a7c7832e828033d289da6b878a0dcfbc74c30ec58850e", size = 57883 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/1a/898fbb98680dbd5eb7ac8e9cbaf39cf234d329a45d89d04faaf33d7d8008/types_docutils-0.22.3.20260724-py3-none-any.whl", hash = "sha256:45e2fe584608671aa648784c4f805d08a36cd69eb2bd542e60522140c46dc89c", size = 91986, upload-time = "2026-07-24T04:58:35.368Z" }, + { url = "https://files.pythonhosted.org/packages/13/1a/898fbb98680dbd5eb7ac8e9cbaf39cf234d329a45d89d04faaf33d7d8008/types_docutils-0.22.3.20260724-py3-none-any.whl", hash = "sha256:45e2fe584608671aa648784c4f805d08a36cd69eb2bd542e60522140c46dc89c", size = 91986 }, ] [[package]] name = "types-jsonschema" version = "4.26.0.20260518" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dd/46/73b6a5d61a61015c4248030a8cb07e5bdddb4041430fae9e585a68692578/types_jsonschema-4.26.0.20260518.tar.gz", hash = "sha256:e1dd53dc97a64f5eccdd6fa9839666e09bb500a8ebba2db6fdaf1789faea81a6", size = 16638, upload-time = "2026-05-18T06:06:44.106Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/46/73b6a5d61a61015c4248030a8cb07e5bdddb4041430fae9e585a68692578/types_jsonschema-4.26.0.20260518.tar.gz", hash = "sha256:e1dd53dc97a64f5eccdd6fa9839666e09bb500a8ebba2db6fdaf1789faea81a6", size = 16638 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/d5/134f8a147dcecda10db7f60cfc6af0578a25a5c53c87b3907a64385e0184/types_jsonschema-4.26.0.20260518-py3-none-any.whl", hash = "sha256:30b30a518c7fe335df85c919fcbcc631b69c03d4a4b5b632fa916bea03065307", size = 16072, upload-time = "2026-05-18T06:06:43.264Z" }, + { url = "https://files.pythonhosted.org/packages/07/d5/134f8a147dcecda10db7f60cfc6af0578a25a5c53c87b3907a64385e0184/types_jsonschema-4.26.0.20260518-py3-none-any.whl", hash = "sha256:30b30a518c7fe335df85c919fcbcc631b69c03d4a4b5b632fa916bea03065307", size = 16072 }, ] [[package]] name = "types-pygments" version = "2.20.0.20260518" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-docutils" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/66/3e27e8dbe72947d51355d1fcba222a55bf5f0770ee660e9cc9df0d1ce5d7/types_pygments-2.20.0.20260518.tar.gz", hash = "sha256:bcab233d0389cb0a91146eb860e7bdcbceaa0f30bee73cefc7b367129cc4a330", size = 21152, upload-time = "2026-05-18T06:07:26.927Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/66/3e27e8dbe72947d51355d1fcba222a55bf5f0770ee660e9cc9df0d1ce5d7/types_pygments-2.20.0.20260518.tar.gz", hash = "sha256:bcab233d0389cb0a91146eb860e7bdcbceaa0f30bee73cefc7b367129cc4a330", size = 21152 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/d6/5f19f5b633af6a7666c6096fdd06b70f0d4a8f585af5e18a3ef58ad47ec1/types_pygments-2.20.0.20260518-py3-none-any.whl", hash = "sha256:e40728efd00c9da5936366648d5b3c55e72ed52bdd80495a96577b4d717c4fcb", size = 29002, upload-time = "2026-05-18T06:07:26.054Z" }, + { url = "https://files.pythonhosted.org/packages/66/d6/5f19f5b633af6a7666c6096fdd06b70f0d4a8f585af5e18a3ef58ad47ec1/types_pygments-2.20.0.20260518-py3-none-any.whl", hash = "sha256:e40728efd00c9da5936366648d5b3c55e72ed52bdd80495a96577b4d717c4fcb", size = 29002 }, ] [[package]] name = "types-pyyaml" version = "6.0.12.20260724" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/6f/a28f44bcd56bebed42b028a2894c79853e2f5e6b5279e633cb3f287a05e7/types_pyyaml-6.0.12.20260724.tar.gz", hash = "sha256:3c1ce1bb73cd5ec02e90390c2b1f00e810d241d8825fd73ff359696839271b6b", size = 17893, upload-time = "2026-07-24T04:58:43.453Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/6f/a28f44bcd56bebed42b028a2894c79853e2f5e6b5279e633cb3f287a05e7/types_pyyaml-6.0.12.20260724.tar.gz", hash = "sha256:3c1ce1bb73cd5ec02e90390c2b1f00e810d241d8825fd73ff359696839271b6b", size = 17893 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/42/0337fefc615e20ee55d1c8f71b774a9b2b734a04669139c20753b27a2a3a/types_pyyaml-6.0.12.20260724-py3-none-any.whl", hash = "sha256:d57db930a4b2efbc57cf430ec8882765d246929432fa253092f383902329a453", size = 20312, upload-time = "2026-07-24T04:58:42.486Z" }, + { url = "https://files.pythonhosted.org/packages/8b/42/0337fefc615e20ee55d1c8f71b774a9b2b734a04669139c20753b27a2a3a/types_pyyaml-6.0.12.20260724-py3-none-any.whl", hash = "sha256:d57db930a4b2efbc57cf430ec8882765d246929432fa253092f383902329a453", size = 20312 }, ] [[package]] name = "typing-extensions" version = "4.16.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571 }, ] [[package]] name = "typing-inspect" version = "0.9.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f" }, + { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827 }, ] [[package]] name = "typing-inspection" version = "0.4.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611 }, ] [[package]] name = "tzdata" version = "2026.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168 }, ] [[package]] name = "uncalled-for" version = "0.3.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/82/345cc927f7fbdae6065e7768759932fcc827fc20b29b45dfbafa2f1f7da4/uncalled_for-0.3.2.tar.gz", hash = "sha256:89f5dbcd71e2b8f47c030b1fa302e6cce2ec795d1ac565eeb6525c5fe55cb8a2", size = 50032, upload-time = "2026-05-06T13:38:25.204Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/82/345cc927f7fbdae6065e7768759932fcc827fc20b29b45dfbafa2f1f7da4/uncalled_for-0.3.2.tar.gz", hash = "sha256:89f5dbcd71e2b8f47c030b1fa302e6cce2ec795d1ac565eeb6525c5fe55cb8a2", size = 50032 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/25/2c87754f3a9e692315f7b811244090e68f362979fc8886b3fbd2985a1d8c/uncalled_for-0.3.2-py3-none-any.whl", hash = "sha256:0ff60b142c7d1f8070bde9d42afaa70aedc77dcc10998c227687e9c15713418e", size = 11444, upload-time = "2026-05-06T13:38:24.025Z" }, + { url = "https://files.pythonhosted.org/packages/3b/25/2c87754f3a9e692315f7b811244090e68f362979fc8886b3fbd2985a1d8c/uncalled_for-0.3.2-py3-none-any.whl", hash = "sha256:0ff60b142c7d1f8070bde9d42afaa70aedc77dcc10998c227687e9c15713418e", size = 11444 }, ] [[package]] name = "universal-pathlib" version = "0.3.10" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fsspec" }, { name = "pathlib-abc" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/6e/d997a70ee8f4c61f9a7e2f4f8af721cf072a3326848fc881b05187e52558/universal_pathlib-0.3.10.tar.gz", hash = "sha256:4487cbc90730a48cfb64f811d99e14b6faed6d738420cd5f93f59f48e6930bfb", size = 261110, upload-time = "2026-02-22T14:40:58.87Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/6e/d997a70ee8f4c61f9a7e2f4f8af721cf072a3326848fc881b05187e52558/universal_pathlib-0.3.10.tar.gz", hash = "sha256:4487cbc90730a48cfb64f811d99e14b6faed6d738420cd5f93f59f48e6930bfb", size = 261110 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl", hash = "sha256:dfaf2fb35683d2eb1287a3ed7b215e4d6016aa6eaf339c607023d22f90821c66", size = 83528, upload-time = "2026-02-22T14:40:57.316Z" }, + { url = "https://files.pythonhosted.org/packages/dd/1a/5d9a402b39ec892d856bbdd9db502ff73ce28cdf4aff72eb1ce1d6843506/universal_pathlib-0.3.10-py3-none-any.whl", hash = "sha256:dfaf2fb35683d2eb1287a3ed7b215e4d6016aa6eaf339c607023d22f90821c66", size = 83528 }, ] [[package]] name = "upathtools" version = "1.20.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiofile" }, { name = "fsspec" }, @@ -5500,9 +5203,9 @@ dependencies = [ { name = "ripgrep-rs" }, { name = "universal-pathlib" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/36/dec97bc75c092f493492e023260d1994785365fdfe3a6705eb103fbc81ed/upathtools-1.20.4.tar.gz", hash = "sha256:d29173ea690299e4e3955d6900d666ef6226ead4df91849bcbd4c5a05fe8e179", size = 207060, upload-time = "2026-04-24T22:03:30.677Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/36/dec97bc75c092f493492e023260d1994785365fdfe3a6705eb103fbc81ed/upathtools-1.20.4.tar.gz", hash = "sha256:d29173ea690299e4e3955d6900d666ef6226ead4df91849bcbd4c5a05fe8e179", size = 207060 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/72/70943b53a6dad3a5a8c3ea4ed7c498344b6f8eafe5a36e7982d686c4bc7e/upathtools-1.20.4-py3-none-any.whl", hash = "sha256:45bf470cf529c2bd4c492427fac24c4a75863a603bbf061c91e1d526371926c5", size = 274153, upload-time = "2026-04-24T22:03:29.101Z" }, + { url = "https://files.pythonhosted.org/packages/81/72/70943b53a6dad3a5a8c3ea4ed7c498344b6f8eafe5a36e7982d686c4bc7e/upathtools-1.20.4-py3-none-any.whl", hash = "sha256:45bf470cf529c2bd4c492427fac24c4a75863a603bbf061c91e1d526371926c5", size = 274153 }, ] [package.optional-dependencies] @@ -5515,23 +5218,23 @@ httpx = [ [[package]] name = "urllib3" version = "2.7.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087 }, ] [[package]] name = "uvicorn" version = "0.51.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/65/b7c6c443ccc58678c91e1e973bbe2a878591538655d6e1d47f24ba1c51f3/uvicorn-0.51.0.tar.gz", hash = "sha256:f6f4b69b657c312f516dd2d268ab9ae6f254b11e4bac504f37b2ab58b24dd0b0", size = 94412, upload-time = "2026-07-08T10:59:05.962Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/65/b7c6c443ccc58678c91e1e973bbe2a878591538655d6e1d47f24ba1c51f3/uvicorn-0.51.0.tar.gz", hash = "sha256:f6f4b69b657c312f516dd2d268ab9ae6f254b11e4bac504f37b2ab58b24dd0b0", size = 94412 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/ec/dbb7e5a6b91f86bfb9eb7d2988a2730907b6a729875b949c7f022e8b88fa/uvicorn-0.51.0-py3-none-any.whl", hash = "sha256:5d38af6cd620f2ae3849fb44fd4879e0890aa1febe8d47eb355fb45d93fe6a5b", size = 73219, upload-time = "2026-07-08T10:59:04.44Z" }, + { url = "https://files.pythonhosted.org/packages/45/ec/dbb7e5a6b91f86bfb9eb7d2988a2730907b6a729875b949c7f022e8b88fa/uvicorn-0.51.0-py3-none-any.whl", hash = "sha256:5d38af6cd620f2ae3849fb44fd4879e0890aa1febe8d47eb355fb45d93fe6a5b", size = 73219 }, ] [package.optional-dependencies] @@ -5547,157 +5250,459 @@ standard = [ [[package]] name = "uvloop" version = "0.22.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611 }, + { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811 }, + { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562 }, + { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890 }, + { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472 }, + { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051 }, ] [[package]] name = "vcrpy" version = "8.3.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, { name = "wrapt" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/39/d5/8a1f8eb603e2d35fbb0ecd1e309d0c5c18a0ecfc8c0a8f04088bbc8f833b/vcrpy-8.3.0.tar.gz", hash = "sha256:46d64e77e8d95e5c76c7d9a94ff05d8b38b2ae4e1d4869eb0235024b6fcb5212", size = 96117, upload-time = "2026-07-04T14:27:01.608Z" } +sdist = { url = "https://files.pythonhosted.org/packages/39/d5/8a1f8eb603e2d35fbb0ecd1e309d0c5c18a0ecfc8c0a8f04088bbc8f833b/vcrpy-8.3.0.tar.gz", hash = "sha256:46d64e77e8d95e5c76c7d9a94ff05d8b38b2ae4e1d4869eb0235024b6fcb5212", size = 96117 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/34/77/cb4219be91508399cbcb6143bad89462cfb16f6c638458f454a5d46ac95a/vcrpy-8.3.0-py3-none-any.whl", hash = "sha256:bd66e6143746778157f00e2a922527a8d96b2fdc350be8988a45a29c843815b9", size = 46530, upload-time = "2026-07-04T14:27:00.546Z" }, + { url = "https://files.pythonhosted.org/packages/34/77/cb4219be91508399cbcb6143bad89462cfb16f6c638458f454a5d46ac95a/vcrpy-8.3.0-py3-none-any.whl", hash = "sha256:bd66e6143746778157f00e2a922527a8d96b2fdc350be8988a45a29c843815b9", size = 46530 }, ] [[package]] name = "watchdog" version = "6.0.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, ] [[package]] name = "watchfiles" version = "1.2.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/41/5e1a4bb12aac5f1493fa1bdc11154eca3b258ca4eba65d39c473fe19d8e9/watchfiles-1.2.0.tar.gz", hash = "sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838", size = 108252, upload-time = "2026-05-18T04:32:04.251Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/4d/70a7feced9f87e2ff26dba42667290f41694fc64646c67261fbb8cab5d5c/watchfiles-1.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:01ea8d66f0693b9b60a6541c8d10263091ca9a9060d242f3c1f3143f9aad2c98", size = 399730, upload-time = "2026-05-18T04:31:38.162Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/3a/0da302f2307aee316922806ebd5726c542cbd787c938271cf14a074c7daf/watchfiles-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ba0480b9a74af058f43b337e937a451e109295c420916d68ad24e3dc02f5e44", size = 392842, upload-time = "2026-05-18T04:30:27.051Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/ef/d5bdb705c224dbc256aa0c1ec47bf4e61ec52558f2afb44a71a1fe4d7015/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f34e26a19f91f710c08e0183429f0d1d15df734e6bc78c31e77b9ea9c433658", size = 452989, upload-time = "2026-05-18T04:31:11.945Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/29/5495f2c1661949ef7a35e4d71111d129cfe7606414a26887a919d0a55406/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4e77f6a55f858504069abd35d336a637555c09bca453dde1ee1e5ada8a6a1fb", size = 458978, upload-time = "2026-05-18T04:30:52.606Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d5/8c/7f9c07c433811c2fffd93e13fdfb7135de9aab5f2ae41be08960fa0047dc/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cb4d80e212f116474a545c21c912b445f16bb0cef9e6a73a498164223e14e2f", size = 490248, upload-time = "2026-05-18T04:31:36.003Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/11/d93632febc52fbc21be90231bb7c17fd5387f46c9076fd40a5f9c2ae6910/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b974946a10af379d425e2eef5b62f5c6ebeaccf91d45eaad6f5b27ecd4f91aa0", size = 571847, upload-time = "2026-05-18T04:31:10.862Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/b4/383173e73aabb07ad1d9c7aa859d95437ac46a6d6a1e11005facda0c9d19/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86bc13c25a8d1fcd70b51d0ce7c9b65e90de5666fcbfd3e34957cc73ee19aeb5", size = 465974, upload-time = "2026-05-18T04:30:17.006Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a7/6c/89b1a230a78f57c52dd8893adb1f92f94411721b6ec12596c56d98c74356/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca148d73dea36c9763aaa351e4d7a51780ec1584217c45276f4fe8239c768b71", size = 454782, upload-time = "2026-05-18T04:30:35.656Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/62/1732118367cfff0a9fce3bf62ff4bfded09ef5df21d9d446b858b3f70a96/watchfiles-1.2.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:c525543d91961c6955b2636b308569e84a1d1c5f5f2932041ab9ef46422f43e3", size = 465182, upload-time = "2026-05-18T04:30:20.846Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/96/716f7e5f51339bf22963f3345f9f27d7f3b30e2eadc597e257c881dd3c53/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a204794696ffb8f9b10fba6f7cb5216d42f3b2b71860ccac6b6e42f5f10973b0", size = 629841, upload-time = "2026-05-18T04:31:05.397Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/fe/c40783950fd771ccf66ab3ec2722d188a9af1c7f96c6e811f36e40c6e03f/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:10d86db20695afe7997ac9e1717637d6714a8d0220458c33f3d2061f54cec427", size = 658028, upload-time = "2026-05-18T04:31:48.22Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/72/4508db1856d1d87fcbb3b63f4839bab1b5682cb0e8d224d122263c09654a/watchfiles-1.2.0-cp313-cp313-win32.whl", hash = "sha256:eb283ee99e21ad6443c8cdb06ac5b34b1308c329cbdf03fa02b445363714c799", size = 275183, upload-time = "2026-05-18T04:30:59.57Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/36/14b76ca57652e5cc5fd1c11f32a261292c08a0d19a00351013c2549cbfb2/watchfiles-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a0f27f01bee51861392bb6b7c4fdb290b27d1eb194e9e28788d68102a0e898d9", size = 288059, upload-time = "2026-05-18T04:32:07.937Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1b/8d/0a85e395398d8d20fadfe5c5d32c726eee17a519e78fb356f2cf7531bffe/watchfiles-1.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:3651aa7058595e9cfb75d35dd5ada2bf9f48a5b8a0f3562821d3e210c507e077", size = 280186, upload-time = "2026-05-18T04:31:54.484Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/68/36db056f1fdcc5f07302f56e631774d6835bcd6fa3ace402304621d5f9e5/watchfiles-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:faea288b6f0ab1902ef08f4ca6de005dccf856c4e0c4f21b8c5fce02d90a1b08", size = 399031, upload-time = "2026-05-18T04:30:44.576Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/64/01a9d6f66a82a5c101ce939274106cc72759d62427e153f01edd2b9f87c2/watchfiles-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01859b11fd9fbca670f4d5da00fbac282cfea9bd67a2125d8b2833a3b5617ea9", size = 391205, upload-time = "2026-05-18T04:30:25.413Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/84/2c/0a44fe058cb4bb7b8ede6b6670698bbb7c0400740e378d00022189b7b31d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fff610d7bb2256a317bb1e96f0d7862c7aa8076733ee5df0fd41bbe76a24a4f4", size = 451892, upload-time = "2026-05-18T04:32:14.005Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/a1/351e0d56cd35e6488b5c8b4fb11a809a5bc923e8fe8fed9faf8920be0c89/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b141a4891c995a039cd89e9a49e62df1dc8a559a5d1a6e4c7106d16c12777a55", size = 458867, upload-time = "2026-05-18T04:31:22.279Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d5/7d/9d09605187f1b838998624049fcf8bf47b73c1a3b76901fcac1782f62277/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f22943b7770483f6ea0721c6b11d022947a98eb0acae14694de034f4d0d38925", size = 490217, upload-time = "2026-05-18T04:31:43.657Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/5d/a17a16eccb182f04188cd308ec24b1a71a9b5c4e7098269cf35d9fa56d02/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc6195825b7dcd217968bb1f801a60fd4c16e8eeab5bedc7fe917d7d5995ab4", size = 571458, upload-time = "2026-05-18T04:32:11.875Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/3d/4dd457062083ab1938e5dfd45032eb425cee2ac817287ca8ff4356183e5d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4a4b147f5dca2a5d325a06a832fb43f345751adfbc63204aec30e0d9ca965a2", size = 464707, upload-time = "2026-05-18T04:30:43.492Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/71/ea8c57b128f5383de74d0c7d2d9c57ad7c9a65a930c451bd25d524b295b7/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4543579a9bdb0c9560039b4ffddbdb39545707659fbc430ce4c10f3f68d557f9", size = 454663, upload-time = "2026-05-18T04:30:16.061Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/fd/2e812bf938406d7db351f0703ddd3fc6c061cf30d96153a77bc79a943a44/watchfiles-1.2.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:20aa0e708b920bde876a4aa82dc7dd6ebea228a63a67cda6632c2fc87b787efa", size = 463537, upload-time = "2026-05-18T04:31:44.9Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/56/d17a7f1dd1bc3035f1072694a551301272f1739c2d8e319c927cb9e29b38/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:d413349d565dab74297f2a63e84a097936be69bf8f3b3801f27f380e32040f44", size = 629194, upload-time = "2026-05-18T04:31:14.141Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/be/06/f1ff66bf5cae50aa4062779a0ecd0bbaf15e466195719074078947d9a17d/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f28b2725eb8cce327b9b3ab02415c853011dc55c95832fe90de6bc56f5315f72", size = 656194, upload-time = "2026-05-18T04:31:47.14Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/cd/41/5e1a4bb12aac5f1493fa1bdc11154eca3b258ca4eba65d39c473fe19d8e9/watchfiles-1.2.0.tar.gz", hash = "sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838", size = 108252 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/4d/70a7feced9f87e2ff26dba42667290f41694fc64646c67261fbb8cab5d5c/watchfiles-1.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:01ea8d66f0693b9b60a6541c8d10263091ca9a9060d242f3c1f3143f9aad2c98", size = 399730 }, + { url = "https://files.pythonhosted.org/packages/31/3a/0da302f2307aee316922806ebd5726c542cbd787c938271cf14a074c7daf/watchfiles-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ba0480b9a74af058f43b337e937a451e109295c420916d68ad24e3dc02f5e44", size = 392842 }, + { url = "https://files.pythonhosted.org/packages/db/ef/d5bdb705c224dbc256aa0c1ec47bf4e61ec52558f2afb44a71a1fe4d7015/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f34e26a19f91f710c08e0183429f0d1d15df734e6bc78c31e77b9ea9c433658", size = 452989 }, + { url = "https://files.pythonhosted.org/packages/71/29/5495f2c1661949ef7a35e4d71111d129cfe7606414a26887a919d0a55406/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4e77f6a55f858504069abd35d336a637555c09bca453dde1ee1e5ada8a6a1fb", size = 458978 }, + { url = "https://files.pythonhosted.org/packages/d5/8c/7f9c07c433811c2fffd93e13fdfb7135de9aab5f2ae41be08960fa0047dc/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cb4d80e212f116474a545c21c912b445f16bb0cef9e6a73a498164223e14e2f", size = 490248 }, + { url = "https://files.pythonhosted.org/packages/3c/11/d93632febc52fbc21be90231bb7c17fd5387f46c9076fd40a5f9c2ae6910/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b974946a10af379d425e2eef5b62f5c6ebeaccf91d45eaad6f5b27ecd4f91aa0", size = 571847 }, + { url = "https://files.pythonhosted.org/packages/55/b4/383173e73aabb07ad1d9c7aa859d95437ac46a6d6a1e11005facda0c9d19/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86bc13c25a8d1fcd70b51d0ce7c9b65e90de5666fcbfd3e34957cc73ee19aeb5", size = 465974 }, + { url = "https://files.pythonhosted.org/packages/a7/6c/89b1a230a78f57c52dd8893adb1f92f94411721b6ec12596c56d98c74356/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca148d73dea36c9763aaa351e4d7a51780ec1584217c45276f4fe8239c768b71", size = 454782 }, + { url = "https://files.pythonhosted.org/packages/24/62/1732118367cfff0a9fce3bf62ff4bfded09ef5df21d9d446b858b3f70a96/watchfiles-1.2.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:c525543d91961c6955b2636b308569e84a1d1c5f5f2932041ab9ef46422f43e3", size = 465182 }, + { url = "https://files.pythonhosted.org/packages/28/96/716f7e5f51339bf22963f3345f9f27d7f3b30e2eadc597e257c881dd3c53/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a204794696ffb8f9b10fba6f7cb5216d42f3b2b71860ccac6b6e42f5f10973b0", size = 629841 }, + { url = "https://files.pythonhosted.org/packages/4c/fe/c40783950fd771ccf66ab3ec2722d188a9af1c7f96c6e811f36e40c6e03f/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:10d86db20695afe7997ac9e1717637d6714a8d0220458c33f3d2061f54cec427", size = 658028 }, + { url = "https://files.pythonhosted.org/packages/71/72/4508db1856d1d87fcbb3b63f4839bab1b5682cb0e8d224d122263c09654a/watchfiles-1.2.0-cp313-cp313-win32.whl", hash = "sha256:eb283ee99e21ad6443c8cdb06ac5b34b1308c329cbdf03fa02b445363714c799", size = 275183 }, + { url = "https://files.pythonhosted.org/packages/f9/36/14b76ca57652e5cc5fd1c11f32a261292c08a0d19a00351013c2549cbfb2/watchfiles-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a0f27f01bee51861392bb6b7c4fdb290b27d1eb194e9e28788d68102a0e898d9", size = 288059 }, + { url = "https://files.pythonhosted.org/packages/1b/8d/0a85e395398d8d20fadfe5c5d32c726eee17a519e78fb356f2cf7531bffe/watchfiles-1.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:3651aa7058595e9cfb75d35dd5ada2bf9f48a5b8a0f3562821d3e210c507e077", size = 280186 }, + { url = "https://files.pythonhosted.org/packages/37/68/36db056f1fdcc5f07302f56e631774d6835bcd6fa3ace402304621d5f9e5/watchfiles-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:faea288b6f0ab1902ef08f4ca6de005dccf856c4e0c4f21b8c5fce02d90a1b08", size = 399031 }, + { url = "https://files.pythonhosted.org/packages/c1/64/01a9d6f66a82a5c101ce939274106cc72759d62427e153f01edd2b9f87c2/watchfiles-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01859b11fd9fbca670f4d5da00fbac282cfea9bd67a2125d8b2833a3b5617ea9", size = 391205 }, + { url = "https://files.pythonhosted.org/packages/84/2c/0a44fe058cb4bb7b8ede6b6670698bbb7c0400740e378d00022189b7b31d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fff610d7bb2256a317bb1e96f0d7862c7aa8076733ee5df0fd41bbe76a24a4f4", size = 451892 }, + { url = "https://files.pythonhosted.org/packages/67/a1/351e0d56cd35e6488b5c8b4fb11a809a5bc923e8fe8fed9faf8920be0c89/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b141a4891c995a039cd89e9a49e62df1dc8a559a5d1a6e4c7106d16c12777a55", size = 458867 }, + { url = "https://files.pythonhosted.org/packages/d5/7d/9d09605187f1b838998624049fcf8bf47b73c1a3b76901fcac1782f62277/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f22943b7770483f6ea0721c6b11d022947a98eb0acae14694de034f4d0d38925", size = 490217 }, + { url = "https://files.pythonhosted.org/packages/60/5d/a17a16eccb182f04188cd308ec24b1a71a9b5c4e7098269cf35d9fa56d02/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc6195825b7dcd217968bb1f801a60fd4c16e8eeab5bedc7fe917d7d5995ab4", size = 571458 }, + { url = "https://files.pythonhosted.org/packages/d3/3d/4dd457062083ab1938e5dfd45032eb425cee2ac817287ca8ff4356183e5d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4a4b147f5dca2a5d325a06a832fb43f345751adfbc63204aec30e0d9ca965a2", size = 464707 }, + { url = "https://files.pythonhosted.org/packages/c6/71/ea8c57b128f5383de74d0c7d2d9c57ad7c9a65a930c451bd25d524b295b7/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4543579a9bdb0c9560039b4ffddbdb39545707659fbc430ce4c10f3f68d557f9", size = 454663 }, + { url = "https://files.pythonhosted.org/packages/53/fd/2e812bf938406d7db351f0703ddd3fc6c061cf30d96153a77bc79a943a44/watchfiles-1.2.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:20aa0e708b920bde876a4aa82dc7dd6ebea228a63a67cda6632c2fc87b787efa", size = 463537 }, + { url = "https://files.pythonhosted.org/packages/86/56/d17a7f1dd1bc3035f1072694a551301272f1739c2d8e319c927cb9e29b38/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:d413349d565dab74297f2a63e84a097936be69bf8f3b3801f27f380e32040f44", size = 629194 }, + { url = "https://files.pythonhosted.org/packages/be/06/f1ff66bf5cae50aa4062779a0ecd0bbaf15e466195719074078947d9a17d/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f28b2725eb8cce327b9b3ab02415c853011dc55c95832fe90de6bc56f5315f72", size = 656194 }, ] [[package]] name = "wcwidth" version = "0.8.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/34/74/c6428f875774288bec1396f5bfcbc2d925700a4dad61727fd5f2b12f249d/wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda", size = 1466253, upload-time = "2026-06-29T18:11:11.601Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/74/c6428f875774288bec1396f5bfcbc2d925700a4dad61727fd5f2b12f249d/wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda", size = 1466253 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85", size = 323166, upload-time = "2026-06-29T18:11:09.888Z" }, + { url = "https://files.pythonhosted.org/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85", size = 323166 }, ] [[package]] name = "websocket-client" version = "1.9.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616 }, ] [[package]] name = "websockets" version = "15.0.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/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" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 }, ] [[package]] name = "win32-setctime" version = "1.2.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload-time = "2024-12-07T15:28:28.314Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload-time = "2024-12-07T15:28:26.465Z" }, + { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083 }, +] + +[[package]] +name = "wolfharness" +version = "2.9.5" +source = { editable = "." } +dependencies = [ + { name = "ag-ui-protocol" }, + { name = "alembic" }, + { name = "anyenv", extra = ["httpx"] }, + { name = "anyio" }, + { name = "docler" }, + { name = "docstring-parser" }, + { name = "epregistry" }, + { name = "evented" }, + { name = "exxec" }, + { name = "fastapi" }, + { name = "fastmcp" }, + { name = "filelock" }, + { name = "fsspec" }, + { name = "httpx" }, + { name = "jinja2" }, + { name = "jinjarope" }, + { name = "keyring" }, + { name = "logfire", extra = ["fastapi"] }, + { name = "mcp" }, + { name = "pillow" }, + { name = "platformdirs" }, + { name = "promptantic" }, + { name = "psygnal" }, + { name = "py-key-value-aio", extra = ["disk"] }, + { name = "pydantic" }, + { name = "pydantic-ai-slim", extra = ["anthropic", "google", "mistral", "openai", "retries"] }, + { name = "pydantic-graph" }, + { name = "pydantic-xml" }, + { name = "pydocket" }, + { name = "python-dotenv" }, + { name = "rich" }, + { name = "ripgrep-rs" }, + { name = "schemez", extra = ["codegen"] }, + { name = "searchly", extra = ["all"] }, + { name = "slashed" }, + { name = "sqlalchemy", extra = ["aiosqlite"] }, + { name = "sqlmodel" }, + { name = "starlette" }, + { name = "structlog" }, + { name = "sublime-search" }, + { name = "tokonomics" }, + { name = "toprompt" }, + { name = "typer" }, + { name = "upathtools", extra = ["httpx"] }, + { name = "uvicorn", extra = ["standard"] }, + { name = "watchfiles" }, + { name = "websockets" }, + { name = "yamling" }, +] + +[package.optional-dependencies] +a2a = [ + { name = "fasta2a" }, + { name = "starlette" }, +] +bot = [ + { name = "croniter" }, + { name = "python-telegram-bot", extra = ["socks"] }, + { name = "slack-sdk" }, + { name = "slackify-markdown" }, +] +braintrust = [ + { name = "autoevals" }, + { name = "braintrust" }, +] +clipboard = [ + { name = "copykitten" }, +] +coding = [ + { name = "ast-grep-py" }, + { name = "grep-ast" }, + { name = "rustworkx" }, + { name = "tree-sitter" }, + { name = "tree-sitter-c" }, + { name = "tree-sitter-cpp" }, + { name = "tree-sitter-go" }, + { name = "tree-sitter-javascript" }, + { name = "tree-sitter-json" }, + { name = "tree-sitter-python" }, + { name = "tree-sitter-rust" }, + { name = "tree-sitter-typescript" }, + { name = "tree-sitter-yaml" }, +] +composio = [ + { name = "composio" }, +] +events = [ + { name = "evented", extra = ["all"] }, +] +langfuse = [ + { name = "langfuse" }, +] +markitdown = [ + { name = "markitdown" }, +] +mcp-discovery = [ + { name = "fastembed" }, + { name = "lancedb" }, + { name = "pyarrow" }, +] +mcp-run = [ + { name = "mcpx-py" }, +] +notifications = [ + { name = "apprise" }, +] +promptlayer = [ + { name = "promptlayer" }, +] +tiktoken = [ + { name = "tiktoken" }, +] +tts = [ + { name = "anyvoice", extra = ["openai", "tts-edge"] }, +] +viking = [ + { name = "openviking-sdk" }, +] +watchdog = [ + { name = "watchdog" }, +] +zed = [ + { name = "zstandard" }, +] + +[package.dev-dependencies] +benchmark = [ + { name = "pyinstrument" }, +] +dev = [ + { name = "check-jsonschema" }, + { name = "devtools" }, + { name = "dirty-equals" }, + { name = "fastembed" }, + { name = "import-linter" }, + { name = "inline-snapshot" }, + { name = "lancedb" }, + { name = "openapi-spec-validator" }, + { name = "pyinstaller" }, + { name = "pyreadline3" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-cov" }, + { name = "pytest-recording" }, + { name = "pytest-rerunfailures" }, + { name = "pytest-timeout" }, + { name = "pytest-xdist" }, + { name = "syrupy" }, + { name = "vcrpy" }, +] +docs = [ + { name = "beautifulsoup4" }, + { name = "json-schema-for-humans" }, + { name = "mkdocs-material" }, + { name = "mknodes" }, + { name = "zensical" }, +] +lint = [ + { name = "mypy", extra = ["faster-cache"] }, + { name = "ruff" }, + { name = "ty" }, + { name = "types-croniter" }, + { name = "types-jsonschema" }, + { name = "types-pygments" }, + { name = "types-pyyaml" }, +] + +[package.metadata] +requires-dist = [ + { name = "ag-ui-protocol", specifier = ">=0.1.10" }, + { name = "alembic", specifier = ">=1.16.5" }, + { name = "anyenv", extras = ["httpx"], specifier = ">=0.3.0" }, + { name = "anyio", specifier = ">=4.0" }, + { name = "anyvoice", extras = ["tts-edge", "openai"], marker = "extra == 'tts'", specifier = ">=0.0.2" }, + { name = "apprise", marker = "extra == 'notifications'", specifier = ">=1.9.5" }, + { name = "ast-grep-py", marker = "extra == 'coding'", specifier = ">=0.40.0" }, + { name = "autoevals", marker = "extra == 'braintrust'" }, + { name = "braintrust", marker = "extra == 'braintrust'" }, + { name = "composio", marker = "extra == 'composio'" }, + { name = "copykitten", marker = "extra == 'clipboard'" }, + { name = "croniter", marker = "extra == 'bot'", specifier = ">=2.0.0" }, + { name = "docler", specifier = ">=1.0.3" }, + { name = "docstring-parser", specifier = ">=0.17.0" }, + { name = "epregistry" }, + { name = "evented", specifier = ">=1.0.5" }, + { name = "evented", extras = ["all"], marker = "extra == 'events'" }, + { name = "exxec", specifier = ">=0.1.0" }, + { name = "fasta2a", marker = "extra == 'a2a'" }, + { name = "fastapi" }, + { name = "fastembed", marker = "python_full_version < '3.14' and extra == 'mcp-discovery'", specifier = ">=0.7.4" }, + { name = "fastmcp", specifier = ">=2.12.4" }, + { name = "filelock", specifier = ">=3.13" }, + { name = "fsspec" }, + { name = "grep-ast", marker = "extra == 'coding'" }, + { name = "httpx" }, + { name = "jinja2" }, + { name = "jinjarope" }, + { name = "keyring", specifier = ">=25.6.0" }, + { name = "lancedb", marker = "python_full_version < '3.14' and extra == 'mcp-discovery'", specifier = ">=0.26.0" }, + { name = "langfuse", marker = "extra == 'langfuse'" }, + { name = "logfire", extras = ["fastapi"] }, + { name = "markitdown", marker = "python_full_version < '3.14' and extra == 'markitdown'" }, + { name = "mcp", specifier = ">=1.2.0" }, + { name = "mcpx-py", marker = "extra == 'mcp-run'", specifier = ">=0.7.0" }, + { name = "openviking-sdk", marker = "extra == 'viking'", specifier = ">=0.1.0" }, + { name = "pillow", specifier = ">=11.3.0" }, + { name = "platformdirs" }, + { name = "promptantic", specifier = ">=0.4.5" }, + { name = "promptlayer", marker = "extra == 'promptlayer'" }, + { name = "psygnal", specifier = ">=0.11.1" }, + { name = "py-key-value-aio", extras = ["disk"] }, + { name = "pyarrow", marker = "python_full_version < '3.14' and extra == 'mcp-discovery'", specifier = ">=19.0.0" }, + { name = "pydantic", specifier = ">=2.10.0" }, + { name = "pydantic-ai-slim", extras = ["openai", "google", "anthropic", "mistral", "retries"], specifier = ">=2.12.0" }, + { name = "pydantic-graph", specifier = ">=2.12.0" }, + { name = "pydantic-xml", specifier = ">=2.6.0" }, + { name = "pydocket", specifier = ">=0.16.1" }, + { name = "python-dotenv", specifier = ">=1.0.1" }, + { name = "python-telegram-bot", extras = ["socks"], marker = "extra == 'bot'", specifier = ">=21.0" }, + { name = "rich" }, + { name = "ripgrep-rs", specifier = ">=0.3.0" }, + { name = "rustworkx", marker = "extra == 'coding'", specifier = ">=0.17.1" }, + { name = "schemez", extras = ["codegen"] }, + { name = "searchly", extras = ["all"], specifier = ">=2.0.1" }, + { name = "slack-sdk", marker = "extra == 'bot'", specifier = ">=3.26.0" }, + { name = "slackify-markdown", marker = "extra == 'bot'", specifier = ">=0.2.0" }, + { name = "slashed", specifier = ">=0.1.0" }, + { name = "sqlalchemy", extras = ["aiosqlite"] }, + { name = "sqlmodel", specifier = ">=0.0.22" }, + { name = "starlette", specifier = ">=0.40" }, + { name = "starlette", marker = "extra == 'a2a'" }, + { name = "structlog", specifier = ">=25.5.0" }, + { name = "sublime-search", specifier = ">=0.3.1" }, + { name = "tiktoken", marker = "extra == 'tiktoken'" }, + { name = "tokonomics", specifier = ">=0.1.2" }, + { name = "toprompt", specifier = ">=0.0.1" }, + { name = "tree-sitter", marker = "extra == 'coding'", specifier = ">=0.25.2" }, + { name = "tree-sitter-c", marker = "extra == 'coding'", specifier = ">=0.24.1" }, + { name = "tree-sitter-cpp", marker = "extra == 'coding'", specifier = ">=0.23.0" }, + { name = "tree-sitter-go", marker = "extra == 'coding'", specifier = ">=0.23.0" }, + { name = "tree-sitter-javascript", marker = "extra == 'coding'", specifier = ">=0.25.0" }, + { name = "tree-sitter-json", marker = "extra == 'coding'", specifier = ">=0.24.0" }, + { name = "tree-sitter-python", marker = "extra == 'coding'", specifier = ">=0.25.0" }, + { name = "tree-sitter-rust", marker = "extra == 'coding'", specifier = ">=0.23.0" }, + { name = "tree-sitter-typescript", marker = "extra == 'coding'", specifier = ">=0.23.0" }, + { name = "tree-sitter-yaml", marker = "extra == 'coding'", specifier = ">=0.6.0" }, + { name = "typer" }, + { name = "upathtools", extras = ["httpx"], specifier = ">=0.1.0" }, + { name = "uvicorn", extras = ["standard"] }, + { name = "watchdog", marker = "extra == 'watchdog'", specifier = ">=4.0.0" }, + { name = "watchfiles", specifier = ">=1.1.1" }, + { name = "websockets", specifier = ">=15.0" }, + { name = "yamling", specifier = ">=2.0.2" }, + { name = "zstandard", marker = "extra == 'zed'", specifier = ">=0.23.0" }, +] +provides-extras = ["a2a", "bot", "braintrust", "clipboard", "coding", "composio", "events", "langfuse", "markitdown", "mcp-discovery", "mcp-run", "notifications", "promptlayer", "tiktoken", "tts", "viking", "watchdog", "zed"] + +[package.metadata.requires-dev] +benchmark = [{ name = "pyinstrument" }] +dev = [ + { name = "check-jsonschema", specifier = ">=0.35.0" }, + { name = "devtools" }, + { name = "dirty-equals", specifier = ">=0.9.0" }, + { name = "fastembed", marker = "python_full_version < '3.14'", specifier = ">=0.7.4" }, + { name = "import-linter", specifier = ">=2.12" }, + { name = "inline-snapshot", specifier = ">=0.13.0" }, + { name = "lancedb", marker = "python_full_version < '3.14'", specifier = ">=0.26.0" }, + { name = "openapi-spec-validator" }, + { name = "pyinstaller", specifier = ">=6.17.0" }, + { name = "pyreadline3" }, + { name = "pytest" }, + { name = "pytest-asyncio", specifier = ">=0.24.0" }, + { name = "pytest-cov" }, + { name = "pytest-recording", specifier = ">=0.13.0" }, + { name = "pytest-rerunfailures", specifier = ">=16.1" }, + { name = "pytest-timeout", specifier = ">=2.4.0" }, + { name = "pytest-xdist" }, + { name = "syrupy", specifier = ">=4.0.0" }, + { name = "vcrpy", specifier = ">=7.0.0" }, +] +docs = [ + { name = "beautifulsoup4", specifier = ">=4.14.3" }, + { name = "json-schema-for-humans", specifier = ">=1.0.0" }, + { name = "mkdocs-material" }, + { name = "mknodes" }, + { name = "zensical", specifier = ">=0.0.51" }, +] +lint = [ + { name = "mypy", extras = ["faster-cache"] }, + { name = "ruff" }, + { name = "ty" }, + { name = "types-croniter" }, + { name = "types-jsonschema", specifier = ">=4.25.1.20251009" }, + { name = "types-pygments" }, + { name = "types-pyyaml" }, ] [[package]] name = "wrapt" version = "1.17.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/8f/aeb76c5b46e273670962298c23e7ddde79916cb74db802131d49a85e4b7d/wrapt-1.17.3.tar.gz", hash = "sha256:f66eb08feaa410fe4eebd17f2a2c8e2e46d3476e9f8c783daa8e09e0faa666d0", size = 55547, upload-time = "2025-08-12T05:53:21.714Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/8f/aeb76c5b46e273670962298c23e7ddde79916cb74db802131d49a85e4b7d/wrapt-1.17.3.tar.gz", hash = "sha256:f66eb08feaa410fe4eebd17f2a2c8e2e46d3476e9f8c783daa8e09e0faa666d0", size = 55547 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/f6/759ece88472157acb55fc195e5b116e06730f1b651b5b314c66291729193/wrapt-1.17.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a47681378a0439215912ef542c45a783484d4dd82bac412b71e59cf9c0e1cea0", size = 54003, upload-time = "2025-08-12T05:51:48.627Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4f/a9/49940b9dc6d47027dc850c116d79b4155f15c08547d04db0f07121499347/wrapt-1.17.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a30837587c6ee3cd1a4d1c2ec5d24e77984d44e2f34547e2323ddb4e22eb77", size = 39025, upload-time = "2025-08-12T05:51:37.156Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/35/6a08de0f2c96dcdd7fe464d7420ddb9a7655a6561150e5fc4da9356aeaab/wrapt-1.17.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:16ecf15d6af39246fe33e507105d67e4b81d8f8d2c6598ff7e3ca1b8a37213f7", size = 39108, upload-time = "2025-08-12T05:51:58.425Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/37/6faf15cfa41bf1f3dba80cd3f5ccc6622dfccb660ab26ed79f0178c7497f/wrapt-1.17.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6fd1ad24dc235e4ab88cda009e19bf347aabb975e44fd5c2fb22a3f6e4141277", size = 88072, upload-time = "2025-08-12T05:52:37.53Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/f2/efe19ada4a38e4e15b6dff39c3e3f3f73f5decf901f66e6f72fe79623a06/wrapt-1.17.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ed61b7c2d49cee3c027372df5809a59d60cf1b6c2f81ee980a091f3afed6a2d", size = 88214, upload-time = "2025-08-12T05:52:15.886Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/90/ca86701e9de1622b16e09689fc24b76f69b06bb0150990f6f4e8b0eeb576/wrapt-1.17.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:423ed5420ad5f5529db9ce89eac09c8a2f97da18eb1c870237e84c5a5c2d60aa", size = 87105, upload-time = "2025-08-12T05:52:17.914Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/e0/d10bd257c9a3e15cbf5523025252cc14d77468e8ed644aafb2d6f54cb95d/wrapt-1.17.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e01375f275f010fcbf7f643b4279896d04e571889b8a5b3f848423d91bf07050", size = 87766, upload-time = "2025-08-12T05:52:39.243Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/cf/7d848740203c7b4b27eb55dbfede11aca974a51c3d894f6cc4b865f42f58/wrapt-1.17.3-cp313-cp313-win32.whl", hash = "sha256:53e5e39ff71b3fc484df8a522c933ea2b7cdd0d5d15ae82e5b23fde87d44cbd8", size = 36711, upload-time = "2025-08-12T05:53:10.074Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/54/35a84d0a4d23ea675994104e667ceff49227ce473ba6a59ba2c84f250b74/wrapt-1.17.3-cp313-cp313-win_amd64.whl", hash = "sha256:1f0b2f40cf341ee8cc1a97d51ff50dddb9fcc73241b9143ec74b30fc4f44f6cb", size = 38885, upload-time = "2025-08-12T05:53:08.695Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/77/66e54407c59d7b02a3c4e0af3783168fff8e5d61def52cda8728439d86bc/wrapt-1.17.3-cp313-cp313-win_arm64.whl", hash = "sha256:7425ac3c54430f5fc5e7b6f41d41e704db073309acfc09305816bc6a0b26bb16", size = 36896, upload-time = "2025-08-12T05:52:55.34Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/f6/a933bd70f98e9cf3e08167fc5cd7aaaca49147e48411c0bd5ae701bb2194/wrapt-1.17.3-py3-none-any.whl", hash = "sha256:7171ae35d2c33d326ac19dd8facb1e82e5fd04ef8c6c0e394d7af55a55051c22", size = 23591, upload-time = "2025-08-12T05:53:20.674Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f6/759ece88472157acb55fc195e5b116e06730f1b651b5b314c66291729193/wrapt-1.17.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a47681378a0439215912ef542c45a783484d4dd82bac412b71e59cf9c0e1cea0", size = 54003 }, + { url = "https://files.pythonhosted.org/packages/4f/a9/49940b9dc6d47027dc850c116d79b4155f15c08547d04db0f07121499347/wrapt-1.17.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a30837587c6ee3cd1a4d1c2ec5d24e77984d44e2f34547e2323ddb4e22eb77", size = 39025 }, + { url = "https://files.pythonhosted.org/packages/45/35/6a08de0f2c96dcdd7fe464d7420ddb9a7655a6561150e5fc4da9356aeaab/wrapt-1.17.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:16ecf15d6af39246fe33e507105d67e4b81d8f8d2c6598ff7e3ca1b8a37213f7", size = 39108 }, + { url = "https://files.pythonhosted.org/packages/0c/37/6faf15cfa41bf1f3dba80cd3f5ccc6622dfccb660ab26ed79f0178c7497f/wrapt-1.17.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6fd1ad24dc235e4ab88cda009e19bf347aabb975e44fd5c2fb22a3f6e4141277", size = 88072 }, + { url = "https://files.pythonhosted.org/packages/78/f2/efe19ada4a38e4e15b6dff39c3e3f3f73f5decf901f66e6f72fe79623a06/wrapt-1.17.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ed61b7c2d49cee3c027372df5809a59d60cf1b6c2f81ee980a091f3afed6a2d", size = 88214 }, + { url = "https://files.pythonhosted.org/packages/40/90/ca86701e9de1622b16e09689fc24b76f69b06bb0150990f6f4e8b0eeb576/wrapt-1.17.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:423ed5420ad5f5529db9ce89eac09c8a2f97da18eb1c870237e84c5a5c2d60aa", size = 87105 }, + { url = "https://files.pythonhosted.org/packages/fd/e0/d10bd257c9a3e15cbf5523025252cc14d77468e8ed644aafb2d6f54cb95d/wrapt-1.17.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e01375f275f010fcbf7f643b4279896d04e571889b8a5b3f848423d91bf07050", size = 87766 }, + { url = "https://files.pythonhosted.org/packages/e8/cf/7d848740203c7b4b27eb55dbfede11aca974a51c3d894f6cc4b865f42f58/wrapt-1.17.3-cp313-cp313-win32.whl", hash = "sha256:53e5e39ff71b3fc484df8a522c933ea2b7cdd0d5d15ae82e5b23fde87d44cbd8", size = 36711 }, + { url = "https://files.pythonhosted.org/packages/57/54/35a84d0a4d23ea675994104e667ceff49227ce473ba6a59ba2c84f250b74/wrapt-1.17.3-cp313-cp313-win_amd64.whl", hash = "sha256:1f0b2f40cf341ee8cc1a97d51ff50dddb9fcc73241b9143ec74b30fc4f44f6cb", size = 38885 }, + { url = "https://files.pythonhosted.org/packages/01/77/66e54407c59d7b02a3c4e0af3783168fff8e5d61def52cda8728439d86bc/wrapt-1.17.3-cp313-cp313-win_arm64.whl", hash = "sha256:7425ac3c54430f5fc5e7b6f41d41e704db073309acfc09305816bc6a0b26bb16", size = 36896 }, + { url = "https://files.pythonhosted.org/packages/1f/f6/a933bd70f98e9cf3e08167fc5cd7aaaca49147e48411c0bd5ae701bb2194/wrapt-1.17.3-py3-none-any.whl", hash = "sha256:7171ae35d2c33d326ac19dd8facb1e82e5fd04ef8c6c0e394d7af55a55051c22", size = 23591 }, ] [[package]] name = "yamling" version = "2.1.7" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyenv" }, { name = "fsspec" }, @@ -5707,46 +5712,46 @@ dependencies = [ { name = "universal-pathlib" }, { name = "upathtools" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/77/16d795d8c89ab018f8aeac0b075adb0491dbe2f3e95410f89ac93ff46803/yamling-2.1.7.tar.gz", hash = "sha256:b75e5b37dc3d2a874286604ec7179a3a149541c3ebfeb7f50ee7e66e1bacabf9", size = 24561, upload-time = "2025-12-10T10:47:50.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/77/16d795d8c89ab018f8aeac0b075adb0491dbe2f3e95410f89ac93ff46803/yamling-2.1.7.tar.gz", hash = "sha256:b75e5b37dc3d2a874286604ec7179a3a149541c3ebfeb7f50ee7e66e1bacabf9", size = 24561 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/3f/d981b71fd7332a3f70a17e4111e01f36ec38b7333eda8ae508cc2959b7de/yamling-2.1.7-py3-none-any.whl", hash = "sha256:730c4be2c5efe44660e1b77db82a87c305cdfcc669052742925b026c1078081a", size = 30465, upload-time = "2025-12-10T10:47:47.611Z" }, + { url = "https://files.pythonhosted.org/packages/2a/3f/d981b71fd7332a3f70a17e4111e01f36ec38b7333eda8ae508cc2959b7de/yamling-2.1.7-py3-none-any.whl", hash = "sha256:730c4be2c5efe44660e1b77db82a87c305cdfcc669052742925b026c1078081a", size = 30465 }, ] [[package]] name = "yarl" version = "1.24.5" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/33/ebe9e3d1f86c7a0b51094c0a146392045ca1631d2664889539dec8088a33/yarl-1.24.5.tar.gz", hash = "sha256:e81b83143bee16329c23db3c1b2d82b29892fcbcb849186d2f6e98a5abe9a57f", size = 228679, upload-time = "2026-07-20T02:07:45.435Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/63/64ef361967cc983573149dc1515d531db5da8a4c92d22bb833d59e01b313/yarl-1.24.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:79af890482fc94648e8cde4c68620378f7fef60932710fa17a66abc039244da2", size = 135075, upload-time = "2026-07-20T02:05:59.671Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bb/89/55920fd853ce43e608adbc3962456f0d649d6bb15250dc2988321da0fe1c/yarl-1.24.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:46c2f213e23a04b93a392942d782eb9e413e6ef6bf7c8c53884e599a5c174dcb", size = 97225, upload-time = "2026-07-20T02:06:01.769Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/15/f0/7688d3f2cfff7590df2af38ec46d969f4281a4dddb08a9ad2eafbcdddf98/yarl-1.24.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92ab3e11448f2ff7bf53c5a26eff0edc086898ec8b21fb154b85839ce1d88075", size = 96751, upload-time = "2026-07-20T02:06:03.676Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/1a/a851a0f94aaaf379dd4f901bfc80f634280bec51eb260b47363e2a4cd62e/yarl-1.24.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ebb0ec7f17803063d5aeb982f3b1bd2b2f4e4fae6751226cbd6ba1fcfe9e63ff", size = 107960, upload-time = "2026-07-20T02:06:05.699Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/a8/faea066c12f9c77ca0de90641f1655f9dd7b412477bf28c76d692f3aecff/yarl-1.24.5-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:82632daed195dcc8ea664e8556dc9bdbd671960fb3776bd92806ce05792c2448", size = 103500, upload-time = "2026-07-20T02:06:07.556Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/9c/1e67084c2a6e2f2db0e3be798328cb3be42c0119b621d25461479a224d21/yarl-1.24.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:53e549287ef628fecba270045c9701b0c564563a9b0577d24a4ec75b8ab8040f", size = 115780, upload-time = "2026-07-20T02:06:09.599Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/86/1f94664e147474337e3359f52012cf3d02f825f694317b178bfba1078c62/yarl-1.24.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fcd3b77e2f17bbe4ca56ec7bcb07992647d19d0b9c05d84886dcd6f9eb810afd", size = 115308, upload-time = "2026-07-20T02:06:11.352Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/43/8e55ae7538ba5f28ccb3c845c6dd4549cf7016d5992e5326512519107cdd/yarl-1.24.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d46b86567dd4e248c6c159fcbcdcce01e0a5c8a7cd2334a0fff759d0fa075b16", size = 110574, upload-time = "2026-07-20T02:06:13.129Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/ba/a889ec8765cedcf2ac44dcb02d6a21e4861399b243b263c5f2dde27ee740/yarl-1.24.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7f72c74aa99359e27a2ee8d6613fefa28b5f76a983c083074dfc2aaa4ab46213", size = 109914, upload-time = "2026-07-20T02:06:15.243Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9c/c3/e45f821af67b791c2dbbe4a9f4137a1d33f8d386654a05a0c3f47bdfa25d/yarl-1.24.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3f45789ce415a7ec0820dc4f82925f9b5f7732070be1dec1f5f23ec381435a24", size = 107712, upload-time = "2026-07-20T02:06:17.443Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/00/2ab0f42c9857fcb490bfaa6647b14540b53d241ab209f23220b958cc5832/yarl-1.24.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6e73e7fe93f17a7b191f52ec9da9dd8c06a8fe735a1ecbd13b97d1c723bff385", size = 104251, upload-time = "2026-07-20T02:06:19.259Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/70/709d9a286e98af2c7fd8e4e6cada658b5c0e30d87dd7e2a63c2fb5767217/yarl-1.24.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4a36f9becdd4c5c52a20c3e9484128b070b1dcfc8944c006f3a528295a359a9c", size = 115319, upload-time = "2026-07-20T02:06:21.207Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/6c/3eaa515142991fe84cfc483ff986492211f1978f90161ccefdbec919d09b/yarl-1.24.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:7bcbe0fcf850eae67b6b01749815a4f7161c560a844c769ad7b48fcd99f791c4", size = 109163, upload-time = "2026-07-20T02:06:23.006Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bb/64/711dafce66c323a3144d470547a71c5384c57623308ac8bb5e4b903ac148/yarl-1.24.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:24e861e9630e0daddcb9191fb187f60f034e17a4426f8101279f0c475cd74144", size = 115435, upload-time = "2026-07-20T02:06:24.923Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cf/f3/9b9d0e6d84bea851eb1ba99e4bdc755b86fd813e49ec86dfe42f26befdef/yarl-1.24.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9335a099ad87287c37fe5d1a982ff392fa5efe5d14b40a730b1ec1d6a41382b4", size = 110691, upload-time = "2026-07-20T02:06:26.973Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/e4/62a06b7e87c4246ac76b7c2da136f972eb4a3a1fc94abb07e7022d6fdb0a/yarl-1.24.5-cp313-cp313-win_amd64.whl", hash = "sha256:2dbe06fc16bc91502bca713704022182e5729861ae00277c3a23354b40929740", size = 97454, upload-time = "2026-07-20T02:06:29.163Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/c9/5fc8025b318ab10db413b61056bd0d95c557a70e8df4210c7511f866329c/yarl-1.24.5-cp313-cp313-win_arm64.whl", hash = "sha256:6b8536851f9f65e7f00c7a1d49ba7f2be0ffe2c11555367fc9f50d9f842410a1", size = 92813, upload-time = "2026-07-20T02:06:31.113Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/61/02/962c1cbfc401a30c1d034dc67ff395f64b52302c6d62de556c1fca99acc0/yarl-1.24.5-py3-none-any.whl", hash = "sha256:a33700d13d9b7d84fd10947b09ff69fb9a792e519c8cb9764a3ca70baa6c23a7", size = 58612, upload-time = "2026-07-20T02:07:43.461Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/31/33/ebe9e3d1f86c7a0b51094c0a146392045ca1631d2664889539dec8088a33/yarl-1.24.5.tar.gz", hash = "sha256:e81b83143bee16329c23db3c1b2d82b29892fcbcb849186d2f6e98a5abe9a57f", size = 228679 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/63/64ef361967cc983573149dc1515d531db5da8a4c92d22bb833d59e01b313/yarl-1.24.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:79af890482fc94648e8cde4c68620378f7fef60932710fa17a66abc039244da2", size = 135075 }, + { url = "https://files.pythonhosted.org/packages/bb/89/55920fd853ce43e608adbc3962456f0d649d6bb15250dc2988321da0fe1c/yarl-1.24.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:46c2f213e23a04b93a392942d782eb9e413e6ef6bf7c8c53884e599a5c174dcb", size = 97225 }, + { url = "https://files.pythonhosted.org/packages/15/f0/7688d3f2cfff7590df2af38ec46d969f4281a4dddb08a9ad2eafbcdddf98/yarl-1.24.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92ab3e11448f2ff7bf53c5a26eff0edc086898ec8b21fb154b85839ce1d88075", size = 96751 }, + { url = "https://files.pythonhosted.org/packages/05/1a/a851a0f94aaaf379dd4f901bfc80f634280bec51eb260b47363e2a4cd62e/yarl-1.24.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ebb0ec7f17803063d5aeb982f3b1bd2b2f4e4fae6751226cbd6ba1fcfe9e63ff", size = 107960 }, + { url = "https://files.pythonhosted.org/packages/6c/a8/faea066c12f9c77ca0de90641f1655f9dd7b412477bf28c76d692f3aecff/yarl-1.24.5-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:82632daed195dcc8ea664e8556dc9bdbd671960fb3776bd92806ce05792c2448", size = 103500 }, + { url = "https://files.pythonhosted.org/packages/fb/9c/1e67084c2a6e2f2db0e3be798328cb3be42c0119b621d25461479a224d21/yarl-1.24.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:53e549287ef628fecba270045c9701b0c564563a9b0577d24a4ec75b8ab8040f", size = 115780 }, + { url = "https://files.pythonhosted.org/packages/58/86/1f94664e147474337e3359f52012cf3d02f825f694317b178bfba1078c62/yarl-1.24.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fcd3b77e2f17bbe4ca56ec7bcb07992647d19d0b9c05d84886dcd6f9eb810afd", size = 115308 }, + { url = "https://files.pythonhosted.org/packages/0a/43/8e55ae7538ba5f28ccb3c845c6dd4549cf7016d5992e5326512519107cdd/yarl-1.24.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d46b86567dd4e248c6c159fcbcdcce01e0a5c8a7cd2334a0fff759d0fa075b16", size = 110574 }, + { url = "https://files.pythonhosted.org/packages/ce/ba/a889ec8765cedcf2ac44dcb02d6a21e4861399b243b263c5f2dde27ee740/yarl-1.24.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7f72c74aa99359e27a2ee8d6613fefa28b5f76a983c083074dfc2aaa4ab46213", size = 109914 }, + { url = "https://files.pythonhosted.org/packages/9c/c3/e45f821af67b791c2dbbe4a9f4137a1d33f8d386654a05a0c3f47bdfa25d/yarl-1.24.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3f45789ce415a7ec0820dc4f82925f9b5f7732070be1dec1f5f23ec381435a24", size = 107712 }, + { url = "https://files.pythonhosted.org/packages/02/00/2ab0f42c9857fcb490bfaa6647b14540b53d241ab209f23220b958cc5832/yarl-1.24.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6e73e7fe93f17a7b191f52ec9da9dd8c06a8fe735a1ecbd13b97d1c723bff385", size = 104251 }, + { url = "https://files.pythonhosted.org/packages/7a/70/709d9a286e98af2c7fd8e4e6cada658b5c0e30d87dd7e2a63c2fb5767217/yarl-1.24.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4a36f9becdd4c5c52a20c3e9484128b070b1dcfc8944c006f3a528295a359a9c", size = 115319 }, + { url = "https://files.pythonhosted.org/packages/5c/6c/3eaa515142991fe84cfc483ff986492211f1978f90161ccefdbec919d09b/yarl-1.24.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:7bcbe0fcf850eae67b6b01749815a4f7161c560a844c769ad7b48fcd99f791c4", size = 109163 }, + { url = "https://files.pythonhosted.org/packages/bb/64/711dafce66c323a3144d470547a71c5384c57623308ac8bb5e4b903ac148/yarl-1.24.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:24e861e9630e0daddcb9191fb187f60f034e17a4426f8101279f0c475cd74144", size = 115435 }, + { url = "https://files.pythonhosted.org/packages/cf/f3/9b9d0e6d84bea851eb1ba99e4bdc755b86fd813e49ec86dfe42f26befdef/yarl-1.24.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9335a099ad87287c37fe5d1a982ff392fa5efe5d14b40a730b1ec1d6a41382b4", size = 110691 }, + { url = "https://files.pythonhosted.org/packages/86/e4/62a06b7e87c4246ac76b7c2da136f972eb4a3a1fc94abb07e7022d6fdb0a/yarl-1.24.5-cp313-cp313-win_amd64.whl", hash = "sha256:2dbe06fc16bc91502bca713704022182e5729861ae00277c3a23354b40929740", size = 97454 }, + { url = "https://files.pythonhosted.org/packages/9e/c9/5fc8025b318ab10db413b61056bd0d95c557a70e8df4210c7511f866329c/yarl-1.24.5-cp313-cp313-win_arm64.whl", hash = "sha256:6b8536851f9f65e7f00c7a1d49ba7f2be0ffe2c11555367fc9f50d9f842410a1", size = 92813 }, + { url = "https://files.pythonhosted.org/packages/61/02/962c1cbfc401a30c1d034dc67ff395f64b52302c6d62de556c1fca99acc0/yarl-1.24.5-py3-none-any.whl", hash = "sha256:a33700d13d9b7d84fd10947b09ff69fb9a792e519c8cb9764a3ca70baa6c23a7", size = 58612 }, ] [[package]] name = "zensical" version = "0.0.51" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "deepmerge" }, @@ -5757,52 +5762,52 @@ dependencies = [ { name = "pyyaml" }, { name = "tomli" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/f7/d07ffb268ca86afb26b7f32dbabe25dec03d3aa63ba4d876720c84681d33/zensical-0.0.51.tar.gz", hash = "sha256:de25de067bedfa18f916d7f366fd64a7fbf09bfcc615b44d1ddbe3b5fe02ab49", size = 3979640, upload-time = "2026-07-17T18:08:03.445Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/f7/d07ffb268ca86afb26b7f32dbabe25dec03d3aa63ba4d876720c84681d33/zensical-0.0.51.tar.gz", hash = "sha256:de25de067bedfa18f916d7f366fd64a7fbf09bfcc615b44d1ddbe3b5fe02ab49", size = 3979640 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/21/02db3e1fb3904016bfac310037c95b9f1eaaf0ffe7b4a84f14263a7d95df/zensical-0.0.51-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:134d776afa526098e05e34713e2f577c075e57a232e01b97842bb0206716afce", size = 12791154, upload-time = "2026-07-17T18:07:20.748Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/35/b0d96f58253514cb3d08f5779020ab01ee5472334fb984b92e3fc9e9c9ac/zensical-0.0.51-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:e97ab39668ae3b452c550634e921a0336443743aae5e1fe031c7bb57d049e535", size = 12692190, upload-time = "2026-07-17T18:07:24.553Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/90/7a60e126a10c37c6b789938ff17e73fe76bba707fa029cb40ac659aeaa82/zensical-0.0.51-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c9579809f88608e7aa2cff516fff9d267d74a843cf6088a5f4227de2f092bb5", size = 13139337, upload-time = "2026-07-17T18:07:27.885Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/c3/9101c97b90d4713ef2816db03366a45ae4762efebffd296737a2dd2df325/zensical-0.0.51-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:296dc7a14aa28b81a58eb57df2d5c9c9a4b0de7e90c11d99c943354287952925", size = 13069851, upload-time = "2026-07-17T18:07:31.814Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/79/0474df9e15a2c18f6281a786e10177c1b6e16feac1c568e7f36ad39b339c/zensical-0.0.51-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f779d2d87b4bf228cf2e279bc0ae6bcf3b36a9335ff283a317d01f7c15ae46b2", size = 13451083, upload-time = "2026-07-17T18:07:35.543Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/6f/91bbf78f704d5fd4c0c9be27d6bce3b6e4c2c339e4dcd6e7cf19ecda643c/zensical-0.0.51-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f813a1514a90890ca86248a8d54b81b2164bcbff11a6bcf11b01e1c01a1454", size = 13110446, upload-time = "2026-07-17T18:07:38.783Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/89/aa9a95f81771614c37bdc52b8ab21fcdef4c8de7c9cedf34e9bf62674281/zensical-0.0.51-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:186ef37e0eee0e969e2cfae47b1b97775e3164e2cba95c71faa4dd6ef47ed009", size = 13315871, upload-time = "2026-07-17T18:07:42.43Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/08/11/1bf6e9ded29d376f8c12644cc4de04676b010fee8caa17f682606b1f16d5/zensical-0.0.51-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f5d91ce246ed930224603083cef02ae8947132fc7c52901d72015ea03526fa58", size = 13344382, upload-time = "2026-07-17T18:07:46.066Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/ec/663f16ff82d08b212e7c3236a88bd332f73331f94ddac1c91aaf882bbd1e/zensical-0.0.51-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:b1108eae82c6e8ffc33026f60b485c1512647a5333be4f547166b7c8877b98af", size = 13499628, upload-time = "2026-07-17T18:07:49.196Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/b4/7f1b6c3cf06d9f6ff5216523168a5d6ccc693444d5ceeb911eca97b30d98/zensical-0.0.51-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6fa0ecaf14f56841bfc595fa141396350c72aafbec73a016ebe3c824ed21ac72", size = 13451420, upload-time = "2026-07-17T18:07:52.563Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/44/be4bc09ec8f69e7be1b07b875887961c4e0e478b03a10d2cc624ef28fbe6/zensical-0.0.51-cp310-abi3-win32.whl", hash = "sha256:fb7ff4946b72168759c6af0a29cf5de4c38aebe633a83292e8cd4145b5213cc2", size = 12375639, upload-time = "2026-07-17T18:07:56.081Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/85/aa827c244ed4f404e99a91c3ecf5e5adb62eca806a9e9c8e3333bbad8660/zensical-0.0.51-cp310-abi3-win_amd64.whl", hash = "sha256:12529d3d3991b63820952111dc1d1edc29b2c9b3a3abb16c243bcb649631ebf2", size = 12628965, upload-time = "2026-07-17T18:07:59.741Z" }, + { url = "https://files.pythonhosted.org/packages/48/21/02db3e1fb3904016bfac310037c95b9f1eaaf0ffe7b4a84f14263a7d95df/zensical-0.0.51-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:134d776afa526098e05e34713e2f577c075e57a232e01b97842bb0206716afce", size = 12791154 }, + { url = "https://files.pythonhosted.org/packages/a2/35/b0d96f58253514cb3d08f5779020ab01ee5472334fb984b92e3fc9e9c9ac/zensical-0.0.51-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:e97ab39668ae3b452c550634e921a0336443743aae5e1fe031c7bb57d049e535", size = 12692190 }, + { url = "https://files.pythonhosted.org/packages/2e/90/7a60e126a10c37c6b789938ff17e73fe76bba707fa029cb40ac659aeaa82/zensical-0.0.51-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c9579809f88608e7aa2cff516fff9d267d74a843cf6088a5f4227de2f092bb5", size = 13139337 }, + { url = "https://files.pythonhosted.org/packages/ae/c3/9101c97b90d4713ef2816db03366a45ae4762efebffd296737a2dd2df325/zensical-0.0.51-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:296dc7a14aa28b81a58eb57df2d5c9c9a4b0de7e90c11d99c943354287952925", size = 13069851 }, + { url = "https://files.pythonhosted.org/packages/d2/79/0474df9e15a2c18f6281a786e10177c1b6e16feac1c568e7f36ad39b339c/zensical-0.0.51-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f779d2d87b4bf228cf2e279bc0ae6bcf3b36a9335ff283a317d01f7c15ae46b2", size = 13451083 }, + { url = "https://files.pythonhosted.org/packages/fe/6f/91bbf78f704d5fd4c0c9be27d6bce3b6e4c2c339e4dcd6e7cf19ecda643c/zensical-0.0.51-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f813a1514a90890ca86248a8d54b81b2164bcbff11a6bcf11b01e1c01a1454", size = 13110446 }, + { url = "https://files.pythonhosted.org/packages/d9/89/aa9a95f81771614c37bdc52b8ab21fcdef4c8de7c9cedf34e9bf62674281/zensical-0.0.51-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:186ef37e0eee0e969e2cfae47b1b97775e3164e2cba95c71faa4dd6ef47ed009", size = 13315871 }, + { url = "https://files.pythonhosted.org/packages/08/11/1bf6e9ded29d376f8c12644cc4de04676b010fee8caa17f682606b1f16d5/zensical-0.0.51-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f5d91ce246ed930224603083cef02ae8947132fc7c52901d72015ea03526fa58", size = 13344382 }, + { url = "https://files.pythonhosted.org/packages/d6/ec/663f16ff82d08b212e7c3236a88bd332f73331f94ddac1c91aaf882bbd1e/zensical-0.0.51-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:b1108eae82c6e8ffc33026f60b485c1512647a5333be4f547166b7c8877b98af", size = 13499628 }, + { url = "https://files.pythonhosted.org/packages/60/b4/7f1b6c3cf06d9f6ff5216523168a5d6ccc693444d5ceeb911eca97b30d98/zensical-0.0.51-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6fa0ecaf14f56841bfc595fa141396350c72aafbec73a016ebe3c824ed21ac72", size = 13451420 }, + { url = "https://files.pythonhosted.org/packages/0a/44/be4bc09ec8f69e7be1b07b875887961c4e0e478b03a10d2cc624ef28fbe6/zensical-0.0.51-cp310-abi3-win32.whl", hash = "sha256:fb7ff4946b72168759c6af0a29cf5de4c38aebe633a83292e8cd4145b5213cc2", size = 12375639 }, + { url = "https://files.pythonhosted.org/packages/1f/85/aa827c244ed4f404e99a91c3ecf5e5adb62eca806a9e9c8e3333bbad8660/zensical-0.0.51-cp310-abi3-win_amd64.whl", hash = "sha256:12529d3d3991b63820952111dc1d1edc29b2c9b3a3abb16c243bcb649631ebf2", size = 12628965 }, ] [[package]] name = "zipp" version = "4.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602", size = 26214, upload-time = "2026-05-18T20:08:57.967Z" } +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602", size = 26214 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", size = 10238, upload-time = "2026-05-18T20:08:57.045Z" }, + { url = "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", size = 10238 }, ] [[package]] name = "zstandard" version = "0.25.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/35/0b/8df9c4ad06af91d39e94fa96cc010a24ac4ef1378d3efab9223cc8593d40/zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94", size = 795735, upload-time = "2025-09-14T22:17:26.042Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/06/9ae96a3e5dcfd119377ba33d4c42a7d89da1efabd5cb3e366b156c45ff4d/zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1", size = 640440, upload-time = "2025-09-14T22:17:27.366Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/14/933d27204c2bd404229c69f445862454dcc101cd69ef8c6068f15aaec12c/zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f", size = 5343070, upload-time = "2025-09-14T22:17:28.896Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/db/ddb11011826ed7db9d0e485d13df79b58586bfdec56e5c84a928a9a78c1c/zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea", size = 5063001, upload-time = "2025-09-14T22:17:31.044Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/00/87466ea3f99599d02a5238498b87bf84a6348290c19571051839ca943777/zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e", size = 5394120, upload-time = "2025-09-14T22:17:32.711Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/95/fc5531d9c618a679a20ff6c29e2b3ef1d1f4ad66c5e161ae6ff847d102a9/zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551", size = 5451230, upload-time = "2025-09-14T22:17:34.41Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/4b/e3678b4e776db00f9f7b2fe58e547e8928ef32727d7a1ff01dea010f3f13/zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a", size = 5547173, upload-time = "2025-09-14T22:17:36.084Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/d5/ba05ed95c6b8ec30bd468dfeab20589f2cf709b5c940483e31d991f2ca58/zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611", size = 5046736, upload-time = "2025-09-14T22:17:37.891Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/d5/870aa06b3a76c73eced65c044b92286a3c4e00554005ff51962deef28e28/zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3", size = 5576368, upload-time = "2025-09-14T22:17:40.206Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/35/398dc2ffc89d304d59bc12f0fdd931b4ce455bddf7038a0a67733a25f550/zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b", size = 4954022, upload-time = "2025-09-14T22:17:41.879Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/5c/36ba1e5507d56d2213202ec2b05e8541734af5f2ce378c5d1ceaf4d88dc4/zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851", size = 5267889, upload-time = "2025-09-14T22:17:43.577Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/70/e8/2ec6b6fb7358b2ec0113ae202647ca7c0e9d15b61c005ae5225ad0995df5/zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250", size = 5433952, upload-time = "2025-09-14T22:17:45.271Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/01/b5f4d4dbc59ef193e870495c6f1275f5b2928e01ff5a81fecb22a06e22fb/zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98", size = 5814054, upload-time = "2025-09-14T22:17:47.08Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/e5/fbd822d5c6f427cf158316d012c5a12f233473c2f9c5fe5ab1ae5d21f3d8/zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf", size = 5360113, upload-time = "2025-09-14T22:17:48.893Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8e/e0/69a553d2047f9a2c7347caa225bb3a63b6d7704ad74610cb7823baa08ed7/zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09", size = 436936, upload-time = "2025-09-14T22:17:52.658Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/82/b9c06c870f3bd8767c201f1edbdf9e8dc34be5b0fbc5682c4f80fe948475/zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5", size = 506232, upload-time = "2025-09-14T22:17:50.402Z" }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/57/60c3c01243bb81d381c9916e2a6d9e149ab8627c0c7d7abb2d73384b3c0c/zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049", size = 462671, upload-time = "2025-09-14T22:17:51.533Z" }, +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/0b/8df9c4ad06af91d39e94fa96cc010a24ac4ef1378d3efab9223cc8593d40/zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94", size = 795735 }, + { url = "https://files.pythonhosted.org/packages/3f/06/9ae96a3e5dcfd119377ba33d4c42a7d89da1efabd5cb3e366b156c45ff4d/zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1", size = 640440 }, + { url = "https://files.pythonhosted.org/packages/d9/14/933d27204c2bd404229c69f445862454dcc101cd69ef8c6068f15aaec12c/zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f", size = 5343070 }, + { url = "https://files.pythonhosted.org/packages/6d/db/ddb11011826ed7db9d0e485d13df79b58586bfdec56e5c84a928a9a78c1c/zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea", size = 5063001 }, + { url = "https://files.pythonhosted.org/packages/db/00/87466ea3f99599d02a5238498b87bf84a6348290c19571051839ca943777/zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e", size = 5394120 }, + { url = "https://files.pythonhosted.org/packages/2b/95/fc5531d9c618a679a20ff6c29e2b3ef1d1f4ad66c5e161ae6ff847d102a9/zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551", size = 5451230 }, + { url = "https://files.pythonhosted.org/packages/63/4b/e3678b4e776db00f9f7b2fe58e547e8928ef32727d7a1ff01dea010f3f13/zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a", size = 5547173 }, + { url = "https://files.pythonhosted.org/packages/4e/d5/ba05ed95c6b8ec30bd468dfeab20589f2cf709b5c940483e31d991f2ca58/zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611", size = 5046736 }, + { url = "https://files.pythonhosted.org/packages/50/d5/870aa06b3a76c73eced65c044b92286a3c4e00554005ff51962deef28e28/zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3", size = 5576368 }, + { url = "https://files.pythonhosted.org/packages/5d/35/398dc2ffc89d304d59bc12f0fdd931b4ce455bddf7038a0a67733a25f550/zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b", size = 4954022 }, + { url = "https://files.pythonhosted.org/packages/9a/5c/36ba1e5507d56d2213202ec2b05e8541734af5f2ce378c5d1ceaf4d88dc4/zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851", size = 5267889 }, + { url = "https://files.pythonhosted.org/packages/70/e8/2ec6b6fb7358b2ec0113ae202647ca7c0e9d15b61c005ae5225ad0995df5/zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250", size = 5433952 }, + { url = "https://files.pythonhosted.org/packages/7b/01/b5f4d4dbc59ef193e870495c6f1275f5b2928e01ff5a81fecb22a06e22fb/zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98", size = 5814054 }, + { url = "https://files.pythonhosted.org/packages/b2/e5/fbd822d5c6f427cf158316d012c5a12f233473c2f9c5fe5ab1ae5d21f3d8/zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf", size = 5360113 }, + { url = "https://files.pythonhosted.org/packages/8e/e0/69a553d2047f9a2c7347caa225bb3a63b6d7704ad74610cb7823baa08ed7/zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09", size = 436936 }, + { url = "https://files.pythonhosted.org/packages/d9/82/b9c06c870f3bd8767c201f1edbdf9e8dc34be5b0fbc5682c4f80fe948475/zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5", size = 506232 }, + { url = "https://files.pythonhosted.org/packages/d4/57/60c3c01243bb81d381c9916e2a6d9e149ab8627c0c7d7abb2d73384b3c0c/zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049", size = 462671 }, ] diff --git a/agentpool.spec b/wolfharness.spec similarity index 86% rename from agentpool.spec rename to wolfharness.spec index 2aa5a14f6..576e8ee2a 100644 --- a/agentpool.spec +++ b/wolfharness.spec @@ -6,7 +6,7 @@ from PyInstaller.utils.hooks import collect_data_files, copy_metadata datas = [] # Collect package metadata for packages that use importlib.metadata metadata_packages = [ - "agentpool", + "wolfharness", "llmling-models", "pydantic-ai-slim", "genai_prices", @@ -44,19 +44,19 @@ with contextlib.suppress(Exception): a = Analysis( # noqa: F821 # pyright: ignore[reportUndefinedVariable] # ty:ignore[unresolved-reference] - ["src/agentpool/__main__.py"], + ["src/wolfharness/__main__.py"], pathex=[], binaries=[], datas=datas, hiddenimports=[ - "agentpool", - "agentpool_cli", - "agentpool_config", - "agentpool_commands", - "agentpool_storage", - "agentpool_prompts", - "agentpool_server", - "agentpool_toolsets", + "wolfharness", + "wolfharness_cli", + "wolfharness_config", + "wolfharness_commands", + "wolfharness_storage", + "wolfharness_prompts", + "wolfharness_server", + "wolfharness_toolsets", "acp", "acp.bridge", ], @@ -75,7 +75,7 @@ exe = EXE( # noqa: F821 # pyright: ignore[reportUndefinedVariable] # ty:ignor a.binaries, a.datas, [], - name="agentpool", + name="wolfharness", debug=False, bootloader_ignore_signals=False, strip=False,