Wenchao An 0b3dadbc9b
feat(subagents): add acceptance checks to durable batch items (#5289)
* feat(subagents): check and persist durable batch acceptance

Carry optional per-item criteria into native subagents, reuse the deterministic checker, and expose separate verdicts through item queries and exports. Preserve execution and retry semantics, renew leases during checks, and migrate existing batch rows with nullable acceptance fields.

* fix(subagents): align batch acceptance normalization and sandbox admission

* test(auth): include project permissions in the full-stack contract
2026-09-09 08:45:20 +08:00

56 lines
1.4 KiB
Python

"""Process-local bridge from harness tools to the Gateway batch service."""
from __future__ import annotations
import threading
from dataclasses import dataclass
from typing import Any, NotRequired, Protocol, TypedDict
class BatchItemInput(TypedDict):
key: str
prompt: str
acceptance_criteria: NotRequired[list[str] | None]
@dataclass(frozen=True)
class BatchSubmitRequest:
user_id: str
thread_id: str
run_id: str | None
tool_call_id: str
submission_key: str
title: str
subagent_type: str
items: list[BatchItemInput]
max_live_items: int | None
max_running_items: int | None
execution_spec: dict[str, Any]
class SubagentBatchSubmitter(Protocol):
async def submit(self, request: BatchSubmitRequest) -> dict[str, Any]: ...
async def get_batch(self, *, batch_id: str, user_id: str) -> dict[str, Any] | None: ...
async def cancel_batch(self, *, batch_id: str, user_id: str) -> dict[str, Any] | None: ...
_submitter: SubagentBatchSubmitter | None = None
_lock = threading.Lock()
def set_subagent_batch_submitter(submitter: SubagentBatchSubmitter | None) -> None:
global _submitter
with _lock:
_submitter = submitter
def get_subagent_batch_submitter() -> SubagentBatchSubmitter | None:
with _lock:
return _submitter
def is_subagent_batch_runtime_available() -> bool:
return get_subagent_batch_submitter() is not None