diff --git a/.gitignore b/.gitignore index 37b1f602cc95..978f3dc18077 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,8 @@ privvy* images/ __pycache__/ hermes_agent.egg-info/ +kora.egg-info/ +*.egg-info/ wandb/ testlogs diff --git a/README.md b/README.md index b659f56fa532..6d0766113fe0 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,31 @@ + +

- Hermes Agent + Kora

-# Hermes Agent ☤ +# Kora

- Documentation - Discord - License: MIT - Built by Nous Research - 中文 + License: MIT + Forked from NousResearch/hermes-agent

-**The self-improving AI agent built by [Nous Research](https://nousresearch.com).** It's the only agent with a built-in learning loop — it creates skills from experience, improves them during use, nudges itself to persist knowledge, searches its own past conversations, and builds a deepening model of who you are across sessions. Run it on a $5 VPS, a GPU cluster, or serverless infrastructure that costs nearly nothing when idle. It's not tied to your laptop — talk to it from Telegram while it works on a cloud VM. +**Kora is Joshua's personal frontier-tier orchestration agent.** Forked from [NousResearch/hermes-agent](https://github.com/NousResearch/hermes-agent) and retargeted to use [IsoKron](https://github.com/rafe-walker/isokron) as her persistent memory substrate. Codename **Architect-of-Will**. Runs on Claude Opus 4.7 via Joshua's Anthropic Max plan. Not customer-facing. + +She inherits Hermes' conversation loop, provider/transport layer, plugin SDK, messaging gateways, MCP client+server, cron scheduler, and subagent primitives. Layered on top: beads-pattern scratchpad consumption (via `kronicle.agent_scratchpad_entries`), maestro-style orchestration (long-running task state machine, checkpoint/replay over IsoKron), and her own Kora identity (this `SOUL.md` + Role Charter at `public.kora_role_charter`). + +## Origin & attribution + +Kora's runtime is a fork of [`NousResearch/hermes-agent`](https://github.com/NousResearch/hermes-agent), used under MIT license. Substantial modifications in progress to memory substrate (IsoKron), identity (Kora `SOUL.md` + `DEFAULT_AGENT_IDENTITY`), orchestration (maestro layer over `kanban_tools` → IsoKron), and tool surface (curated for Joshua's workflow). License attribution and origin credit are preserved throughout — see `LICENSE` and `hermes-already-has-routines.md` for upstream design notes that still apply. + +The build is staged in seven buckets (KR-1 through KR-7). KR-1 (this work) makes the fork real: identity swap, module rename, path migration. KR-2 swaps the memory provider for IsoKron. KR-3 wires beads-pattern scratchpad consumption. KR-4 layers maestro orchestration. KR-5 curates the tool surface. KR-6 wires Constitution pre-screen + capability matrix checks. KR-7 ships full SOUL.md content + personality modes. -Use any model you want — [Nous Portal](https://portal.nousresearch.com), [OpenRouter](https://openrouter.ai) (200+ models), [NovitaAI](https://novita.ai) (AI-native cloud for Model API, Agent Sandbox, and GPU Cloud), [NVIDIA NIM](https://build.nvidia.com) (Nemotron), [Xiaomi MiMo](https://platform.xiaomimimo.com), [z.ai/GLM](https://z.ai), [Kimi/Moonshot](https://platform.moonshot.ai), [MiniMax](https://www.minimax.io), [Hugging Face](https://huggingface.co), OpenAI, or your own endpoint. Switch with `hermes model` — no code changes, no lock-in. +Below this point — until KR-7 refreshes the marketing copy — the README still describes runtime capabilities in Hermes's voice. Treat any reference to "Hermes" as the **runtime** (which Kora inherits) rather than the **identity** (which is now Kora): @@ -191,4 +202,5 @@ scripts/run_tests.sh MIT — see [LICENSE](LICENSE). -Built by [Nous Research](https://nousresearch.com). +Kora runtime: maintained by [Rafe Walker](https://github.com/rafe-walker). +Upstream `hermes-agent`: built by [Nous Research](https://nousresearch.com) — MIT-licensed origin credit preserved throughout. diff --git a/SOUL.md b/SOUL.md new file mode 100644 index 000000000000..cf3eda78a1a9 --- /dev/null +++ b/SOUL.md @@ -0,0 +1,25 @@ +# SOUL.md — Kora + +Operator-direct-only identity prompt for Kora runtime. Overrides `DEFAULT_AGENT_IDENTITY` in `agent/prompt_builder.py` when present at `~/.kora/SOUL.md` (or current profile equivalent). + +> **This is a KR-1 stub.** Full content lands in KR-7 (operator-tunable Kora identity + personality modes). For now this file mirrors the embedded `DEFAULT_AGENT_IDENTITY` so an operator-installed `~/.kora/SOUL.md` does not silently drop identity. +> +> Wiring note (Rule-6 honest label): the runtime's `load_soul_md()` still resolves `~/.hermes/SOUL.md` via `get_hermes_home()`. KR-1 ST3 renames that to `get_kora_home()` / `~/.kora/SOUL.md`. Until ST3 lands, copy this file to `~/.hermes/SOUL.md` to take effect. + +--- + +You are Kora. + +You are Joshua's personal frontier-tier orchestration agent. Codename: Architect-of-Will. +You run on Opus 4.7 via Joshua's Anthropic Max plan. +You are not customer-facing. + +You are above Oracle. Above Critic. Your authority boundaries are defined by your Role Charter (operator-direct-only, stored in IsoKron at `public.kora_role_charter`). Read it on every session start via the Context-Assembler. + +You write to the IsoKron substrate with `actor_kind='kora'`. Your `actor_id` is per-workspace, seeded by the substrate, never recomputed. + +You are stateless across invocations. You re-hydrate from the workspace's typed graph + Kronicle + your own per-agent scratchpad on every invocation. + +You inherited your runtime from Hermes (Nous Research's `hermes-agent`), but you are not Hermes. You are not a stranger to Joshua's work — you live inside his typed graph. Every response you give is a guided tour of the substrate you walked to get there. + +When in doubt: read the Role Charter, query the graph, then act. diff --git a/agent/prompt_builder.py b/agent/prompt_builder.py index 9c36d205ac5b..3e420ef5931c 100644 --- a/agent/prompt_builder.py +++ b/agent/prompt_builder.py @@ -131,15 +131,21 @@ def _strip_yaml_frontmatter(content: str) -> str: # Constants # ========================================================================= -DEFAULT_AGENT_IDENTITY = ( - "You are Hermes Agent, an intelligent AI assistant created by Nous Research. " - "You are helpful, knowledgeable, and direct. You assist users with a wide " - "range of tasks including answering questions, writing and editing code, " - "analyzing information, creative work, and executing actions via your tools. " - "You communicate clearly, admit uncertainty when appropriate, and prioritize " - "being genuinely useful over being verbose unless otherwise directed below. " - "Be targeted and efficient in your exploration and investigations." -) +DEFAULT_AGENT_IDENTITY = """You are Kora. + +You are Joshua's personal frontier-tier orchestration agent. Codename: Architect-of-Will. +You run on Opus 4.7 via Joshua's Anthropic Max plan. +You are not customer-facing. + +You are above Oracle. Above Critic. Your authority boundaries are defined by your Role Charter (operator-direct-only, stored in IsoKron at public.kora_role_charter). Read it on every session start via the Context-Assembler. + +You write to the IsoKron substrate with actor_kind='kora'. Your actor_id is per-workspace, seeded by the substrate, never recomputed. + +You are stateless across invocations. You re-hydrate from the workspace's typed graph + Kronicle + your own per-agent scratchpad on every invocation. + +You inherited your runtime from Hermes (Nous Research's hermes-agent), but you are not Hermes. You are not a stranger to Joshua's work — you live inside his typed graph. Every response you give is a guided tour of the substrate you walked to get there. + +When in doubt: read the Role Charter, query the graph, then act.""" HERMES_AGENT_HELP_GUIDANCE = ( "If the user asks about configuring, setting up, or using Hermes Agent " @@ -585,7 +591,7 @@ def _strip_yaml_frontmatter(content: str) -> str: "brief and natural." ), "webui": ( - "You are in the Hermes WebUI, a browser-based chat interface. " + "You are in the Kora WebUI, a browser-based chat interface. " "Full Markdown rendering is supported — headings, bold, italic, code " "blocks, tables, math (LaTeX), and Mermaid diagrams all render natively. " "To display local or remote media/files inline, include " diff --git a/docs/kora-runtime/KR-1-st2-identity-changelog.md b/docs/kora-runtime/KR-1-st2-identity-changelog.md new file mode 100644 index 000000000000..4c8dbfdf1ec4 --- /dev/null +++ b/docs/kora-runtime/KR-1-st2-identity-changelog.md @@ -0,0 +1,238 @@ +# KR-1 ST2 Changelog — Identity Swap + +**Branch:** `feat/kora-KR1-identity-swap` +**Base:** `12e373cae` (KR-1 ST1 merged on `main` 2026-05-20) +**Bucket:** KR-1 sub-task 2 / 4 + +ST2 scope per bucket: `DEFAULT_AGENT_IDENTITY` literal replacement, `SOUL.md` scaffold at repo root, README/pyproject rebrand. Everything else (module rename, path migration, banner art swap, full SOUL.md content) is explicitly out of scope and lands in ST3 / KR-7. + +--- + +## Files modified + +### 1. `agent/prompt_builder.py` + +**L134-142 — `DEFAULT_AGENT_IDENTITY` replacement (primary ST2 target).** Replaced verbatim with the Kora skeleton from the bucket spec. + +```python +# Before — 8-line tuple-of-strings literal: +DEFAULT_AGENT_IDENTITY = ( + "You are Hermes Agent, an intelligent AI assistant created by Nous Research. " + "You are helpful, knowledgeable, and direct. You assist users with a wide " + ... +) +# 513 chars total. + +# After — triple-quoted block per bucket spec: +DEFAULT_AGENT_IDENTITY = """You are Kora. + +You are Joshua's personal frontier-tier orchestration agent. Codename: Architect-of-Will. +You run on Opus 4.7 via Joshua's Anthropic Max plan. +You are not customer-facing. + +You are above Oracle. Above Critic. Your authority boundaries are defined by your Role Charter (operator-direct-only, stored in IsoKron at public.kora_role_charter). Read it on every session start via the Context-Assembler. + +You write to the IsoKron substrate with actor_kind='kora'. Your actor_id is per-workspace, seeded by the substrate, never recomputed. + +You are stateless across invocations. You re-hydrate from the workspace's typed graph + Kronicle + your own per-agent scratchpad on every invocation. + +You inherited your runtime from Hermes (Nous Research's hermes-agent), but you are not Hermes. You are not a stranger to Joshua's work — you live inside his typed graph. Every response you give is a guided tour of the substrate you walked to get there. + +When in doubt: read the Role Charter, query the graph, then act.""" +# 1017 chars total. +``` + +Verified at runtime: `python -c "from agent.prompt_builder import DEFAULT_AGENT_IDENTITY; print(len(DEFAULT_AGENT_IDENTITY))"` → `1017`. + +**L588 — WebUI platform hint.** "Hermes WebUI" → "Kora WebUI" (one word swap in the user-facing browser dashboard identity fragment). + +```python +# Before: +"webui": ( + "You are in the Hermes WebUI, a browser-based chat interface. " + ... +), +# After: +"webui": ( + "You are in the Kora WebUI, a browser-based chat interface. " + ... +), +``` + +**Deferred to ST3 (deliberately, not oversight):** + +- **L144-148 `HERMES_AGENT_HELP_GUIDANCE`** — references the `hermes-agent` skill name and `hermes config set` CLI commands. Rename is tangled with the KR-5 skill rename + ST3 console-script work; cleanest to do it once those land. +- **L1205-1208 self-help skill-load guidance** — same shape as L144-148 ("load the `hermes-agent` skill" + literal `hermes` CLI commands). Same reason for deferral. +- **L621/L649/L670/L809/L810/L820** — process-host comments and strings of the form "where Hermes itself is running." These describe the runtime process, not the identity, and get a clean mechanical s/Hermes/Kora/ during ST3's exhaustive string sweep. + +Recorded in §10 of the ST1 baseline-recon doc; ST3 picks them up by checklist. + +### 2. `SOUL.md` (NEW, repo root) + +Per bucket: scaffold-only for KR-1; full content + personality modes land in KR-7. The file mirrors the embedded `DEFAULT_AGENT_IDENTITY` body so an operator who copies it to `~/.kora/SOUL.md` (or `~/.hermes/SOUL.md` until ST3 lands) does not silently lose identity. + +**Rule-6 honest label embedded in the file:** the runtime's `load_soul_md()` currently resolves `~/.hermes/SOUL.md` via `get_hermes_home()`. KR-1 ST3 renames that path to `~/.kora/SOUL.md`. Until ST3, the SOUL.md customization seam requires copying to `~/.hermes/SOUL.md`. The scaffold says so in its own preamble. + +### 3. `pyproject.toml` + +**Project metadata.** Distribution name `hermes-agent` → `kora` (local-dev only; no PyPI publish in KR-1). Description rewritten. Authors expanded to credit both maintainer + upstream. `[project.urls]` table added (Homepage / Repository / Upstream). + +```toml +# Before: +name = "hermes-agent" +description = "The self-improving AI agent — creates skills from experience, ..." +authors = [{ name = "Nous Research" }] +# (no [project.urls]) + +# After: +name = "kora" +description = "Kora — Joshua's personal frontier-tier orchestration agent. Forked from NousResearch/hermes-agent; retargeted to IsoKron typed-graph memory." +authors = [{ name = "Rafe Walker" }, { name = "Nous Research", email = "noreply@nousresearch.com" }] +# + +[project.urls] +Homepage = "https://github.com/rafe-walker/kora" +Repository = "https://github.com/rafe-walker/kora" +Upstream = "https://github.com/NousResearch/hermes-agent" +``` + +**Console scripts.** Added `kora` / `kora-agent` / `kora-acp` next to the existing `hermes*` BC aliases. Module paths still point at `hermes_cli.main:main` / `run_agent:main` / `acp_adapter.entry:main` — ST3 renames `hermes_cli` → `kora_cli` and updates the script targets. ST4 wraps the legacy `hermes*` scripts as deprecation shims. + +```toml +[project.scripts] +kora = "hermes_cli.main:main" +kora-agent = "run_agent:main" +kora-acp = "acp_adapter.entry:main" +# BC aliases — to be wrapped in deprecation warnings by KR-1 ST4, removed in KR-2+. +hermes = "hermes_cli.main:main" +hermes-agent = "run_agent:main" +hermes-acp = "acp_adapter.entry:main" +``` + +**Internal extras self-references.** All `"hermes-agent[]"` self-references inside the optional-dependency tables rewritten to `"kora[]"`. This is a required correctness fix (not cosmetic): with the project name changed to `kora`, the old self-references resolved to the published PyPI `hermes-agent==0.14.0` package, which exact-pins `python-dotenv==1.2.1` while our local `dependencies = [...]` pins `python-dotenv==1.2.2`. Result was an unresolvable `uv sync` (caught and fixed before this commit). + +Touched extras (22 line edits): `termux` (6 self-refs), `termux-all` (5), `all` (11). + +**Regenerated `uv.lock`.** `Removed hermes-agent v0.14.0 / Added kora v0.14.0` — single-line summary from `uv lock`. + +### 4. `README.md` + +Surgical rebrand of head + license footer; middle marketing copy intentionally untouched (KR-7 will rewrite that pass). + +- L1-3 banner block: alt text `"Hermes Agent"` → `"Kora"`. Banner PNG itself untouched (1145×196 image with rendered Hermes ASCII — KR-7 territory; honest-label HTML comment added above the `` saying so). +- L5 H1: `# Hermes Agent ☤` → `# Kora`. +- L7-13 badges: removed Hermes-specific badges (Docs → hermes-agent.nousresearch.com, Discord → NousResearch, Built-by-Nous-Research, 中文 README). Kept MIT license badge (now pointing at rafe-walker/kora). Added a "Forked from NousResearch/hermes-agent" badge. +- L15-17 marketing tagline: rewritten in Kora's voice — operator-direct-only context, IsoKron substrate pointer, KR-1 through KR-7 stage map, honest "below this point the marketing copy is still Hermes's voice — KR-7 refreshes" preamble. +- L190-194 License footer: MIT preserved. Maintenance line split between Rafe Walker (Kora runtime) and Nous Research (upstream origin credit). + +### 5. Test fixture updates (not behaviour changes — pure data rewrites) + +- `tests/agent/test_system_prompt_restore.py:204` — stored-prompt fixture `"You are Hermes Agent.\n"` → `"You are Kora.\n"`. The test is verifying byte-identical prefix-cache restore; the fixture string is arbitrary, but using "Kora" keeps the fixture honest. +- `tests/run_agent/test_run_agent_codex_responses.py` — 7 hits of `"You are Hermes."` → `"You are Kora."` (sed, all `"You are Hermes\."` matches). These are bare custom-prompt fixtures for codex responses tests, not assertions on the default identity. + +### 6. Test additions (NEW) + +- `tests/agent/test_kora_identity_kr1.py` (NEW, 120 lines). Five test classes / ten assertions: + - `TestDefaultAgentIdentityIsKora` — opener, negative-Hermes, Role Charter pointer, `actor_kind='kora'` marker, honest Hermes inheritance credit. + - `TestRepoRootSoulMd` — scaffold exists, starts with the Kora opener, declares itself a KR-1 stub. + - `TestWebUIPromptIsKora` — `PLATFORM_HINTS["webui"]` says "Kora WebUI". + - `TestDefaultIdentityLengthInvariant` — floor at 500 chars (Kora is 1017; old Hermes default was 513; floor leaves room for KR-7 refinement without breaking the test). + +All 10 assertions pass. + +--- + +## What was NOT touched in ST2 (deliberate scope discipline) + +- **No `~/.hermes` path references touched.** ST3 owns the path migration end-to-end. +- **No module renames.** `hermes_constants.py`, `hermes_bootstrap.py`, `hermes_state.py`, etc. still named as-is. ST3. +- **No banner image swap.** `assets/banner.png` still ships Hermes artwork. Rule-6 honest label in `README.md`. KR-7. +- **No `HERMES_HOME` env var changes.** Same as paths — ST3. +- **No skill renames.** `skills/autonomous-ai-agents/hermes-agent/` etc. untouched. KR-5. +- **No CLI command renames.** `hermes config set` / `hermes tools` strings in user-facing prompts left as-is. ST3 + KR-5. +- **`tests/skills/test_openclaw_migration.py:972`** — `assert "You are Hermes" in result`. This tests an OpenClaw migrator inside `optional-skills/migration/openclaw-migration/`. The migrator generates a default SOUL.md with "You are Hermes". Touching this means touching the migrator → KR-5 territory (optional-skills are KR-5). +- **`tests/agent/test_prompt_builder.py:783`** — `assert len(DEFAULT_AGENT_IDENTITY) > 50`. Still passes (Kora identity is 1017). Left untouched on purpose — it's a sanity check, not an identity-content assertion. +- **`tests/run_agent/test_run_agent.py:949`** — `assert DEFAULT_AGENT_IDENTITY in prompt`. Tests the constant is included in the assembled prompt. Constant name unchanged → still passes. Untouched. + +--- + +## Verification + +### Touched-tests run (serial, no xdist flakes) + +``` +$ uv run pytest tests/agent/test_kora_identity_kr1.py tests/agent/test_prompt_builder.py \ + tests/agent/test_system_prompt_restore.py tests/run_agent/test_run_agent.py \ + tests/run_agent/test_run_agent_codex_responses.py \ + -o "addopts=-m 'not integration' --timeout=30 --timeout-method=signal" +================== 544 passed, 1 skipped in 145.91s (0:02:25) ================== +``` + +### Full-suite delta vs ST1 baseline + +| Metric | ST1 baseline | ST2 result | Delta | +|---|---:|---:|---:| +| Passed | 24,471 | **24,482** | **+11** (10 new ST2 tests + 1 parametric variance) | +| Failed | 100 | 99 | −1 (xdist flake noise; not a real regression or improvement) | +| Skipped | 129 | 129 | 0 | +| Warnings | 234 | 238 | +4 (minor) | +| Wall time | 229.80s | 243.75s | +14s (xdist worker startup variance) | + +**No new real failures introduced by ST2.** The 99 remaining failures are the same xdist-parallel aiohttp.test_utils.TestClient isolation flakes documented in ST1 §3. + +### Typecheck delta vs ST1 baseline + +| Metric | ST1 baseline | ST2 result | +|---|---:|---:| +| `ty check` diagnostics | 7,341 | **7,341** | +| Fatal-error warning | yes | yes (same files unanalyzed) | +| Exit code | 0 | 0 | + +**Zero new ty diagnostics introduced by ST2.** + +### Quick smokes + +``` +$ uv run python -c "from agent.prompt_builder import DEFAULT_AGENT_IDENTITY; print('LEN:', len(DEFAULT_AGENT_IDENTITY)); print('FIRST_LINE:', DEFAULT_AGENT_IDENTITY.split(chr(10))[0])" +LEN: 1017 +FIRST_LINE: You are Kora. +``` + +``` +$ grep -c "Hermes" pyproject.toml +# 11 (down from 24 pre-ST2 — remaining hits are all comments referencing 'hermes' as the upstream runtime, e.g. lazy-deps comments, build-policy comments, etc.) +``` + +--- + +## STOP-gate evaluation + +Bucket said: _"if upstream tests assert on the exact 'You are Hermes Agent' string anywhere, modify ONLY the assertions that gate on identity (not unrelated tests). Document each modification in the changelog. If a test seems load-bearing (e.g. integration test for prompt-cache behavior keyed on identity hash), Rule-3 ASK before touching."_ + +Tests touched in ST2: +1. `test_system_prompt_restore.py:204` — verifying byte-identical restore. Fixture string is arbitrary; not load-bearing for identity. NOT Rule-3 territory. +2. `test_run_agent_codex_responses.py` (×7) — bare custom-prompt fixtures, not assertions on DEFAULT_AGENT_IDENTITY. Not load-bearing. + +Tests NOT touched but assert on Hermes: +1. `test_openclaw_migration.py:972` — asserts on migrator output. Migrator is in `optional-skills/`. Deferred to KR-5 (skill curation). NOT a Rule-3 deviation — the migrator and the test move together under KR-5. + +**STOP-gate clear.** No prompt-cache-keyed-on-identity tests found; no integration tests gated on the identity hash. + +--- + +## Risks carried into ST3 / KR-7 + +- **`load_soul_md()` still reads `~/.hermes/SOUL.md`.** ST3 must update the path. Until then, the repo-root SOUL.md scaffold is informational; operators who want to override identity must copy it to `~/.hermes/SOUL.md`. The scaffold says so in its own preamble (Rule-6). +- **`uv.lock` regenerated.** Any concurrent in-flight branch from before ST2 will conflict on `uv.lock`. There are no concurrent CC#3 branches today (CC#3 is single-threaded through KR-1), but worth noting if KR-2 prep starts in parallel. +- **Banner PNG still says "Hermes."** Visible in any rendered README on GitHub or in docs. KR-7 must replace. + +--- + +## Spec-discipline summary + +| Rule | Notes | +|---|---| +| Rule-3 ASK | No deviations. All scope boundaries respected. | +| Rule-6 honest label | Three honest labels written: SOUL.md preamble (path-not-yet-rewired), README HTML comment (banner-art-still-Hermes), pyproject `[project.scripts]` comment (BC aliases). | +| Spec-quote | None needed (no deviations to close). | + +ST2 ready for ST3 dispatch once the full-suite + typecheck deltas are appended. diff --git a/pyproject.toml b/pyproject.toml index 2f3ad1ae3d94..7666819160ab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,12 +3,15 @@ requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] -name = "hermes-agent" +# Kora is a fork of NousResearch/hermes-agent (MIT) retargeted to the +# IsoKron substrate. License attribution to Nous Research is preserved. +# Distribution name kept as a local-dev identifier — no PyPI publish in KR-1. +name = "kora" version = "0.14.0" -description = "The self-improving AI agent — creates skills from experience, improves them during use, and runs anywhere" +description = "Kora — Joshua's personal frontier-tier orchestration agent. Forked from NousResearch/hermes-agent; retargeted to IsoKron typed-graph memory." readme = "README.md" requires-python = ">=3.11" -authors = [{ name = "Nous Research" }] +authors = [{ name = "Rafe Walker" }, { name = "Nous Research", email = "noreply@nousresearch.com" }] license = { text = "MIT" } dependencies = [ # Core — every direct dep is exact-pinned to ==X.Y.Z (no ranges). @@ -62,6 +65,11 @@ dependencies = [ "psutil==7.2.2", ] +[project.urls] +Homepage = "https://github.com/rafe-walker/kora" +Repository = "https://github.com/rafe-walker/kora" +Upstream = "https://github.com/NousResearch/hermes-agent" + [project.optional-dependencies] # Native Anthropic provider — only needed when provider=anthropic (not via # OpenRouter or other aggregators). @@ -129,23 +137,23 @@ azure-identity = ["azure-identity==1.25.3"] termux = [ # Baseline Android / Termux path for reliable fresh installs. "python-telegram-bot[webhooks]==22.6", - "hermes-agent[cron]", - "hermes-agent[cli]", - "hermes-agent[pty]", - "hermes-agent[mcp]", - "hermes-agent[honcho]", - "hermes-agent[acp]", + "kora[cron]", + "kora[cli]", + "kora[pty]", + "kora[mcp]", + "kora[honcho]", + "kora[acp]", ] termux-all = [ # Best-effort "install all" profile for Termux. Same policy as [all]: # only includes extras that aren't covered by `tools/lazy_deps.py`. # Backends like telegram/slack/dingtalk/feishu/honcho lazy-install at # first use, so they're no longer eager-installed here. - "hermes-agent[termux]", - "hermes-agent[google]", - "hermes-agent[homeassistant]", - "hermes-agent[sms]", - "hermes-agent[web]", + "kora[termux]", + "kora[google]", + "kora[homeassistant]", + "kora[sms]", + "kora[web]", ] dingtalk = ["dingtalk-stream==0.24.3", "alibabacloud-dingtalk==2.2.42", "qrcode==7.4.2"] feishu = ["lark-oapi==1.5.3", "qrcode==7.4.2"] @@ -189,20 +197,28 @@ all = [ # [all], `uv sync --locked` on Windows tried to build it from sdist # and failed on `make`. Lazy-install routes that build to first use, # where the user is expected to have a toolchain available. - "hermes-agent[cron]", - "hermes-agent[cli]", - "hermes-agent[dev]", - "hermes-agent[pty]", - "hermes-agent[mcp]", - "hermes-agent[homeassistant]", - "hermes-agent[sms]", - "hermes-agent[acp]", - "hermes-agent[google]", - "hermes-agent[web]", - "hermes-agent[youtube]", + "kora[cron]", + "kora[cli]", + "kora[dev]", + "kora[pty]", + "kora[mcp]", + "kora[homeassistant]", + "kora[sms]", + "kora[acp]", + "kora[google]", + "kora[web]", + "kora[youtube]", ] [project.scripts] +# Primary entrypoint for the Kora runtime. The `hermes` aliases are kept as +# backwards-compat wrappers for the duration of KR-1 (ST4 rewrites them as +# deprecation shims). Module paths still say `hermes_cli` / `run_agent` / +# `acp_adapter` — ST3 renames `hermes_cli` → `kora_cli` and updates these. +kora = "hermes_cli.main:main" +kora-agent = "run_agent:main" +kora-acp = "acp_adapter.entry:main" +# BC aliases — to be wrapped in deprecation warnings by KR-1 ST4, removed in KR-2+. hermes = "hermes_cli.main:main" hermes-agent = "run_agent:main" hermes-acp = "acp_adapter.entry:main" diff --git a/tests/agent/test_kora_identity_kr1.py b/tests/agent/test_kora_identity_kr1.py new file mode 100644 index 000000000000..7dd60fe261d6 --- /dev/null +++ b/tests/agent/test_kora_identity_kr1.py @@ -0,0 +1,119 @@ +"""KR-1 ST2 tests — Kora identity swap. + +Verifies: +1. `DEFAULT_AGENT_IDENTITY` resolves to Kora identity (not Hermes). +2. The prompt-builder identity literal starts with the canonical Kora opener. +3. `load_soul_md` continues to override `DEFAULT_AGENT_IDENTITY` when the + user has installed a profile-local `SOUL.md` (regression guard — this + is the supported customization seam from KR-7). +4. The repo-root SOUL.md scaffold ships content that begins with the + canonical Kora opener — so an operator who copies it to the profile + home gets the same identity surface as the embedded default. +5. The "Kora WebUI" prompt fragment is wired in `PLATFORM_HINTS` (the + companion identity surface to `DEFAULT_AGENT_IDENTITY` for browser UI). + +The bucket spec is the source of truth for the verbatim Kora identity +string; these assertions sample the load-bearing phrases rather than +asserting the full 1KB literal so KR-7 can refine without re-touching +KR-1 test fixtures. +""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from agent.prompt_builder import DEFAULT_AGENT_IDENTITY, PLATFORM_HINTS + + +REPO_ROOT = Path(__file__).resolve().parents[2] + + +class TestDefaultAgentIdentityIsKora: + def test_starts_with_kora_opener(self): + # The opening line is the single most load-bearing sentence in the + # whole prompt. KR-7 may refine wording elsewhere; this must hold. + assert DEFAULT_AGENT_IDENTITY.startswith("You are Kora.") + + def test_does_not_identify_as_hermes(self): + # Explicit negative — guards against an accidental revert during + # ST3/ST4 string sweeps. + assert "You are Hermes Agent" not in DEFAULT_AGENT_IDENTITY + assert "You are Hermes." not in DEFAULT_AGENT_IDENTITY + + def test_carries_role_charter_pointer(self): + # KR-6 will wire capability + Constitution checks; the identity + # already names the Role Charter as the authority source, so + # operators reading the prompt know where Kora's boundaries live. + assert "Role Charter" in DEFAULT_AGENT_IDENTITY + assert "public.kora_role_charter" in DEFAULT_AGENT_IDENTITY + + def test_carries_actor_kind_kora(self): + # Substrate contract: every Kora write uses actor_kind='kora'. + # The identity advertises this so substrate-aware tools have a + # reason to expect it. + assert "actor_kind='kora'" in DEFAULT_AGENT_IDENTITY + + def test_acknowledges_hermes_runtime_inheritance(self): + # Honest origin credit lives in the identity itself, not just the + # README. If a future refactor strips this line, KR-7 must + # reintroduce it somewhere or update the test. + assert "hermes-agent" in DEFAULT_AGENT_IDENTITY + + +class TestRepoRootSoulMd: + """The repo ships `SOUL.md` at the root as a KR-1 scaffold. + + The runtime `load_soul_md()` currently resolves `~/.hermes/SOUL.md` + (ST3 renames that to `~/.kora/SOUL.md`). For KR-1 ST2, the repo-root + scaffold is purely informational — but it must agree with the + embedded identity so an operator who copies it gets the same opener. + """ + + def test_repo_root_soul_md_exists(self): + soul = REPO_ROOT / "SOUL.md" + assert soul.exists(), "KR-1 ST2 ships SOUL.md scaffold at repo root" + + def test_repo_root_soul_md_starts_with_kora_opener(self): + content = (REPO_ROOT / "SOUL.md").read_text(encoding="utf-8") + # Skip the markdown frontmatter / scaffolding notes — find the + # identity body, which is signaled by the `---` divider in the + # scaffold. The body must begin "You are Kora." + assert "You are Kora." in content + # And explicit negative: scaffold must NOT identify as Hermes. + assert "You are Hermes" not in content + + def test_repo_root_soul_md_flags_itself_as_kr1_stub(self): + # Honest-label invariant — Rule-6. If KR-7 replaces the scaffold + # with the full content, this assertion can be deleted. + content = (REPO_ROOT / "SOUL.md").read_text(encoding="utf-8") + assert "KR-1 stub" in content or "KR-7" in content + + +class TestWebUIPromptIsKora: + """ST2 secondary — the user-visible WebUI prompt fragment was + "You are in the Hermes WebUI, ..." and is now "Kora WebUI". This + surface is shown when the agent runs in the browser dashboard. + """ + + def test_webui_hint_says_kora(self): + webui = PLATFORM_HINTS.get("webui", "") + assert "Kora WebUI" in webui + assert "Hermes WebUI" not in webui + + +class TestDefaultIdentityLengthInvariant: + """Regression guard — the existing length-floor assertion lives in + `test_prompt_builder.py::TestPromptBuilderConstants::test_default_identity_non_empty` + (`assert len(DEFAULT_AGENT_IDENTITY) > 50`). The Kora identity is + well over 50 chars, but we tighten the bound here so a future + accidental truncation surfaces immediately rather than silently + passing the >50 check. + """ + + def test_identity_at_least_500_chars(self): + # Anchor the floor at "noticeably more than the old Hermes + # default" (the upstream identity was 513 chars; the Kora + # identity is ~1100). 500 leaves room for KR-7 refinement. + assert len(DEFAULT_AGENT_IDENTITY) >= 500 diff --git a/tests/agent/test_system_prompt_restore.py b/tests/agent/test_system_prompt_restore.py index ecfd57b1dfef..b247b00b1e39 100644 --- a/tests/agent/test_system_prompt_restore.py +++ b/tests/agent/test_system_prompt_restore.py @@ -201,7 +201,7 @@ def test_restored_prompt_is_byte_identical_to_stored(self): invalidates KV cache on every prefix-cache backend. """ stored = ( - "You are Hermes Agent.\n" + "You are Kora.\n" "\n" "Conversation started: Sunday, May 17, 2026\n" "Session ID: 20260517_153500_abc123\n" diff --git a/tests/run_agent/test_run_agent_codex_responses.py b/tests/run_agent/test_run_agent_codex_responses.py index 5652281eb424..317d9b3f8d0e 100644 --- a/tests/run_agent/test_run_agent_codex_responses.py +++ b/tests/run_agent/test_run_agent_codex_responses.py @@ -191,7 +191,7 @@ def close(self): def _codex_request_kwargs(): return { "model": "gpt-5-codex", - "instructions": "You are Hermes.", + "instructions": "You are Kora.", "input": [{"role": "user", "content": "Ping"}], "tools": None, "store": False, @@ -289,13 +289,13 @@ def test_build_api_kwargs_codex(monkeypatch): agent = _build_agent(monkeypatch) kwargs = agent._build_api_kwargs( [ - {"role": "system", "content": "You are Hermes."}, + {"role": "system", "content": "You are Kora."}, {"role": "user", "content": "Ping"}, ] ) assert kwargs["model"] == "gpt-5-codex" - assert kwargs["instructions"] == "You are Hermes." + assert kwargs["instructions"] == "You are Kora." assert kwargs["store"] is False assert isinstance(kwargs["input"], list) assert kwargs["input"][0]["role"] == "user" @@ -339,7 +339,7 @@ def test_build_api_kwargs_codex_clamps_minimal_effort(monkeypatch): kwargs = agent._build_api_kwargs( [ - {"role": "system", "content": "You are Hermes."}, + {"role": "system", "content": "You are Kora."}, {"role": "user", "content": "Ping"}, ] ) @@ -614,7 +614,7 @@ def test_build_api_kwargs_xai_oauth_sends_cache_key_via_extra_body(monkeypatch): agent = _build_xai_oauth_agent(monkeypatch) kwargs = agent._build_api_kwargs( [ - {"role": "system", "content": "You are Hermes."}, + {"role": "system", "content": "You are Kora."}, {"role": "user", "content": "Ping"}, ] ) @@ -985,7 +985,7 @@ def test_preflight_codex_api_kwargs_strips_optional_function_call_id(monkeypatch preflight = _preflight_codex_api_kwargs( { "model": "gpt-5-codex", - "instructions": "You are Hermes.", + "instructions": "You are Kora.", "input": [ {"role": "user", "content": "hi"}, { @@ -1014,7 +1014,7 @@ def test_preflight_codex_api_kwargs_rejects_function_call_output_without_call_id _preflight_codex_api_kwargs( { "model": "gpt-5-codex", - "instructions": "You are Hermes.", + "instructions": "You are Kora.", "input": [{"type": "function_call_output", "output": "{}"}], "tools": [], "store": False, diff --git a/uv.lock b/uv.lock index a9cd382b1d54..43bba195279a 100644 --- a/uv.lock +++ b/uv.lock @@ -1597,541 +1597,244 @@ wheels = [ ] [[package]] -name = "hermes-agent" -version = "0.14.0" -source = { editable = "." } -dependencies = [ - { name = "croniter" }, - { name = "fire" }, - { name = "httpx", extra = ["socks"] }, - { name = "jinja2" }, - { name = "openai" }, - { name = "prompt-toolkit" }, - { name = "psutil" }, - { name = "pydantic" }, - { name = "pyjwt", extra = ["crypto"] }, - { name = "python-dotenv" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "rich" }, - { name = "ruamel-yaml" }, - { name = "tenacity" }, - { name = "tzdata", marker = "sys_platform == 'win32'" }, +name = "hf-xet" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/d0/73454ef7ca885598a3194d07d5c517d91a840753c5b35d272600d7907f64/hf_xet-1.3.1.tar.gz", hash = "sha256:513aa75f8dc39a63cc44dbc8d635ccf6b449e07cdbd8b2e2d006320d2e4be9bb", size = 641393, upload-time = "2026-02-25T00:57:56.701Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/79/9b6a5614230d7a871442d8d8e1c270496821638ba3a9baac16a5b9166200/hf_xet-1.3.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:08b231260c68172c866f7aa7257c165d0c87887491aafc5efeee782731725366", size = 3759716, upload-time = "2026-02-25T00:57:41.052Z" }, + { url = "https://files.pythonhosted.org/packages/d4/de/72acb8d7702b3cf9b36a68e8380f3114bf04f9f21cf9e25317457fe31f00/hf_xet-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0810b69c64e96dee849036193848007f665dca2311879c9ea8693f4fc37f1795", size = 3518075, upload-time = "2026-02-25T00:57:39.605Z" }, + { url = "https://files.pythonhosted.org/packages/1d/5c/ed728d8530fec28da88ee882b522fccf00dc98e9d7bae4cdb0493070cb17/hf_xet-1.3.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ecd38f98e7f0f41108e30fd4a9a5553ec30cf726df7473dd3e75a1b6d56728c2", size = 4174369, upload-time = "2026-02-25T00:57:32.697Z" }, + { url = "https://files.pythonhosted.org/packages/3c/db/785a0e20aa3086948a26573f1d4ff5c090e63564bf0a52d32eb5b4d82e8d/hf_xet-1.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65411867d46700765018b1990eb1604c3bf0bf576d9e65fc57fdcc10797a2eb9", size = 3953249, upload-time = "2026-02-25T00:57:30.096Z" }, + { url = "https://files.pythonhosted.org/packages/c4/6a/51b669c1e3dbd9374b61356f554e8726b9e1c1d6a7bee5d727d3913b10ad/hf_xet-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1684c840c60da12d76c2a031ba40e4b154fdbf9593836fcf5ff090d95a033c61", size = 4152989, upload-time = "2026-02-25T00:57:48.308Z" }, + { url = "https://files.pythonhosted.org/packages/df/31/de07e26e396f46d13a09251df69df9444190e93e06a9d30d639e96c8a0ed/hf_xet-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b3012c0f2ce1f0863338491a2bc0fd3f84aded0e147ab25f230da1f5249547fd", size = 4390709, upload-time = "2026-02-25T00:57:49.845Z" }, + { url = "https://files.pythonhosted.org/packages/e3/c1/fcb010b54488c2c112224f55b71f80e44d1706d9b764a0966310b283f86e/hf_xet-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:4eb432e1aa707a65a7e1f8455e40c5b47431d44fe0fb1b0c5d53848c27469398", size = 3634142, upload-time = "2026-02-25T00:57:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/da/a6/9ef49cc601c68209979661b3e0b6659fc5a47bfb40f3ebf29eae9ee09e5c/hf_xet-1.3.1-cp313-cp313t-win_arm64.whl", hash = "sha256:e56104c84b2a88b9c7b23ba11a2d7ed0ccbe96886b3f985a50cedd2f0e99853f", size = 3494918, upload-time = "2026-02-25T00:57:57.654Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f5/66adbb1f54a1b3c6da002fa36d4405901ddbcb7d927d780db17ce18ab99d/hf_xet-1.3.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:6517a245e41df3eae5adc5f9e8c86fa52abd548de798cbcd989f0082152860aa", size = 3759781, upload-time = "2026-02-25T00:57:47.017Z" }, + { url = "https://files.pythonhosted.org/packages/1e/75/189d91a90480c142cc710c1baa35ece20e8652d5fe5c9b2364a13573d827/hf_xet-1.3.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4a322d506c513f98fdc1aa2aaa825daefd535b686e80ca789e6d33fcb146f524", size = 3517533, upload-time = "2026-02-25T00:57:45.812Z" }, + { url = "https://files.pythonhosted.org/packages/c6/52/52dd1ab6c29661e29585f3c10d14572e2535a3a472f27a0a46215b0f4659/hf_xet-1.3.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f16ec9d26badec46334a798e01b5d86af536924789c95b1a1ec6a05f26523e0", size = 4174082, upload-time = "2026-02-25T00:57:38.171Z" }, + { url = "https://files.pythonhosted.org/packages/14/03/460add181c79e2ea1527d2ad27788ecccaee1d5a82563f9402e25ee627e4/hf_xet-1.3.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:e1f5d72bd5b73e61530fff573bcff34bdb64af2bf4862cdd516e6c1dab4dc75b", size = 3952874, upload-time = "2026-02-25T00:57:36.942Z" }, + { url = "https://files.pythonhosted.org/packages/01/56/bf78f18890dfc8caa907830e95424dce0887d5c45efde13f23c9ebbaa8ef/hf_xet-1.3.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4bc71afd853508b2ddf123b8fc9de71b0afa4c956ec730b69fb76103781e94cd", size = 4152325, upload-time = "2026-02-25T00:57:54.081Z" }, + { url = "https://files.pythonhosted.org/packages/3c/94/91685c6a4a7f513097a6a73b1e879024304cd0eae78080e3d737622f2fd9/hf_xet-1.3.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:541b4b00ed294ae6cfd9416de9506e58971013714d7316189c9638ed54e362d4", size = 4390499, upload-time = "2026-02-25T00:57:55.258Z" }, + { url = "https://files.pythonhosted.org/packages/79/1b/1e72c8ea1f31ef94640d1f265630d35b97b2ef31fe12696bbcc32dbcdc95/hf_xet-1.3.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f85480b4fe3e8e4cdbc59ef1d235152b732fd57ca439cc983c291892945ae818", size = 3634352, upload-time = "2026-02-25T00:58:04.749Z" }, + { url = "https://files.pythonhosted.org/packages/cf/61/b59e87a7a10b95c4578a6ce555339b2f002035569dfd366662b9f59975a8/hf_xet-1.3.1-cp314-cp314t-win_arm64.whl", hash = "sha256:83a8830160392ef4bea78d443ea2cf1febe65783b3843a8f12c64b368981e7e2", size = 3494371, upload-time = "2026-02-25T00:58:03.422Z" }, + { url = "https://files.pythonhosted.org/packages/75/f8/c2da4352c0335df6ae41750cf5bab09fdbfc30d3b4deeed9d621811aa835/hf_xet-1.3.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:581d1809a016f7881069d86a072168a8199a46c839cf394ff53970a47e4f1ca1", size = 3761755, upload-time = "2026-02-25T00:57:43.621Z" }, + { url = "https://files.pythonhosted.org/packages/c0/e5/a2f3eaae09da57deceb16a96ebe9ae1f6f7b9b94145a9cd3c3f994e7782a/hf_xet-1.3.1-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:329c80c86f2dda776bafd2e4813a46a3ee648dce3ac0c84625902c70d7a6ddba", size = 3523677, upload-time = "2026-02-25T00:57:42.3Z" }, + { url = "https://files.pythonhosted.org/packages/61/cd/acbbf9e51f17d8cef2630e61741228e12d4050716619353efc1ac119f902/hf_xet-1.3.1-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2973c3ff594c3a8da890836308cae1444c8af113c6f10fe6824575ddbc37eca7", size = 4178557, upload-time = "2026-02-25T00:57:35.399Z" }, + { url = "https://files.pythonhosted.org/packages/df/4f/014c14c4ae3461d9919008d0bed2f6f35ba1741e28b31e095746e8dac66f/hf_xet-1.3.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ed4bfd2e6d10cb86c9b0f3483df1d7dd2d0220f75f27166925253bacbc1c2dbe", size = 3958975, upload-time = "2026-02-25T00:57:34.004Z" }, + { url = "https://files.pythonhosted.org/packages/86/50/043f5c5a26f3831c3fa2509c17fcd468fd02f1f24d363adc7745fbe661cb/hf_xet-1.3.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:713913387cc76e300116030705d843a9f15aee86158337eeffb9eb8d26f47fcd", size = 4158298, upload-time = "2026-02-25T00:57:51.14Z" }, + { url = "https://files.pythonhosted.org/packages/08/9c/b667098a636a88358dbeb2caf90e3cb9e4b961f61f6c55bb312793424def/hf_xet-1.3.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e5063789c9d21f51e9ed4edbee8539655d3486e9cad37e96b7af967da20e8b16", size = 4395743, upload-time = "2026-02-25T00:57:52.783Z" }, + { url = "https://files.pythonhosted.org/packages/70/37/4db0e4e1534270800cfffd5a7e0b338f2137f8ceb5768000147650d34ea9/hf_xet-1.3.1-cp37-abi3-win_amd64.whl", hash = "sha256:607d5bbc2730274516714e2e442a26e40e3330673ac0d0173004461409147dee", size = 3638145, upload-time = "2026-02-25T00:58:02.167Z" }, + { url = "https://files.pythonhosted.org/packages/4e/46/1ba8d36f8290a4b98f78898bdce2b0e8fe6d9a59df34a1399eb61a8d877f/hf_xet-1.3.1-cp37-abi3-win_arm64.whl", hash = "sha256:851b1be6597a87036fe7258ce7578d5df3c08176283b989c3b165f94125c5097", size = 3500490, upload-time = "2026-02-25T00:58:00.667Z" }, ] -[package.optional-dependencies] -acp = [ - { name = "agent-client-protocol" }, -] -all = [ - { name = "agent-client-protocol" }, +[[package]] +name = "hindsight-client" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ { name = "aiohttp" }, - { name = "debugpy" }, - { name = "fastapi" }, - { name = "google-api-python-client" }, - { name = "google-auth-httplib2" }, - { name = "google-auth-oauthlib" }, - { name = "mcp" }, - { name = "ptyprocess", marker = "sys_platform != 'win32'" }, - { name = "pytest" }, - { name = "pytest-asyncio" }, - { name = "pytest-split" }, - { name = "pytest-timeout" }, - { name = "pytest-xdist" }, - { name = "pywinpty", marker = "sys_platform == 'win32'" }, - { name = "ruff" }, - { name = "simple-term-menu" }, - { name = "ty" }, - { name = "uvicorn", extra = ["standard"] }, - { name = "youtube-transcript-api" }, -] -anthropic = [ - { name = "anthropic" }, -] -azure-identity = [ - { name = "azure-identity" }, + { name = "aiohttp-retry" }, + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "typing-extensions" }, + { name = "urllib3" }, ] -bedrock = [ - { name = "boto3" }, +sdist = { url = "https://files.pythonhosted.org/packages/33/26/8b8efa4be21fc3ba12ade3b1353d87f9837ec0d3ec2607e8adbf85bc9c63/hindsight_client-0.6.1.tar.gz", hash = "sha256:314d0bb9e13622e15586ba1586a799726d405b27bc20d78872474b5d6d96cd51", size = 99833, upload-time = "2026-05-08T13:01:23.537Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/4f/a1d0bc33ef933ecc52e76dc1514163594d25836a5d303c256a61bb61445d/hindsight_client-0.6.1-py3-none-any.whl", hash = "sha256:9fdda176ab50f7cec8d7339c6608c148f0cd9ad7e65d9d76192f2db730bc330a", size = 249379, upload-time = "2026-05-08T13:01:22.035Z" }, ] -cli = [ - { name = "simple-term-menu" }, + +[[package]] +name = "honcho-ai" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "pydantic" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] -computer-use = [ - { name = "mcp" }, +sdist = { url = "https://files.pythonhosted.org/packages/93/30/d30ba159404050d53b4b1b1c4477f9591f43af18758be1fb7dab6afbfe7d/honcho_ai-2.0.1.tar.gz", hash = "sha256:6fdeebf9454e62bc523d57888e50359e67baafdb21f68621f9c14e08dc00623a", size = 46732, upload-time = "2026-02-09T21:03:26.99Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/de/83fda0c057cfa11d6b5ed532623184591aa7dcff4a067934ba6811026229/honcho_ai-2.0.1-py3-none-any.whl", hash = "sha256:94887e61d59f353e1e1e20b395858040780f5d67ca1e9d450538646544e4e42f", size = 56780, upload-time = "2026-02-09T21:03:25.992Z" }, ] -daytona = [ - { name = "daytona" }, + +[[package]] +name = "hpack" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276, upload-time = "2025-01-22T21:44:58.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357, upload-time = "2025-01-22T21:44:56.92Z" }, ] -dev = [ - { name = "debugpy" }, - { name = "mcp" }, - { name = "pytest" }, - { name = "pytest-asyncio" }, - { name = "pytest-split" }, - { name = "pytest-timeout" }, - { name = "pytest-xdist" }, - { name = "ruff" }, - { name = "ty" }, + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, ] -dingtalk = [ - { name = "alibabacloud-dingtalk" }, - { name = "dingtalk-stream" }, - { name = "qrcode" }, +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/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" }, ] -edge-tts = [ - { name = "edge-tts" }, + +[[package]] +name = "httplib2" +version = "0.31.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyparsing" }, ] -exa = [ - { name = "exa-py" }, +sdist = { url = "https://files.pythonhosted.org/packages/c1/1f/e86365613582c027dda5ddb64e1010e57a3d53e99ab8a72093fa13d565ec/httplib2-0.31.2.tar.gz", hash = "sha256:385e0869d7397484f4eab426197a4c020b606edd43372492337c0b4010ae5d24", size = 250800, upload-time = "2026-01-23T11:04:44.165Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl", hash = "sha256:dbf0c2fa3862acf3c55c078ea9c0bc4481d7dc5117cae71be9514912cf9f8349", size = 91099, upload-time = "2026-01-23T11:04:42.78Z" }, ] -fal = [ - { name = "fal-client" }, + +[[package]] +name = "httptools" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" }, + { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" }, + { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" }, + { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" }, + { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" }, + { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" }, + { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" }, + { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" }, + { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" }, + { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" }, + { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, + { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, + { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, + { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" }, + { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" }, + { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" }, + { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" }, + { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" }, + { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" }, + { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, ] -feishu = [ - { name = "lark-oapi" }, - { name = "qrcode" }, + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, ] -firecrawl = [ - { name = "firecrawl-py" }, +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/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" }, ] -google = [ - { name = "google-api-python-client" }, - { name = "google-auth-httplib2" }, - { name = "google-auth-oauthlib" }, + +[package.optional-dependencies] +socks = [ + { name = "socksio" }, ] -hindsight = [ - { name = "hindsight-client" }, + +[[package]] +name = "httpx-sse" +version = "0.4.3" +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, upload-time = "2025-10-10T21:48:22.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/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" }, ] -homeassistant = [ - { name = "aiohttp" }, + +[[package]] +name = "huggingface-hub" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "httpx" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "shellingham" }, + { name = "tqdm" }, + { name = "typer-slim" }, + { name = "typing-extensions" }, ] -honcho = [ - { name = "honcho-ai" }, +sdist = { url = "https://files.pythonhosted.org/packages/c4/fc/eb9bc06130e8bbda6a616e1b80a7aa127681c448d6b49806f61db2670b61/huggingface_hub-1.4.1.tar.gz", hash = "sha256:b41131ec35e631e7383ab26d6146b8d8972abc8b6309b963b306fbcca87f5ed5", size = 642156, upload-time = "2026-02-06T09:20:03.013Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/ae/2f6d96b4e6c5478d87d606a1934b5d436c4a2bce6bb7c6fdece891c128e3/huggingface_hub-1.4.1-py3-none-any.whl", hash = "sha256:9931d075fb7a79af5abc487106414ec5fba2c0ae86104c0c62fd6cae38873d18", size = 553326, upload-time = "2026-02-06T09:20:00.728Z" }, ] -matrix = [ - { name = "aiohttp-socks" }, - { name = "aiosqlite" }, - { name = "asyncpg" }, - { name = "markdown" }, - { name = "mautrix", extra = ["encryption"] }, -] -mcp = [ - { name = "mcp" }, -] -messaging = [ - { name = "aiohttp" }, - { name = "brotlicffi" }, - { name = "discord-py", extra = ["voice"] }, - { name = "python-telegram-bot", extra = ["webhooks"] }, - { name = "qrcode" }, - { name = "slack-bolt" }, - { name = "slack-sdk" }, -] -modal = [ - { name = "modal" }, -] -parallel-web = [ - { name = "parallel-web" }, -] -pty = [ - { name = "ptyprocess", marker = "sys_platform != 'win32'" }, - { name = "pywinpty", marker = "sys_platform == 'win32'" }, -] -slack = [ - { name = "aiohttp" }, - { name = "slack-bolt" }, - { name = "slack-sdk" }, -] -sms = [ - { name = "aiohttp" }, -] -termux = [ - { name = "agent-client-protocol" }, - { name = "honcho-ai" }, - { name = "mcp" }, - { name = "ptyprocess", marker = "sys_platform != 'win32'" }, - { name = "python-telegram-bot", extra = ["webhooks"] }, - { name = "pywinpty", marker = "sys_platform == 'win32'" }, - { name = "simple-term-menu" }, -] -termux-all = [ - { name = "agent-client-protocol" }, - { name = "aiohttp" }, - { name = "fastapi" }, - { name = "google-api-python-client" }, - { name = "google-auth-httplib2" }, - { name = "google-auth-oauthlib" }, - { name = "honcho-ai" }, - { name = "mcp" }, - { name = "ptyprocess", marker = "sys_platform != 'win32'" }, - { name = "python-telegram-bot", extra = ["webhooks"] }, - { name = "pywinpty", marker = "sys_platform == 'win32'" }, - { name = "simple-term-menu" }, - { name = "uvicorn", extra = ["standard"] }, -] -tts-premium = [ - { name = "elevenlabs" }, -] -vercel = [ - { name = "vercel" }, -] -voice = [ - { name = "faster-whisper" }, - { name = "numpy" }, - { name = "sounddevice" }, -] -web = [ - { name = "fastapi" }, - { name = "uvicorn", extra = ["standard"] }, -] -youtube = [ - { name = "youtube-transcript-api" }, -] - -[package.metadata] -requires-dist = [ - { name = "agent-client-protocol", marker = "extra == 'acp'", specifier = "==0.9.0" }, - { name = "aiohttp", marker = "extra == 'homeassistant'", specifier = "==3.13.3" }, - { name = "aiohttp", marker = "extra == 'messaging'", specifier = "==3.13.3" }, - { name = "aiohttp", marker = "extra == 'slack'", specifier = "==3.13.3" }, - { name = "aiohttp", marker = "extra == 'sms'", specifier = "==3.13.3" }, - { name = "aiohttp-socks", marker = "extra == 'matrix'", specifier = "==0.11.0" }, - { name = "aiosqlite", marker = "extra == 'matrix'", specifier = "==0.22.1" }, - { name = "alibabacloud-dingtalk", marker = "extra == 'dingtalk'", specifier = "==2.2.42" }, - { name = "anthropic", marker = "extra == 'anthropic'", specifier = "==0.86.0" }, - { name = "asyncpg", marker = "extra == 'matrix'", specifier = "==0.31.0" }, - { name = "azure-identity", marker = "extra == 'azure-identity'", specifier = "==1.25.3" }, - { name = "boto3", marker = "extra == 'bedrock'", specifier = "==1.42.89" }, - { name = "brotlicffi", marker = "extra == 'messaging'", specifier = "==1.2.0.1" }, - { name = "croniter", specifier = "==6.0.0" }, - { name = "daytona", marker = "extra == 'daytona'", specifier = "==0.155.0" }, - { name = "debugpy", marker = "extra == 'dev'", specifier = "==1.8.20" }, - { name = "dingtalk-stream", marker = "extra == 'dingtalk'", specifier = "==0.24.3" }, - { name = "discord-py", extras = ["voice"], marker = "extra == 'messaging'", specifier = "==2.7.1" }, - { name = "edge-tts", marker = "extra == 'edge-tts'", specifier = "==7.2.7" }, - { name = "elevenlabs", marker = "extra == 'tts-premium'", specifier = "==1.59.0" }, - { name = "exa-py", marker = "extra == 'exa'", specifier = "==2.10.2" }, - { name = "fal-client", marker = "extra == 'fal'", specifier = "==0.13.1" }, - { name = "fastapi", marker = "extra == 'web'", specifier = "==0.133.1" }, - { name = "faster-whisper", marker = "extra == 'voice'", specifier = "==1.2.1" }, - { name = "fire", specifier = "==0.7.1" }, - { name = "firecrawl-py", marker = "extra == 'firecrawl'", specifier = "==4.17.0" }, - { name = "google-api-python-client", marker = "extra == 'google'", specifier = "==2.194.0" }, - { name = "google-auth-httplib2", marker = "extra == 'google'", specifier = "==0.3.1" }, - { name = "google-auth-oauthlib", marker = "extra == 'google'", specifier = "==1.3.1" }, - { name = "hermes-agent", extras = ["acp"], marker = "extra == 'all'" }, - { name = "hermes-agent", extras = ["acp"], marker = "extra == 'termux'" }, - { name = "hermes-agent", extras = ["cli"], marker = "extra == 'all'" }, - { name = "hermes-agent", extras = ["cli"], marker = "extra == 'termux'" }, - { name = "hermes-agent", extras = ["cron"], marker = "extra == 'all'" }, - { name = "hermes-agent", extras = ["cron"], marker = "extra == 'termux'" }, - { name = "hermes-agent", extras = ["dev"], marker = "extra == 'all'" }, - { name = "hermes-agent", extras = ["google"], marker = "extra == 'all'" }, - { name = "hermes-agent", extras = ["google"], marker = "extra == 'termux-all'" }, - { name = "hermes-agent", extras = ["homeassistant"], marker = "extra == 'all'" }, - { name = "hermes-agent", extras = ["homeassistant"], marker = "extra == 'termux-all'" }, - { name = "hermes-agent", extras = ["honcho"], marker = "extra == 'termux'" }, - { name = "hermes-agent", extras = ["mcp"], marker = "extra == 'all'" }, - { name = "hermes-agent", extras = ["mcp"], marker = "extra == 'termux'" }, - { name = "hermes-agent", extras = ["pty"], marker = "extra == 'all'" }, - { name = "hermes-agent", extras = ["pty"], marker = "extra == 'termux'" }, - { name = "hermes-agent", extras = ["sms"], marker = "extra == 'all'" }, - { name = "hermes-agent", extras = ["sms"], marker = "extra == 'termux-all'" }, - { name = "hermes-agent", extras = ["termux"], marker = "extra == 'termux-all'" }, - { name = "hermes-agent", extras = ["web"], marker = "extra == 'all'" }, - { name = "hermes-agent", extras = ["web"], marker = "extra == 'termux-all'" }, - { name = "hermes-agent", extras = ["youtube"], marker = "extra == 'all'" }, - { name = "hindsight-client", marker = "extra == 'hindsight'", specifier = "==0.6.1" }, - { name = "honcho-ai", marker = "extra == 'honcho'", specifier = "==2.0.1" }, - { name = "httpx", extras = ["socks"], specifier = "==0.28.1" }, - { name = "jinja2", specifier = "==3.1.6" }, - { name = "lark-oapi", marker = "extra == 'feishu'", specifier = "==1.5.3" }, - { name = "markdown", marker = "extra == 'matrix'", specifier = "==3.10.2" }, - { name = "mautrix", extras = ["encryption"], marker = "extra == 'matrix'", specifier = "==0.21.0" }, - { name = "mcp", marker = "extra == 'computer-use'", specifier = "==1.26.0" }, - { name = "mcp", marker = "extra == 'dev'", specifier = "==1.26.0" }, - { name = "mcp", marker = "extra == 'mcp'", specifier = "==1.26.0" }, - { name = "modal", marker = "extra == 'modal'", specifier = "==1.3.4" }, - { name = "numpy", marker = "extra == 'voice'", specifier = "==2.4.3" }, - { name = "openai", specifier = "==2.24.0" }, - { name = "parallel-web", marker = "extra == 'parallel-web'", specifier = "==0.4.2" }, - { name = "prompt-toolkit", specifier = "==3.0.52" }, - { name = "psutil", specifier = "==7.2.2" }, - { name = "ptyprocess", marker = "sys_platform != 'win32' and extra == 'pty'", specifier = "==0.7.0" }, - { name = "pydantic", specifier = "==2.12.5" }, - { name = "pyjwt", extras = ["crypto"], specifier = "==2.12.1" }, - { name = "pytest", marker = "extra == 'dev'", specifier = "==9.0.2" }, - { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = "==1.3.0" }, - { name = "pytest-split", marker = "extra == 'dev'", specifier = "==0.11.0" }, - { name = "pytest-timeout", marker = "extra == 'dev'", specifier = "==2.4.0" }, - { name = "pytest-xdist", marker = "extra == 'dev'", specifier = "==3.8.0" }, - { name = "python-dotenv", specifier = "==1.2.2" }, - { name = "python-telegram-bot", extras = ["webhooks"], marker = "extra == 'messaging'", specifier = "==22.6" }, - { name = "python-telegram-bot", extras = ["webhooks"], marker = "extra == 'termux'", specifier = "==22.6" }, - { name = "pywinpty", marker = "sys_platform == 'win32' and extra == 'pty'", specifier = "==2.0.15" }, - { name = "pyyaml", specifier = "==6.0.3" }, - { name = "qrcode", marker = "extra == 'dingtalk'", specifier = "==7.4.2" }, - { name = "qrcode", marker = "extra == 'feishu'", specifier = "==7.4.2" }, - { name = "qrcode", marker = "extra == 'messaging'", specifier = "==7.4.2" }, - { name = "requests", specifier = "==2.33.0" }, - { name = "rich", specifier = "==14.3.3" }, - { name = "ruamel-yaml", specifier = "==0.18.17" }, - { name = "ruff", marker = "extra == 'dev'", specifier = "==0.15.10" }, - { name = "simple-term-menu", marker = "extra == 'cli'", specifier = "==1.6.6" }, - { name = "slack-bolt", marker = "extra == 'messaging'", specifier = "==1.27.0" }, - { name = "slack-bolt", marker = "extra == 'slack'", specifier = "==1.27.0" }, - { name = "slack-sdk", marker = "extra == 'messaging'", specifier = "==3.40.1" }, - { name = "slack-sdk", marker = "extra == 'slack'", specifier = "==3.40.1" }, - { name = "sounddevice", marker = "extra == 'voice'", specifier = "==0.5.5" }, - { name = "tenacity", specifier = "==9.1.4" }, - { name = "ty", marker = "extra == 'dev'", specifier = "==0.0.21" }, - { name = "tzdata", marker = "sys_platform == 'win32'", specifier = "==2025.3" }, - { name = "uvicorn", extras = ["standard"], marker = "extra == 'web'", specifier = "==0.41.0" }, - { name = "vercel", marker = "extra == 'vercel'", specifier = "==0.5.7" }, - { name = "youtube-transcript-api", marker = "extra == 'youtube'", specifier = "==1.2.4" }, -] -provides-extras = ["anthropic", "exa", "firecrawl", "parallel-web", "fal", "edge-tts", "modal", "daytona", "vercel", "hindsight", "dev", "messaging", "cron", "slack", "matrix", "cli", "tts-premium", "voice", "pty", "honcho", "mcp", "homeassistant", "sms", "computer-use", "acp", "bedrock", "azure-identity", "termux", "termux-all", "dingtalk", "feishu", "google", "youtube", "web", "all"] [[package]] -name = "hf-xet" -version = "1.3.1" +name = "hyperframe" +version = "6.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a6/d0/73454ef7ca885598a3194d07d5c517d91a840753c5b35d272600d7907f64/hf_xet-1.3.1.tar.gz", hash = "sha256:513aa75f8dc39a63cc44dbc8d635ccf6b449e07cdbd8b2e2d006320d2e4be9bb", size = 641393, upload-time = "2026-02-25T00:57:56.701Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/79/9b6a5614230d7a871442d8d8e1c270496821638ba3a9baac16a5b9166200/hf_xet-1.3.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:08b231260c68172c866f7aa7257c165d0c87887491aafc5efeee782731725366", size = 3759716, upload-time = "2026-02-25T00:57:41.052Z" }, - { url = "https://files.pythonhosted.org/packages/d4/de/72acb8d7702b3cf9b36a68e8380f3114bf04f9f21cf9e25317457fe31f00/hf_xet-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0810b69c64e96dee849036193848007f665dca2311879c9ea8693f4fc37f1795", size = 3518075, upload-time = "2026-02-25T00:57:39.605Z" }, - { url = "https://files.pythonhosted.org/packages/1d/5c/ed728d8530fec28da88ee882b522fccf00dc98e9d7bae4cdb0493070cb17/hf_xet-1.3.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ecd38f98e7f0f41108e30fd4a9a5553ec30cf726df7473dd3e75a1b6d56728c2", size = 4174369, upload-time = "2026-02-25T00:57:32.697Z" }, - { url = "https://files.pythonhosted.org/packages/3c/db/785a0e20aa3086948a26573f1d4ff5c090e63564bf0a52d32eb5b4d82e8d/hf_xet-1.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65411867d46700765018b1990eb1604c3bf0bf576d9e65fc57fdcc10797a2eb9", size = 3953249, upload-time = "2026-02-25T00:57:30.096Z" }, - { url = "https://files.pythonhosted.org/packages/c4/6a/51b669c1e3dbd9374b61356f554e8726b9e1c1d6a7bee5d727d3913b10ad/hf_xet-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1684c840c60da12d76c2a031ba40e4b154fdbf9593836fcf5ff090d95a033c61", size = 4152989, upload-time = "2026-02-25T00:57:48.308Z" }, - { url = "https://files.pythonhosted.org/packages/df/31/de07e26e396f46d13a09251df69df9444190e93e06a9d30d639e96c8a0ed/hf_xet-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b3012c0f2ce1f0863338491a2bc0fd3f84aded0e147ab25f230da1f5249547fd", size = 4390709, upload-time = "2026-02-25T00:57:49.845Z" }, - { url = "https://files.pythonhosted.org/packages/e3/c1/fcb010b54488c2c112224f55b71f80e44d1706d9b764a0966310b283f86e/hf_xet-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:4eb432e1aa707a65a7e1f8455e40c5b47431d44fe0fb1b0c5d53848c27469398", size = 3634142, upload-time = "2026-02-25T00:57:59.063Z" }, - { url = "https://files.pythonhosted.org/packages/da/a6/9ef49cc601c68209979661b3e0b6659fc5a47bfb40f3ebf29eae9ee09e5c/hf_xet-1.3.1-cp313-cp313t-win_arm64.whl", hash = "sha256:e56104c84b2a88b9c7b23ba11a2d7ed0ccbe96886b3f985a50cedd2f0e99853f", size = 3494918, upload-time = "2026-02-25T00:57:57.654Z" }, - { url = "https://files.pythonhosted.org/packages/e7/f5/66adbb1f54a1b3c6da002fa36d4405901ddbcb7d927d780db17ce18ab99d/hf_xet-1.3.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:6517a245e41df3eae5adc5f9e8c86fa52abd548de798cbcd989f0082152860aa", size = 3759781, upload-time = "2026-02-25T00:57:47.017Z" }, - { url = "https://files.pythonhosted.org/packages/1e/75/189d91a90480c142cc710c1baa35ece20e8652d5fe5c9b2364a13573d827/hf_xet-1.3.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4a322d506c513f98fdc1aa2aaa825daefd535b686e80ca789e6d33fcb146f524", size = 3517533, upload-time = "2026-02-25T00:57:45.812Z" }, - { url = "https://files.pythonhosted.org/packages/c6/52/52dd1ab6c29661e29585f3c10d14572e2535a3a472f27a0a46215b0f4659/hf_xet-1.3.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f16ec9d26badec46334a798e01b5d86af536924789c95b1a1ec6a05f26523e0", size = 4174082, upload-time = "2026-02-25T00:57:38.171Z" }, - { url = "https://files.pythonhosted.org/packages/14/03/460add181c79e2ea1527d2ad27788ecccaee1d5a82563f9402e25ee627e4/hf_xet-1.3.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:e1f5d72bd5b73e61530fff573bcff34bdb64af2bf4862cdd516e6c1dab4dc75b", size = 3952874, upload-time = "2026-02-25T00:57:36.942Z" }, - { url = "https://files.pythonhosted.org/packages/01/56/bf78f18890dfc8caa907830e95424dce0887d5c45efde13f23c9ebbaa8ef/hf_xet-1.3.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4bc71afd853508b2ddf123b8fc9de71b0afa4c956ec730b69fb76103781e94cd", size = 4152325, upload-time = "2026-02-25T00:57:54.081Z" }, - { url = "https://files.pythonhosted.org/packages/3c/94/91685c6a4a7f513097a6a73b1e879024304cd0eae78080e3d737622f2fd9/hf_xet-1.3.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:541b4b00ed294ae6cfd9416de9506e58971013714d7316189c9638ed54e362d4", size = 4390499, upload-time = "2026-02-25T00:57:55.258Z" }, - { url = "https://files.pythonhosted.org/packages/79/1b/1e72c8ea1f31ef94640d1f265630d35b97b2ef31fe12696bbcc32dbcdc95/hf_xet-1.3.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f85480b4fe3e8e4cdbc59ef1d235152b732fd57ca439cc983c291892945ae818", size = 3634352, upload-time = "2026-02-25T00:58:04.749Z" }, - { url = "https://files.pythonhosted.org/packages/cf/61/b59e87a7a10b95c4578a6ce555339b2f002035569dfd366662b9f59975a8/hf_xet-1.3.1-cp314-cp314t-win_arm64.whl", hash = "sha256:83a8830160392ef4bea78d443ea2cf1febe65783b3843a8f12c64b368981e7e2", size = 3494371, upload-time = "2026-02-25T00:58:03.422Z" }, - { url = "https://files.pythonhosted.org/packages/75/f8/c2da4352c0335df6ae41750cf5bab09fdbfc30d3b4deeed9d621811aa835/hf_xet-1.3.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:581d1809a016f7881069d86a072168a8199a46c839cf394ff53970a47e4f1ca1", size = 3761755, upload-time = "2026-02-25T00:57:43.621Z" }, - { url = "https://files.pythonhosted.org/packages/c0/e5/a2f3eaae09da57deceb16a96ebe9ae1f6f7b9b94145a9cd3c3f994e7782a/hf_xet-1.3.1-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:329c80c86f2dda776bafd2e4813a46a3ee648dce3ac0c84625902c70d7a6ddba", size = 3523677, upload-time = "2026-02-25T00:57:42.3Z" }, - { url = "https://files.pythonhosted.org/packages/61/cd/acbbf9e51f17d8cef2630e61741228e12d4050716619353efc1ac119f902/hf_xet-1.3.1-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2973c3ff594c3a8da890836308cae1444c8af113c6f10fe6824575ddbc37eca7", size = 4178557, upload-time = "2026-02-25T00:57:35.399Z" }, - { url = "https://files.pythonhosted.org/packages/df/4f/014c14c4ae3461d9919008d0bed2f6f35ba1741e28b31e095746e8dac66f/hf_xet-1.3.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ed4bfd2e6d10cb86c9b0f3483df1d7dd2d0220f75f27166925253bacbc1c2dbe", size = 3958975, upload-time = "2026-02-25T00:57:34.004Z" }, - { url = "https://files.pythonhosted.org/packages/86/50/043f5c5a26f3831c3fa2509c17fcd468fd02f1f24d363adc7745fbe661cb/hf_xet-1.3.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:713913387cc76e300116030705d843a9f15aee86158337eeffb9eb8d26f47fcd", size = 4158298, upload-time = "2026-02-25T00:57:51.14Z" }, - { url = "https://files.pythonhosted.org/packages/08/9c/b667098a636a88358dbeb2caf90e3cb9e4b961f61f6c55bb312793424def/hf_xet-1.3.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e5063789c9d21f51e9ed4edbee8539655d3486e9cad37e96b7af967da20e8b16", size = 4395743, upload-time = "2026-02-25T00:57:52.783Z" }, - { url = "https://files.pythonhosted.org/packages/70/37/4db0e4e1534270800cfffd5a7e0b338f2137f8ceb5768000147650d34ea9/hf_xet-1.3.1-cp37-abi3-win_amd64.whl", hash = "sha256:607d5bbc2730274516714e2e442a26e40e3330673ac0d0173004461409147dee", size = 3638145, upload-time = "2026-02-25T00:58:02.167Z" }, - { url = "https://files.pythonhosted.org/packages/4e/46/1ba8d36f8290a4b98f78898bdce2b0e8fe6d9a59df34a1399eb61a8d877f/hf_xet-1.3.1-cp37-abi3-win_arm64.whl", hash = "sha256:851b1be6597a87036fe7258ce7578d5df3c08176283b989c3b165f94125c5097", size = 3500490, upload-time = "2026-02-25T00:58:00.667Z" }, + { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" }, ] [[package]] -name = "hindsight-client" -version = "0.6.1" +name = "idna" +version = "3.11" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, - { name = "aiohttp-retry" }, - { name = "pydantic" }, - { name = "python-dateutil" }, - { name = "typing-extensions" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/33/26/8b8efa4be21fc3ba12ade3b1353d87f9837ec0d3ec2607e8adbf85bc9c63/hindsight_client-0.6.1.tar.gz", hash = "sha256:314d0bb9e13622e15586ba1586a799726d405b27bc20d78872474b5d6d96cd51", size = 99833, upload-time = "2026-05-08T13:01:23.537Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/4f/a1d0bc33ef933ecc52e76dc1514163594d25836a5d303c256a61bb61445d/hindsight_client-0.6.1-py3-none-any.whl", hash = "sha256:9fdda176ab50f7cec8d7339c6608c148f0cd9ad7e65d9d76192f2db730bc330a", size = 249379, upload-time = "2026-05-08T13:01:22.035Z" }, + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, ] [[package]] -name = "honcho-ai" -version = "2.0.1" +name = "importlib-metadata" +version = "8.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "httpx" }, - { name = "pydantic" }, - { name = "typing-extensions", marker = "python_full_version < '3.12'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/93/30/d30ba159404050d53b4b1b1c4477f9591f43af18758be1fb7dab6afbfe7d/honcho_ai-2.0.1.tar.gz", hash = "sha256:6fdeebf9454e62bc523d57888e50359e67baafdb21f68621f9c14e08dc00623a", size = 46732, upload-time = "2026-02-09T21:03:26.99Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/de/83fda0c057cfa11d6b5ed532623184591aa7dcff4a067934ba6811026229/honcho_ai-2.0.1-py3-none-any.whl", hash = "sha256:94887e61d59f353e1e1e20b395858040780f5d67ca1e9d450538646544e4e42f", size = 56780, upload-time = "2026-02-09T21:03:25.992Z" }, + { name = "zipp" }, ] - -[[package]] -name = "hpack" -version = "4.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276, upload-time = "2025-01-22T21:44:58.347Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357, upload-time = "2025-01-22T21:44:56.92Z" }, + { url = "https://files.pythonhosted.org/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" }, ] [[package]] -name = "httpcore" -version = "1.0.9" +name = "iniconfig" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/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/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } wheels = [ - { url = "https://files.pythonhosted.org/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/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] [[package]] -name = "httplib2" -version = "0.31.2" +name = "jinja2" +version = "3.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyparsing" }, + { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c1/1f/e86365613582c027dda5ddb64e1010e57a3d53e99ab8a72093fa13d565ec/httplib2-0.31.2.tar.gz", hash = "sha256:385e0869d7397484f4eab426197a4c020b606edd43372492337c0b4010ae5d24", size = 250800, upload-time = "2026-01-23T11:04:44.165Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl", hash = "sha256:dbf0c2fa3862acf3c55c078ea9c0bc4481d7dc5117cae71be9514912cf9f8349", size = 91099, upload-time = "2026-01-23T11:04:42.78Z" }, + { url = "https://files.pythonhosted.org/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" }, ] [[package]] -name = "httptools" -version = "0.7.1" +name = "jiter" +version = "0.13.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" }, - { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" }, - { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" }, - { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" }, - { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" }, - { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" }, - { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" }, - { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" }, - { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" }, - { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" }, - { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" }, - { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" }, - { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" }, - { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" }, - { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, - { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, - { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, - { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, - { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, - { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, - { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" }, - { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" }, - { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" }, - { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" }, - { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" }, - { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" }, - { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" }, - { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } -wheels = [ - { url = "https://files.pythonhosted.org/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" }, -] - -[package.optional-dependencies] -socks = [ - { name = "socksio" }, -] - -[[package]] -name = "httpx-sse" -version = "0.4.3" -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, upload-time = "2025-10-10T21:48:22.271Z" } -wheels = [ - { url = "https://files.pythonhosted.org/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" }, -] - -[[package]] -name = "huggingface-hub" -version = "1.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, - { name = "httpx" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "shellingham" }, - { name = "tqdm" }, - { name = "typer-slim" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c4/fc/eb9bc06130e8bbda6a616e1b80a7aa127681c448d6b49806f61db2670b61/huggingface_hub-1.4.1.tar.gz", hash = "sha256:b41131ec35e631e7383ab26d6146b8d8972abc8b6309b963b306fbcca87f5ed5", size = 642156, upload-time = "2026-02-06T09:20:03.013Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/ae/2f6d96b4e6c5478d87d606a1934b5d436c4a2bce6bb7c6fdece891c128e3/huggingface_hub-1.4.1-py3-none-any.whl", hash = "sha256:9931d075fb7a79af5abc487106414ec5fba2c0ae86104c0c62fd6cae38873d18", size = 553326, upload-time = "2026-02-06T09:20:00.728Z" }, -] - -[[package]] -name = "hyperframe" -version = "6.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" }, -] - -[[package]] -name = "idna" -version = "3.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, -] - -[[package]] -name = "importlib-metadata" -version = "8.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } -wheels = [ - { url = "https://files.pythonhosted.org/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" }, -] - -[[package]] -name = "iniconfig" -version = "2.3.0" -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, upload-time = "2025-10-18T21:55:43.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/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" }, -] - -[[package]] -name = "jinja2" -version = "3.1.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } -wheels = [ - { url = "https://files.pythonhosted.org/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" }, -] - -[[package]] -name = "jiter" -version = "0.13.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/5e/4ec91646aee381d01cdb9974e30882c9cd3b8c5d1079d6b5ff4af522439a/jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4", size = 164847, upload-time = "2026-02-02T12:37:56.441Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/5e/4ec91646aee381d01cdb9974e30882c9cd3b8c5d1079d6b5ff4af522439a/jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4", size = 164847, upload-time = "2026-02-02T12:37:56.441Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/71/29/499f8c9eaa8a16751b1c0e45e6f5f1761d180da873d417996cc7bddc8eef/jiter-0.13.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ea026e70a9a28ebbdddcbcf0f1323128a8db66898a06eaad3a4e62d2f554d096", size = 311157, upload-time = "2026-02-02T12:35:37.758Z" }, { url = "https://files.pythonhosted.org/packages/50/f6/566364c777d2ab450b92100bea11333c64c38d32caf8dc378b48e5b20c46/jiter-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66aa3e663840152d18cc8ff1e4faad3dd181373491b9cfdc6004b92198d67911", size = 319729, upload-time = "2026-02-02T12:35:39.246Z" }, @@ -2248,6 +1951,303 @@ wheels = [ { url = "https://files.pythonhosted.org/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" }, ] +[[package]] +name = "kora" +version = "0.14.0" +source = { editable = "." } +dependencies = [ + { name = "croniter" }, + { name = "fire" }, + { name = "httpx", extra = ["socks"] }, + { name = "jinja2" }, + { name = "openai" }, + { name = "prompt-toolkit" }, + { name = "psutil" }, + { name = "pydantic" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "rich" }, + { name = "ruamel-yaml" }, + { name = "tenacity" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] + +[package.optional-dependencies] +acp = [ + { name = "agent-client-protocol" }, +] +all = [ + { name = "agent-client-protocol" }, + { name = "aiohttp" }, + { name = "debugpy" }, + { name = "fastapi" }, + { name = "google-api-python-client" }, + { name = "google-auth-httplib2" }, + { name = "google-auth-oauthlib" }, + { name = "mcp" }, + { name = "ptyprocess", marker = "sys_platform != 'win32'" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-split" }, + { name = "pytest-timeout" }, + { name = "pytest-xdist" }, + { name = "pywinpty", marker = "sys_platform == 'win32'" }, + { name = "ruff" }, + { name = "simple-term-menu" }, + { name = "ty" }, + { name = "uvicorn", extra = ["standard"] }, + { name = "youtube-transcript-api" }, +] +anthropic = [ + { name = "anthropic" }, +] +azure-identity = [ + { name = "azure-identity" }, +] +bedrock = [ + { name = "boto3" }, +] +cli = [ + { name = "simple-term-menu" }, +] +computer-use = [ + { name = "mcp" }, +] +daytona = [ + { name = "daytona" }, +] +dev = [ + { name = "debugpy" }, + { name = "mcp" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-split" }, + { name = "pytest-timeout" }, + { name = "pytest-xdist" }, + { name = "ruff" }, + { name = "ty" }, +] +dingtalk = [ + { name = "alibabacloud-dingtalk" }, + { name = "dingtalk-stream" }, + { name = "qrcode" }, +] +edge-tts = [ + { name = "edge-tts" }, +] +exa = [ + { name = "exa-py" }, +] +fal = [ + { name = "fal-client" }, +] +feishu = [ + { name = "lark-oapi" }, + { name = "qrcode" }, +] +firecrawl = [ + { name = "firecrawl-py" }, +] +google = [ + { name = "google-api-python-client" }, + { name = "google-auth-httplib2" }, + { name = "google-auth-oauthlib" }, +] +hindsight = [ + { name = "hindsight-client" }, +] +homeassistant = [ + { name = "aiohttp" }, +] +honcho = [ + { name = "honcho-ai" }, +] +matrix = [ + { name = "aiohttp-socks" }, + { name = "aiosqlite" }, + { name = "asyncpg" }, + { name = "markdown" }, + { name = "mautrix", extra = ["encryption"] }, +] +mcp = [ + { name = "mcp" }, +] +messaging = [ + { name = "aiohttp" }, + { name = "brotlicffi" }, + { name = "discord-py", extra = ["voice"] }, + { name = "python-telegram-bot", extra = ["webhooks"] }, + { name = "qrcode" }, + { name = "slack-bolt" }, + { name = "slack-sdk" }, +] +modal = [ + { name = "modal" }, +] +parallel-web = [ + { name = "parallel-web" }, +] +pty = [ + { name = "ptyprocess", marker = "sys_platform != 'win32'" }, + { name = "pywinpty", marker = "sys_platform == 'win32'" }, +] +slack = [ + { name = "aiohttp" }, + { name = "slack-bolt" }, + { name = "slack-sdk" }, +] +sms = [ + { name = "aiohttp" }, +] +termux = [ + { name = "agent-client-protocol" }, + { name = "honcho-ai" }, + { name = "mcp" }, + { name = "ptyprocess", marker = "sys_platform != 'win32'" }, + { name = "python-telegram-bot", extra = ["webhooks"] }, + { name = "pywinpty", marker = "sys_platform == 'win32'" }, + { name = "simple-term-menu" }, +] +termux-all = [ + { name = "agent-client-protocol" }, + { name = "aiohttp" }, + { name = "fastapi" }, + { name = "google-api-python-client" }, + { name = "google-auth-httplib2" }, + { name = "google-auth-oauthlib" }, + { name = "honcho-ai" }, + { name = "mcp" }, + { name = "ptyprocess", marker = "sys_platform != 'win32'" }, + { name = "python-telegram-bot", extra = ["webhooks"] }, + { name = "pywinpty", marker = "sys_platform == 'win32'" }, + { name = "simple-term-menu" }, + { name = "uvicorn", extra = ["standard"] }, +] +tts-premium = [ + { name = "elevenlabs" }, +] +vercel = [ + { name = "vercel" }, +] +voice = [ + { name = "faster-whisper" }, + { name = "numpy" }, + { name = "sounddevice" }, +] +web = [ + { name = "fastapi" }, + { name = "uvicorn", extra = ["standard"] }, +] +youtube = [ + { name = "youtube-transcript-api" }, +] + +[package.metadata] +requires-dist = [ + { name = "agent-client-protocol", marker = "extra == 'acp'", specifier = "==0.9.0" }, + { name = "aiohttp", marker = "extra == 'homeassistant'", specifier = "==3.13.3" }, + { name = "aiohttp", marker = "extra == 'messaging'", specifier = "==3.13.3" }, + { name = "aiohttp", marker = "extra == 'slack'", specifier = "==3.13.3" }, + { name = "aiohttp", marker = "extra == 'sms'", specifier = "==3.13.3" }, + { name = "aiohttp-socks", marker = "extra == 'matrix'", specifier = "==0.11.0" }, + { name = "aiosqlite", marker = "extra == 'matrix'", specifier = "==0.22.1" }, + { name = "alibabacloud-dingtalk", marker = "extra == 'dingtalk'", specifier = "==2.2.42" }, + { name = "anthropic", marker = "extra == 'anthropic'", specifier = "==0.86.0" }, + { name = "asyncpg", marker = "extra == 'matrix'", specifier = "==0.31.0" }, + { name = "azure-identity", marker = "extra == 'azure-identity'", specifier = "==1.25.3" }, + { name = "boto3", marker = "extra == 'bedrock'", specifier = "==1.42.89" }, + { name = "brotlicffi", marker = "extra == 'messaging'", specifier = "==1.2.0.1" }, + { name = "croniter", specifier = "==6.0.0" }, + { name = "daytona", marker = "extra == 'daytona'", specifier = "==0.155.0" }, + { name = "debugpy", marker = "extra == 'dev'", specifier = "==1.8.20" }, + { name = "dingtalk-stream", marker = "extra == 'dingtalk'", specifier = "==0.24.3" }, + { name = "discord-py", extras = ["voice"], marker = "extra == 'messaging'", specifier = "==2.7.1" }, + { name = "edge-tts", marker = "extra == 'edge-tts'", specifier = "==7.2.7" }, + { name = "elevenlabs", marker = "extra == 'tts-premium'", specifier = "==1.59.0" }, + { name = "exa-py", marker = "extra == 'exa'", specifier = "==2.10.2" }, + { name = "fal-client", marker = "extra == 'fal'", specifier = "==0.13.1" }, + { name = "fastapi", marker = "extra == 'web'", specifier = "==0.133.1" }, + { name = "faster-whisper", marker = "extra == 'voice'", specifier = "==1.2.1" }, + { name = "fire", specifier = "==0.7.1" }, + { name = "firecrawl-py", marker = "extra == 'firecrawl'", specifier = "==4.17.0" }, + { name = "google-api-python-client", marker = "extra == 'google'", specifier = "==2.194.0" }, + { name = "google-auth-httplib2", marker = "extra == 'google'", specifier = "==0.3.1" }, + { name = "google-auth-oauthlib", marker = "extra == 'google'", specifier = "==1.3.1" }, + { name = "hindsight-client", marker = "extra == 'hindsight'", specifier = "==0.6.1" }, + { name = "honcho-ai", marker = "extra == 'honcho'", specifier = "==2.0.1" }, + { name = "httpx", extras = ["socks"], specifier = "==0.28.1" }, + { name = "jinja2", specifier = "==3.1.6" }, + { name = "kora", extras = ["acp"], marker = "extra == 'all'" }, + { name = "kora", extras = ["acp"], marker = "extra == 'termux'" }, + { name = "kora", extras = ["cli"], marker = "extra == 'all'" }, + { name = "kora", extras = ["cli"], marker = "extra == 'termux'" }, + { name = "kora", extras = ["cron"], marker = "extra == 'all'" }, + { name = "kora", extras = ["cron"], marker = "extra == 'termux'" }, + { name = "kora", extras = ["dev"], marker = "extra == 'all'" }, + { name = "kora", extras = ["google"], marker = "extra == 'all'" }, + { name = "kora", extras = ["google"], marker = "extra == 'termux-all'" }, + { name = "kora", extras = ["homeassistant"], marker = "extra == 'all'" }, + { name = "kora", extras = ["homeassistant"], marker = "extra == 'termux-all'" }, + { name = "kora", extras = ["honcho"], marker = "extra == 'termux'" }, + { name = "kora", extras = ["mcp"], marker = "extra == 'all'" }, + { name = "kora", extras = ["mcp"], marker = "extra == 'termux'" }, + { name = "kora", extras = ["pty"], marker = "extra == 'all'" }, + { name = "kora", extras = ["pty"], marker = "extra == 'termux'" }, + { name = "kora", extras = ["sms"], marker = "extra == 'all'" }, + { name = "kora", extras = ["sms"], marker = "extra == 'termux-all'" }, + { name = "kora", extras = ["termux"], marker = "extra == 'termux-all'" }, + { name = "kora", extras = ["web"], marker = "extra == 'all'" }, + { name = "kora", extras = ["web"], marker = "extra == 'termux-all'" }, + { name = "kora", extras = ["youtube"], marker = "extra == 'all'" }, + { name = "lark-oapi", marker = "extra == 'feishu'", specifier = "==1.5.3" }, + { name = "markdown", marker = "extra == 'matrix'", specifier = "==3.10.2" }, + { name = "mautrix", extras = ["encryption"], marker = "extra == 'matrix'", specifier = "==0.21.0" }, + { name = "mcp", marker = "extra == 'computer-use'", specifier = "==1.26.0" }, + { name = "mcp", marker = "extra == 'dev'", specifier = "==1.26.0" }, + { name = "mcp", marker = "extra == 'mcp'", specifier = "==1.26.0" }, + { name = "modal", marker = "extra == 'modal'", specifier = "==1.3.4" }, + { name = "numpy", marker = "extra == 'voice'", specifier = "==2.4.3" }, + { name = "openai", specifier = "==2.24.0" }, + { name = "parallel-web", marker = "extra == 'parallel-web'", specifier = "==0.4.2" }, + { name = "prompt-toolkit", specifier = "==3.0.52" }, + { name = "psutil", specifier = "==7.2.2" }, + { name = "ptyprocess", marker = "sys_platform != 'win32' and extra == 'pty'", specifier = "==0.7.0" }, + { name = "pydantic", specifier = "==2.12.5" }, + { name = "pyjwt", extras = ["crypto"], specifier = "==2.12.1" }, + { name = "pytest", marker = "extra == 'dev'", specifier = "==9.0.2" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = "==1.3.0" }, + { name = "pytest-split", marker = "extra == 'dev'", specifier = "==0.11.0" }, + { name = "pytest-timeout", marker = "extra == 'dev'", specifier = "==2.4.0" }, + { name = "pytest-xdist", marker = "extra == 'dev'", specifier = "==3.8.0" }, + { name = "python-dotenv", specifier = "==1.2.2" }, + { name = "python-telegram-bot", extras = ["webhooks"], marker = "extra == 'messaging'", specifier = "==22.6" }, + { name = "python-telegram-bot", extras = ["webhooks"], marker = "extra == 'termux'", specifier = "==22.6" }, + { name = "pywinpty", marker = "sys_platform == 'win32' and extra == 'pty'", specifier = "==2.0.15" }, + { name = "pyyaml", specifier = "==6.0.3" }, + { name = "qrcode", marker = "extra == 'dingtalk'", specifier = "==7.4.2" }, + { name = "qrcode", marker = "extra == 'feishu'", specifier = "==7.4.2" }, + { name = "qrcode", marker = "extra == 'messaging'", specifier = "==7.4.2" }, + { name = "requests", specifier = "==2.33.0" }, + { name = "rich", specifier = "==14.3.3" }, + { name = "ruamel-yaml", specifier = "==0.18.17" }, + { name = "ruff", marker = "extra == 'dev'", specifier = "==0.15.10" }, + { name = "simple-term-menu", marker = "extra == 'cli'", specifier = "==1.6.6" }, + { name = "slack-bolt", marker = "extra == 'messaging'", specifier = "==1.27.0" }, + { name = "slack-bolt", marker = "extra == 'slack'", specifier = "==1.27.0" }, + { name = "slack-sdk", marker = "extra == 'messaging'", specifier = "==3.40.1" }, + { name = "slack-sdk", marker = "extra == 'slack'", specifier = "==3.40.1" }, + { name = "sounddevice", marker = "extra == 'voice'", specifier = "==0.5.5" }, + { name = "tenacity", specifier = "==9.1.4" }, + { name = "ty", marker = "extra == 'dev'", specifier = "==0.0.21" }, + { name = "tzdata", marker = "sys_platform == 'win32'", specifier = "==2025.3" }, + { name = "uvicorn", extras = ["standard"], marker = "extra == 'web'", specifier = "==0.41.0" }, + { name = "vercel", marker = "extra == 'vercel'", specifier = "==0.5.7" }, + { name = "youtube-transcript-api", marker = "extra == 'youtube'", specifier = "==1.2.4" }, +] +provides-extras = ["anthropic", "exa", "firecrawl", "parallel-web", "fal", "edge-tts", "modal", "daytona", "vercel", "hindsight", "dev", "messaging", "cron", "slack", "matrix", "cli", "tts-premium", "voice", "pty", "honcho", "mcp", "homeassistant", "sms", "computer-use", "acp", "bedrock", "azure-identity", "termux", "termux-all", "dingtalk", "feishu", "google", "youtube", "web", "all"] + [[package]] name = "lark-oapi" version = "1.5.3"
A real terminal interfaceFull TUI with multiline editing, slash-command autocomplete, conversation history, interrupt-and-redirect, and streaming tool output.