@suluk/core - v0.1.13
    Preparing search index...

    Interface SulukAgent

    A composition agent (C027) — an LLM-orchestrated unit. The map KEY is its stable wire-level identity (the emitted MCP-tool / OpenRouter-function id; C009 by-name, never by index). It carries NO Request/Response and is NEVER consulted by the request→operation matcher (D1). description is required + routing-oriented (the field the serving LLM selects on). routes are deterministic (a by-name operationRef into an existing operation, NO model); skills are LLM (a model is present). agents are by-name sub-agent refs; maxDepth is REQUIRED whenever agents is non-empty (a typed LEAF = maxDepth 0, agents {}), and a cycle-linter rejects name-cycles at author/install time (JSON-Schema cannot express acyclicity). A child's effective scope is INTERSECTION(child, caller), never union. Determinism is DECLARED, never schema-enforced.

    interface SulukAgent {
        description: string;
        scope?: string[];
        skills?: Record<string, SulukSkillRef>;
        routes?: Record<string, SulukRouteRef>;
        agents?: Record<string, SulukAgentRef>;
        resources?: Record<string, SulukResourceRef>;
        maxDepth?: number;
        trustBoundary?: "untrusted";
        contextBudget?: { tokens: number; basis: "estimate" };
        thinking?: {
            maxRounds: number;
            budget?: { tokens: number; basis: "estimate" };
        };
        [ext: `x-${string}`]: unknown;
    }

    Indexable

    • [ext: `x-${string}`]: unknown

      any other vendor facet — notably x-suluk-cost (an agent/skill boundary's declared cost; PROVISIONAL per C026).

    Index

    Properties

    description: string

    required, routing-oriented — the field the serving LLM selects on (a lint rejects empty/one-word).

    scope?: string[]

    static resource:action authz; the agent's complete reachable surface is statically enumerable from the document.

    skills?: Record<string, SulukSkillRef>

    instruction bundles; PRESENCE of model is the hard static skill(LLM)-vs-route(deterministic) discriminator.

    routes?: Record<string, SulukRouteRef>

    deterministic routes: by-name $refs into EXISTING operations; NO model field, ever.

    agents?: Record<string, SulukAgentRef>

    by-name sub-agent refs (never inline — inlining would fork C009 identity).

    resources?: Record<string, SulukResourceRef>

    by-name refs into the top-level x-suluk-resources catalog (C036) — the loadable, on-demand instructions/references/scripts this agent can ACTIVATE (CF "Agent Skills" alignment; lazy + advisory; resolved at projection, never by the matcher).

    maxDepth?: number

    REQUIRED when agents is non-empty (a lint, not the schema): the recursion depth ceiling; a leaf is 0.

    trustBoundary?: "untrusted"

    marks a tier whose retrieved / lower-tier content may NOT escalate scope or upgrade a figure's provenance.

    contextBudget?: { tokens: number; basis: "estimate" }

    advisory per-tier context budget (basis: estimate); fail-loud, never silent-zero.

    thinking?: { maxRounds: number; budget?: { tokens: number; basis: "estimate" } }

    THINKING ENVELOPE (C029) — a static cap on WITHIN-agent iteration (reason→tool→reason in the SAME completion, context accreting), orthogonal to maxDepth (which bounds cross-agent nesting depth, a fresh context per hop). maxRounds is REQUIRED when thinking is present. DECLARED-not-enforced: it bounds re-entries and is consumed by the context analyzer (round-accretion) + the linter; it NEVER enforces termination, and is NEVER read by the matcher. The loop TRAJECTORY (when/why each round stops) stays runtime-opaque (matching Strands / the Claude Agent SDK / OpenAI Agents). There is deliberately NO stopCondition vocabulary — that would model runtime control flow a generator could only echo. Absent ⇒ opaque single pass (zero-migration default). Conin's 6-round loop.