ArmorIQ LogoArmorIQ SDK

delegate()

Delegate authority to another agent with restricted permissions.

Delegate authority to another agent using cryptographic token delegation. This allows an agent to grant temporary, restricted access to a sub-agent for executing specific subtasks.

client.delegate(
    intent_token: IntentToken,
    delegate_public_key: str,
    validity_seconds: int = 3600,
    allowed_actions: list = None,
    subtask: dict = None
) -> DelegationResult
await client.delegate(
  intentToken: IntentToken,
  delegatePublicKey: string,
  validitySeconds?: number,  // default: 3600
  allowedActions?: string[],
  targetAgent?: string,
  subtask?: Record<string, any>
): Promise<DelegationResult>

Parameters

ParameterTypeRequiredDefaultDescription
intent_tokenIntentTokenYes-Parent agent's intent token to delegate
delegate_public_keystrYes-Ed25519 public key of delegate agent (hex format)
validity_secondsintNo3600Delegation token validity in seconds
allowed_actionslistNoNoneList of allowed actions (defaults to all from parent token)
subtaskdictNoNoneOptional subtask plan structure

Returns

{
    "delegation_id": str,           # Unique delegation identifier
    "delegated_token": IntentToken, # New token for delegate agent
    "delegate_public_key": str,     # Public key of delegate
    "expires_at": float,            # Unix timestamp of expiration
    "trust_delta": dict,            # Trust update applied
    "status": str                   # Delegation status
}
interface DelegationResult {
  delegationId: string;             // Unique delegation identifier
  delegatedToken: IntentToken;      // New token for delegate agent
  delegatePublicKey: string;        // Public key of delegate
  targetAgent?: string;             // Optional target agent identifier
  expiresAt: number;                // Unix timestamp of expiration
  trustDelta: Record<string, any>;  // Trust update applied
  status: string;                   // Delegation status
  metadata: Record<string, any>;    // Extra metadata
}

Raises

  • DelegationException: If delegation creation fails
  • InvalidTokenException: If parent token is invalid or expired
  • AuthenticationError: If IAP endpoint is unreachable

Flow

  1. Parent agent creates main plan and gets token
  2. Parent calls delegate() with delegate's public key
  3. SDK → CSRG-IAP POST /delegation/create
  4. IAP creates new token with:
    • Restricted permissions (if allowed_actions specified)
    • Delegate's public key bound cryptographically
    • Shorter validity period
  5. Delegated token returned to parent
  6. Parent sends delegated token to sub-agent
  7. Sub-agent uses delegated token for authorized actions only

Example

Basic Delegation

from cryptography.hazmat.primitives.asymmetric import ed25519
from cryptography.hazmat.primitives import serialization

# Generate keypair for delegate agent
delegate_private_key = ed25519.Ed25519PrivateKey.generate()
delegate_public_key = delegate_private_key.public_key()

# Convert public key to hex format
pub_key_bytes = delegate_public_key.public_bytes(
    encoding=serialization.Encoding.Raw,
    format=serialization.PublicFormat.Raw
)
pub_key_hex = pub_key_bytes.hex()

# Delegate authority
delegation_result = client.delegate(
    intent_token=parent_token,
    delegate_public_key=pub_key_hex,
    validity_seconds=1800,  # 30 minutes
    allowed_actions=["book_venue", "arrange_catering"]
)

print(f"✅ Delegation created: {delegation_result.delegation_id}")
print(f"Delegated token: {delegation_result.delegated_token.token_id}")

# Send delegated token to sub-agent
sub_agent_client.invoke(
    "events-mcp",
    "book_venue",
    delegation_result.delegated_token,
    {"venue_id": "v123", "date": "2026-04-15"}
)
import * as crypto from 'crypto';
import { ArmorIQClient, DelegationException } from '@armoriq/sdk';

// Generate keypair for delegate agent
const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');

// Convert public key to hex format
const pubKeyHex = publicKey
  .export({ type: 'spki', format: 'der' })
  .toString('hex');

// Delegate authority
try {
  const delegationResult = await client.delegate(
    parentToken,
    pubKeyHex,
    1800,  // 30 minutes validity
    ['book_venue', 'arrange_catering'],  // allowed actions
    'sub-agent-1'  // target agent identifier
  );

  console.log(`✅ Delegation created: ${delegationResult.delegationId}`);
  console.log(`Delegated token: ${delegationResult.delegatedToken.tokenId}`);

  // Send delegated token to sub-agent
  await subAgentClient.invoke(
    'events-mcp',
    'book_venue',
    delegationResult.delegatedToken,
    { venue_id: 'v123', date: '2026-04-15' }
  );
} catch (error) {
  if (error instanceof DelegationException) {
    console.error(`Delegation failed: ${error.message}`);
  }
}

Delegation Chain (Hierarchical)

# Level 1: Manager delegates to Team Lead
lead_delegation = manager_client.delegate(
    manager_token,
    delegate_public_key=team_lead_pubkey,
    validity_seconds=7200
)

# Level 2: Team Lead delegates to Specialist
specialist_delegation = team_lead_client.delegate(
    lead_delegation.delegated_token,  # Use delegated token
    delegate_public_key=specialist_pubkey,
    validity_seconds=3600,
    allowed_actions=["execute_subtask"]  # Further restricted
)
// Level 1: Manager delegates to Team Lead
const leadDelegation = await managerClient.delegate(
  managerToken,
  teamLeadPubkey,
  7200  // 2 hours
);

// Level 2: Team Lead delegates to Specialist
const specialistDelegation = await teamLeadClient.delegate(
  leadDelegation.delegatedToken,  // Use delegated token
  specialistPubkey,
  3600,  // 1 hour
  ['execute_subtask']  // Further restricted
);

Security Properties

  • Cryptographically Bound: Delegation is signed with IAP's Ed25519 key
  • Non-transferable: Delegate cannot re-delegate without explicit permission
  • Time-Limited: Delegated tokens expire faster than parent tokens
  • Action-Restricted: Delegate can only execute allowed actions
  • Auditable: All delegations logged with delegation_id and trust_delta
  • Revocable: Parent token expiration invalidates all delegations

On this page