feat(injects,conversations,scheduler,gateway_tools,api): wake priority, master and parent aliases, scheduled injects start a turn

This commit is contained in:
hh
2026-08-30 20:34:12 +02:00
parent 878f7d6473
commit 3406e2e178
11 changed files with 215 additions and 47 deletions
+16 -8
View File
@@ -31,6 +31,7 @@ from sqlmodel import col, select
from beaver_gateway.core import audit
from beaver_gateway.core.auth import VALID_SCOPES, hash_token
from beaver_gateway.core.conversations import SEEDS, implied_title
from beaver_gateway.core.injects import URGENCY
from beaver_gateway.core.kinds import Kind, as_kind
from beaver_gateway.frontends._auth import require_token
from beaver_gateway.frontends._sse import (
@@ -145,7 +146,7 @@ def build_app(runtime: GatewayRuntime, *, memory_root: Path | None = None) -> Fa
return data
async def conv_of(public_id: str) -> Conversation:
conv = await conversations.get(public_id)
conv = await conversations.resolve(public_id)
if conv is None:
raise HTTPException(
status.HTTP_404_NOT_FOUND, f"unknown conversation {public_id}"
@@ -158,6 +159,14 @@ def build_app(runtime: GatewayRuntime, *, memory_root: Path | None = None) -> Fa
raise HTTPException(status.HTTP_400_BAD_REQUEST, f"missing `{key}`")
return text
def urgency_of(data: dict[str, Any], default: str) -> Any:
urgency = str(data.get("urgency") or default)
if urgency not in URGENCY:
raise HTTPException(
status.HTTP_400_BAD_REQUEST, f"urgency must be one of {URGENCY}"
)
return urgency
def int_or_none(data: dict[str, Any], key: str) -> int | None:
value = data.get(key)
if value is None:
@@ -343,15 +352,11 @@ def build_app(runtime: GatewayRuntime, *, memory_root: Path | None = None) -> Fa
token = await require_token(request, runtime, scope=SCOPE)
conv = await conv_of(public_id)
data = await body_of(request)
urgency = str(data.get("urgency") or "normal")
if urgency not in ("normal", "urgent"):
raise HTTPException(
status.HTTP_400_BAD_REQUEST, "urgency must be normal|urgent"
)
urgency = urgency_of(data, "normal")
item = await conversations.inject(
conv,
text_of(data),
urgency=cast("Any", urgency),
urgency=urgency,
origin=str(data.get("origin") or "api"),
)
await audit.log(
@@ -599,7 +604,10 @@ def build_app(runtime: GatewayRuntime, *, memory_root: Path | None = None) -> Fa
data = await body_of(request)
try:
job_id, when = await conversations.schedule(
conv, text_of(data, "at"), text_of(data, "text")
conv,
text_of(data, "at"),
text_of(data, "text"),
urgency=urgency_of(data, "wake"),
)
except (RuntimeError, ValueError) as exc:
raise HTTPException(status.HTTP_400_BAD_REQUEST, str(exc)) from exc