Metadata-Version: 2.4
Name: tartarus-console
Version: 0.2.1
Summary: TartarusAI — Uncensored AI for builders. Developer-first console powered by your TartarusAI account, with built-in usage tracking and quota enforcement.
Author: TartarusAI
License: MIT
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: openai<3,>=2.21.0
Requires-Dist: anthropic<1,>=0.39.0
Requires-Dist: python-dotenv<2,>=1.2.1
Requires-Dist: fire<1,>=0.7.1
Requires-Dist: httpx[socks]<1,>=0.28.1
Requires-Dist: rich<15,>=14.3.3
Requires-Dist: tenacity<10,>=9.1.4
Requires-Dist: pyyaml<7,>=6.0.2
Requires-Dist: requests<3,>=2.33.0
Requires-Dist: jinja2<4,>=3.1.5
Requires-Dist: pydantic<3,>=2.12.5
Requires-Dist: prompt_toolkit<4,>=3.0.52
Requires-Dist: exa-py<3,>=2.9.0
Requires-Dist: firecrawl-py<5,>=4.16.0
Requires-Dist: parallel-web<1,>=0.4.2
Requires-Dist: fal-client<1,>=0.13.1
Requires-Dist: croniter<7,>=6.0.0
Requires-Dist: edge-tts<8,>=7.2.7
Requires-Dist: PyJWT[crypto]<3,>=2.12.0
Provides-Extra: modal
Requires-Dist: modal<2,>=1.0.0; extra == "modal"
Provides-Extra: daytona
Requires-Dist: daytona<1,>=0.148.0; extra == "daytona"
Provides-Extra: vercel
Requires-Dist: vercel<0.6.0,>=0.5.7; extra == "vercel"
Provides-Extra: dev
Requires-Dist: debugpy<2,>=1.8.0; extra == "dev"
Requires-Dist: pytest<10,>=9.0.2; extra == "dev"
Requires-Dist: pytest-asyncio<2,>=1.3.0; extra == "dev"
Requires-Dist: pytest-xdist<4,>=3.0; extra == "dev"
Requires-Dist: mcp<2,>=1.2.0; extra == "dev"
Requires-Dist: ty<0.0.22,>=0.0.1a29; extra == "dev"
Requires-Dist: ruff; extra == "dev"
Provides-Extra: messaging
Requires-Dist: python-telegram-bot[webhooks]<23,>=22.6; extra == "messaging"
Requires-Dist: discord.py[voice]<3,>=2.7.1; extra == "messaging"
Requires-Dist: aiohttp<4,>=3.13.3; extra == "messaging"
Requires-Dist: slack-bolt<2,>=1.18.0; extra == "messaging"
Requires-Dist: slack-sdk<4,>=3.27.0; extra == "messaging"
Requires-Dist: qrcode<8,>=7.0; extra == "messaging"
Provides-Extra: cron
Provides-Extra: slack
Requires-Dist: slack-bolt<2,>=1.18.0; extra == "slack"
Requires-Dist: slack-sdk<4,>=3.27.0; extra == "slack"
Provides-Extra: matrix
Requires-Dist: mautrix[encryption]<1,>=0.20; extra == "matrix"
Requires-Dist: Markdown<4,>=3.6; extra == "matrix"
Requires-Dist: aiosqlite>=0.20; extra == "matrix"
Requires-Dist: asyncpg>=0.29; extra == "matrix"
Requires-Dist: aiohttp-socks<1,>=0.10; extra == "matrix"
Provides-Extra: cli
Requires-Dist: simple-term-menu<2,>=1.0; extra == "cli"
Provides-Extra: tts-premium
Requires-Dist: elevenlabs<2,>=1.0; extra == "tts-premium"
Provides-Extra: voice
Requires-Dist: faster-whisper<2,>=1.0.0; extra == "voice"
Requires-Dist: sounddevice<1,>=0.4.6; extra == "voice"
Requires-Dist: numpy<3,>=1.24.0; extra == "voice"
Provides-Extra: pty
Requires-Dist: ptyprocess<1,>=0.7.0; sys_platform != "win32" and extra == "pty"
Requires-Dist: pywinpty<3,>=2.0.0; sys_platform == "win32" and extra == "pty"
Provides-Extra: honcho
Requires-Dist: honcho-ai<3,>=2.0.1; extra == "honcho"
Provides-Extra: mcp
Requires-Dist: mcp<2,>=1.2.0; extra == "mcp"
Provides-Extra: homeassistant
Requires-Dist: aiohttp<4,>=3.9.0; extra == "homeassistant"
Provides-Extra: sms
Requires-Dist: aiohttp<4,>=3.9.0; extra == "sms"
Provides-Extra: acp
Requires-Dist: agent-client-protocol<1.0,>=0.9.0; extra == "acp"
Provides-Extra: mistral
Requires-Dist: mistralai<3,>=2.3.0; extra == "mistral"
Provides-Extra: bedrock
Requires-Dist: boto3<2,>=1.35.0; extra == "bedrock"
Provides-Extra: termux
Requires-Dist: python-telegram-bot[webhooks]<23,>=22.6; extra == "termux"
Requires-Dist: hermes-agent[cron]; extra == "termux"
Requires-Dist: hermes-agent[cli]; extra == "termux"
Requires-Dist: hermes-agent[pty]; extra == "termux"
Requires-Dist: hermes-agent[mcp]; extra == "termux"
Requires-Dist: hermes-agent[honcho]; extra == "termux"
Requires-Dist: hermes-agent[acp]; extra == "termux"
Provides-Extra: dingtalk
Requires-Dist: dingtalk-stream<1,>=0.20; extra == "dingtalk"
Requires-Dist: alibabacloud-dingtalk>=2.0.0; extra == "dingtalk"
Requires-Dist: qrcode<8,>=7.0; extra == "dingtalk"
Provides-Extra: feishu
Requires-Dist: lark-oapi<2,>=1.5.3; extra == "feishu"
Requires-Dist: qrcode<8,>=7.0; extra == "feishu"
Provides-Extra: google
Requires-Dist: google-api-python-client<3,>=2.100; extra == "google"
Requires-Dist: google-auth-oauthlib<2,>=1.0; extra == "google"
Requires-Dist: google-auth-httplib2<1,>=0.2; extra == "google"
Provides-Extra: web
Requires-Dist: fastapi<1,>=0.104.0; extra == "web"
Requires-Dist: uvicorn[standard]<1,>=0.24.0; extra == "web"
Dynamic: license-file

# TartarusAI

> **Uncensored AI for builders.**
>
> A developer-first AI console powered by your [TartarusAI](https://tartarusai.dev) account.

The CLI ships every chat through `api.tartarusai.dev`: the backend
authenticates your token, checks your plan quota, forwards the request
to the inference cluster, and writes a `UsageEvent` for every reply.
Result — every token you spend on the CLI counts against your plan and
shows up in your dashboard's Usage panel. There is no client-side path
that bypasses this.

## Install

**One-click (recommended):**

- Windows: download [tartarus-setup.bat](https://dash.tartarusai.dev/tartarus-setup.bat), double-click.
- macOS / Linux: `curl -sSf https://dash.tartarusai.dev/tartarus-setup.sh | bash`

**Manual:**

```bash
pip install tartarus-console
```

Python 3.10+. On Windows, install [Git for Windows](https://git-scm.com/download/win) first — the CLI uses Git Bash for the terminal tool.

The package registers a single console script: `tartarus`.

## Authenticate

You need a TartarusAI account. Sign up / log in at
<https://dash.tartarusai.dev>.

1. Open <https://dash.tartarusai.dev/account>.
2. Under **CLI access**, click **Generate token**, copy the value (you
   only see it once).
3. In your terminal:

   ```bash
   tartarus auth set <PASTED_TOKEN>
   ```

   The CLI stores the token at `~/.tartarus/auth.json` (mode `0600`),
   verifies it against `/api/auth/me`, and prints your plan. If the
   token is invalid the local file is wiped and an error points back
   at the dashboard.

Sanity checks:

```bash
tartarus whoami      # email + plan + endpoint
tartarus usage       # current weekly + session token usage
```

## Use

```bash
tartarus chat                       # interactive console, defaults to tartarus-coder
tartarus chat -z "Explain this codebase"   # one-shot mode
tartarus chat -m tartarus-thinking  # the other tracked model
```

That's it. No other chat invocation is supported. Specifically:

* `--provider X` is **rejected** — the CLI is locked to the TartarusAI
  backend (refusing this prevents inference traffic from leaking around
  the metering middleware).
* `-m MODEL` only accepts `tartarus-coder` or `tartarus-thinking` — anything
  else would be 400'd at the backend anyway, and we surface it early.

Every turn:
1. The console sends an OpenAI-spec request to
   `https://api.tartarusai.dev/api/v1/chat/completions` with your
   Sanctum CLI bearer.
2. The Laravel backend runs `auth:sanctum`, `throttle:60,1` (rate limit
   per user), and the `quota` middleware (weekly token cap).
3. The backend forwards to the inference cluster, captures the `usage`
   block from the response, and writes a `UsageEvent` with `source: cli`.
4. Your weekly bar moves under
   <https://dash.tartarusai.dev/settings/usage>.

If the upstream omits a usage block the backend refuses to relay the
response. There is no path that returns inference content without
accounting.

## Revoke / rotate

* **From the dashboard** — Account → CLI access → revoke on the token
  row. Effective immediately.
* **From the CLI** — `tartarus logout` revokes the token currently in
  use and deletes the local credentials file.

Generate a fresh token whenever you suspect a leak. Other CLI tokens
on your account are untouched.

## Layout

* `tartarus_console/` — TartarusAI dispatcher (auth, config bootstrap,
  CLI commands). Locks the chat path to api.tartarusai.dev.
* The agent runtime under `agent/`, `tools/`, `skills/`, `providers/`,
  `plugins/`, and `hermes_cli/` is vendored from the upstream Hermes
  Agent project (MIT, Nous Research) — kept unmodified except where
  branding or security wiring required edits. End-users only see the
  TartarusAI brand; the upstream module names appear only in import
  statements and internal docstrings.
* See `README.upstream.md` for the original upstream documentation.

## Licence

MIT, inheriting the upstream Hermes Agent licence (see `LICENSE`).
TartarusAI adapter code (`tartarus_console/`) is also MIT-licensed.
