feat: deep-agent canvas, live observability, and multi-environment tooling

Self-hosted platform for building, testing, and shipping LangChain/LangGraph agents. Deep-agent sub-agents on the canvas, a live tracing/observability timeline, auto-provisioned built-in tools with import/export, per-environment tool variables, streamed evaluations, and per-user auth token forwarding.
This commit is contained in:
nihalashetty
2026-07-28 01:49:19 +05:30
commit ae67bff5a3
350 changed files with 58244 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
"""Rate limiter + idempotency cache unit tests."""
from __future__ import annotations
from forge.util.ratelimit import IdempotencyCache, RateLimiter
def test_token_bucket_blocks_after_burst():
rl = RateLimiter()
# rate=5/min, burst=5 → first 5 allowed, 6th blocked
allowed = [rl.allow("k", rate=5, per=60, burst=5) for _ in range(6)]
assert allowed == [True, True, True, True, True, False]
def test_zero_rate_is_unlimited():
rl = RateLimiter()
assert all(rl.allow("k", rate=0) for _ in range(100))
def test_keys_are_independent():
rl = RateLimiter()
assert rl.allow("a", rate=1, burst=1) is True
assert rl.allow("a", rate=1, burst=1) is False
assert rl.allow("b", rate=1, burst=1) is True # different key unaffected
def test_idempotency_returns_stored_value():
cache = IdempotencyCache(ttl_seconds=60)
assert cache.get("x") is None
cache.put("x", {"run_id": "r1"})
assert cache.get("x") == {"run_id": "r1"}
def test_idempotency_expires():
cache = IdempotencyCache(ttl_seconds=-1) # already expired
cache.put("x", 1)
assert cache.get("x") is None