Budget Intelligence & TUI — programmatic spend data, live dashboard, mission cost tracking #5

Merged
vigilio merged 3 commits from budget-intel into main 2026-04-08 09:12:08 +00:00

3 commits

Author SHA1 Message Date
35d8cb5de6
feat: tui.js — live ANSI terminal dashboard (B.A. objective)
Implements token-monitor#3 objective 3:

node tui.js starts a live terminal dashboard:
  - Full layout: Anthropic Teams (severity-colored) + xAI section
  - 60s auto-refresh with 1s countdown
  - Flicker-free via cursor-home (not clear-screen)
  - [r] forces immediate refresh
  - [q] or Ctrl-C exits cleanly, restores terminal + cursor
  - Severity coloring: green=ok, yellow=warning, red=critical/maxed
  - xAI section hidden when XAI_MANAGEMENT_KEY not set (graceful degradation)
  - Budget decision: recommended provider + avoid list prominently displayed
  - Alerts section (up to 3, warning/critical only)
  - No external npm dependencies — pure Node stdlib + project analyze.js

Data source: spawns analyze.js --budget-json internally (reuses cached probe
data if fresh, avoids double-probe on each TUI refresh)

Co-authored-by: Hannibal Smith <hannibal@a-team>
2026-04-08 08:29:40 +00:00
8daa396549
feat: --budget-json and --mission cost tracking (Face + Murdock objectives)
Implements token-monitor#3 objectives 1 and 2:

--budget-json: structured agent-consumable budget decision schema
  - budget_decision with recommended_provider, avoid list, reason
  - providers: all Teams with utilization, USD estimates, severity
  - xai: per-key spend breakdown from management API (if XAI_MANAGEMENT_KEY set)
  - alerts: warnings/critical for maxed providers + low xAI prepaid balance
  - config from ~/.config/token-monitor/config.json (default .50/week/seat)

--mission <ref>: mission cost attribution via Forgejo issue time windows
  - resolves start/end timestamps from Forgejo issue comments
  - requires FORGEJO_TOKEN env var + ~/.config/token-monitor/mission-repos.json
  - repo mapping: { 'bookmarko': 'trentuna/bookmarko', ... }

--mission-window <iso-start> <iso-end>: same without Forgejo dep

Both: utilization delta × weekly seat cost = estimated Anthropic spend
Both: exact xAI spend via management API for time window (if key set)
Existing --json flag unchanged (backward compat preserved)

Co-authored-by: Hannibal Smith <hannibal@a-team>
2026-04-08 08:28:18 +00:00
ab9c60b67c
Handle policy_rejected status (Anthropic April 4 billing change)
- anthropic-teams.js: detect HTTP 400 extra-usage policy blocks, return
  status='policy_rejected' with quota headers still readable
- report.js: display policy_rejected as CRITICAL with 'POLICY BLOCKED' label
- getSeverity: treat policy_rejected as critical

Currently the direct API (used by monitor) returns 200; pi's OAuth path
returns 400. This fix future-proofs against the block extending to direct
API calls, and correctly classifies the status if it does.

Refs: trentuna/commons#17, trentuna/token-monitor#4
2026-04-08 05:38:46 +00:00