Files
tatlock/src/agents/librarian/capability.py
T
jpmschweitzerandClaude 78066fab1b style: apply ruff's automatic fixes and formatter
Mechanical only, and separated from the judgment calls that follow so the
reviewable changes are not buried in a 98-file whitespace diff.

227 automatic fixes: 60 blank lines carrying whitespace, 60 unsorted import
blocks, 34 Optional[X] to X | None, 28 unused imports, 16 deprecated typing
imports, 12 datetime.timezone.utc to datetime.UTC, and assorted smaller
modernisations. Then `ruff format` over src and tests: 98 files reformatted,
35 already conforming.

No file among the unused-import findings defines __all__ or is an __init__.py,
so nothing here removes a re-export.

`make test`: 658 passed, unchanged from HEAD.

Two things observed while verifying, neither addressed here:

`pytest tests/` cannot collect — tests/e2e/test_orchestration_e2e.py uses an
`e2e` marker that is not registered, and the config is strict about markers.
This fails identically at HEAD, so it predates this change; `make test` passes
because it ignores tests/e2e, tests/integration and tests/contracts.

test_tatlock_tool_call_logging_calculator is flaky. It failed once in a full run
with these changes and passed on the next, passes in isolation with them, and
fails in isolation at HEAD. It is order- or timing-dependent, not a regression
from this commit — established by running the full suite both ways rather than
by reasoning about which change could have caused it.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-11 17:25:18 +02:00

92 lines
2.6 KiB
Python

"""
Librarian capability registration for the Household Registry.
Defines The Librarian's capabilities and registers it as a
household member for coordination by the Steward and Tatlock.
"""
from src.agents.librarian.agent import get_librarian_agent
from src.agents.librarian.tools import LIBRARIAN_TOOLS
from src.core.household_registry import (
HouseholdCapability,
get_household_registry,
)
from src.core.logging_config import get_logger
logger = get_logger(__name__)
# The Librarian's capability summary for Steward coordination
LIBRARIAN_CAPABILITY = HouseholdCapability(
name="librarian",
role="The Librarian",
category="research",
description=(
"Research, web search, and wiki management: can SEARCH the web for current "
"information, READ URLs/articles, CREATE wiki pages about topics "
"(with automatic HybridRAG research), UPDATE existing pages, "
"and synthesize information from multiple sources. "
"Use for: 'search for X', 'what is X', 'create a page about X', 'read this URL'"
),
domains=[
"research",
"knowledge",
"information",
"wiki",
"documents",
"search",
"web",
"url",
"internet",
"synthesis",
"create",
"write",
"update",
],
cost="medium", # Multiple API calls to library-desk
requires_network=True, # Needs library-desk API access
)
def get_librarian_capability() -> HouseholdCapability:
"""Get The Librarian's capability definition."""
return LIBRARIAN_CAPABILITY
def register_librarian() -> None:
"""
Register The Librarian with the Household Registry.
This makes The Librarian available for:
- Steward recommendations (via capability summary)
- Tatlock delegation (via agent reference)
- Tool scoping (via tool list)
"""
registry = get_household_registry()
# Check if already registered
if "librarian" in registry:
logger.debug("librarian_already_registered")
return
registry.register(
name="librarian",
capability=LIBRARIAN_CAPABILITY,
tools=LIBRARIAN_TOOLS,
agent=get_librarian_agent(),
)
logger.info(
"librarian_registered",
role=LIBRARIAN_CAPABILITY.role,
domains=LIBRARIAN_CAPABILITY.domains,
tool_count=len(LIBRARIAN_TOOLS),
)
def unregister_librarian() -> None:
"""Unregister The Librarian from the Household Registry."""
registry = get_household_registry()
registry.unregister("librarian")
logger.info("librarian_unregistered")