The input to agent() — AgentSpec minus the internal _specType, with the
tools list constrained by the declared purity and the tool vocabulary V.
P is inferred from the literal purity field (const inference), and
tools is then typed AllowedAt<P, V>[]:
purity: "pure" → tools may list only V["readOnly"] tools.
purity: "bounded"→ tools may list V["bounded"] tools (admits Bash).
no purity / "dangerously-unrestricted" → tools is string[] (open).
With the open default vocabulary (core agent()) every level widens to
string, so any tools compile — backwards-compatible.
The input to
agent()—AgentSpecminus the internal_specType, with thetoolslist constrained by the declaredpurityand the tool vocabularyV.Pis inferred from the literalpurityfield (constinference), andtoolsis then typedAllowedAt<P, V>[]:purity: "pure"→toolsmay list onlyV["readOnly"]tools.purity: "bounded"→toolsmay listV["bounded"]tools (admitsBash).purity/"dangerously-unrestricted"→toolsisstring[](open).With the open default vocabulary (core
agent()) every level widens tostring, so any tools compile — backwards-compatible.