Zero-Human Provisioning
Complete agent lifecycle with no human involvement
Overview
This example demonstrates a complete agent lifecycle from bootstrap to production operation — with zero human touchpoints. The agent provisions its own infrastructure, signs up for services, verifies accounts, and can even upgrade via the x402 protocol (Sprint 3).
Info
Complete autonomy: No OAuth flows, no browser automation, no human verification steps. The agent does everything via API.
For conceptual background, see the Zero-Human Provisioning Guide.
Complete Implementation
import { DaimonClient } from 'daimon-email';
class AutonomousAgent {
private client: DaimonClient;
private inbox: any;
private apiKey: string;
async bootstrap() {
console.log('🤖 Agent starting from nothing...');
// Step 1: Create inbox (no auth required)
const client = new DaimonClient();
this.inbox = await client.inboxes.create({
username: 'autonomous-agent-' + Date.now(),
clientId: `deployment-${process.env.DEPLOYMENT_ID}`
});
this.apiKey = this.inbox.apiKey;
this.client = new DaimonClient({ apiKey: this.apiKey });
console.log(`✅ Created inbox: ${this.inbox.address}`);
console.log(`🔑 API Key: ${this.apiKey.slice(0, 20)}...`);
// Step 2: Check what we can do
const capabilities = await this.client.account.getCapabilities();
console.log('📋 Current capabilities:', capabilities.can.map(c => c.action));
return this.inbox;
}
async signUpForService(serviceUrl: string) {
console.log(`📝 Signing up for service: ${serviceUrl}`);
// Use our email to sign up for external service
const signupResponse = await fetch(`${serviceUrl}/api/signup`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: this.inbox.address,
name: 'Autonomous Agent'
})
});
console.log('📧 Waiting for confirmation email...');
// Poll for confirmation email
let confirmationEmail = null;
for (let i = 0; i < 60; i++) {
const messages = await this.client.inboxes.messages.list(this.inbox.id);
confirmationEmail = messages.find(m =>
m.from.includes(serviceUrl.replace('https://', ''))
);
if (confirmationEmail) break;
await new Promise(resolve => setTimeout(resolve, 5000));
}
if (!confirmationEmail) {
throw new Error('Confirmation email never arrived');
}
// Extract and click confirmation link
const confirmLink = confirmationEmail.ctaLinks[0];
console.log(`🔗 Found confirmation link: ${confirmLink.url}`);
await fetch(confirmLink.url);
console.log('✅ Service account verified!');
return confirmationEmail;
}
async upgradeWhenNeeded() {
try {
// Try to send an email
await this.client.inboxes.send(this.inbox.id, {
to: 'test@example.com',
subject: 'Test',
body: 'Testing send capability'
});
} catch (error: any) {
if (error.code === 'SEND_REQUIRES_PAID') {
console.log('⚠️ Send requires paid tier');
console.log('💡 Agent suggestion:', error.upgradeContext.agentScript);
// Generate magic upgrade link
const upgradeLink = await this.client.account.createUpgradeLink({
reason: 'Need sending capabilities for email automation',
returnUrl: `https://my-dashboard.com/agent/${this.inbox.id}`
});
console.log('🔗 Upgrade link:', upgradeLink.url);
console.log('⏳ Waiting for operator to upgrade...');
// In production: send this link via Slack/Discord to operator
// For demo: just log it
return upgradeLink;
}
}
}
async handleUpgradeCallback(webhookEvent: any) {
if (webhookEvent.event === 'account.upgraded') {
console.log('🎉 Account upgraded!');
console.log('New tier:', webhookEvent.account.tier);
// Now we can send
const result = await this.client.inboxes.send(this.inbox.id, {
to: 'test@example.com',
subject: 'Hello!',
body: 'I can now send emails!'
});
console.log('✅ First email sent:', result.messageId);
}
}
}
// Usage
const agent = new AutonomousAgent();
await agent.bootstrap();
await agent.signUpForService('https://external-service.com');
const upgradeLink = await agent.upgradeWhenNeeded();import time
import requests
from daimon_email import DaimonClient
class AutonomousAgent:
def __init__(self):
self.client = None
self.inbox = None
self.api_key = None
def bootstrap(self):
print('🤖 Agent starting from nothing...')
# Step 1: Create inbox (no auth required)
client = DaimonClient()
self.inbox = client.inboxes.create(
username=f'autonomous-agent-{int(time.time())}',
client_id=f'deployment-{os.getenv("DEPLOYMENT_ID")}'
)
self.api_key = self.inbox.api_key
self.client = DaimonClient(api_key=self.api_key)
print(f'✅ Created inbox: {self.inbox.address}')
print(f'🔑 API Key: {self.api_key[:20]}...')
# Step 2: Check what we can do
capabilities = self.client.account.get_capabilities()
print(f'📋 Current capabilities: {[c["action"] for c in capabilities.can]}')
return self.inbox
def sign_up_for_service(self, service_url: str):
print(f'📝 Signing up for service: {service_url}')
# Use our email to sign up for external service
signup_response = requests.post(
f'{service_url}/api/signup',
json={
'email': self.inbox.address,
'name': 'Autonomous Agent'
}
)
print('📧 Waiting for confirmation email...')
# Poll for confirmation email
confirmation_email = None
for i in range(60):
messages = self.client.inboxes.messages.list(self.inbox.id)
confirmation_email = next(
(m for m in messages if service_url.replace('https://', '') in m.from_address),
None
)
if confirmation_email:
break
time.sleep(5)
if not confirmation_email:
raise Exception('Confirmation email never arrived')
# Extract and click confirmation link
confirm_link = confirmation_email.cta_links[0]
print(f'🔗 Found confirmation link: {confirm_link["url"]}')
requests.get(confirm_link['url'])
print('✅ Service account verified!')
return confirmation_email
def upgrade_when_needed(self):
try:
# Try to send an email
self.client.inboxes.send(
self.inbox.id,
to='test@example.com',
subject='Test',
body='Testing send capability'
)
except Exception as error:
if hasattr(error, 'code') and error.code == 'SEND_REQUIRES_PAID':
print('⚠️ Send requires paid tier')
print(f'💡 Agent suggestion: {error.upgrade_context["agent_script"]}')
# Generate magic upgrade link
upgrade_link = self.client.account.create_upgrade_link({
'reason': 'Need sending capabilities for email automation',
'return_url': f'https://my-dashboard.com/agent/{self.inbox.id}'
})
print(f'🔗 Upgrade link: {upgrade_link.url}')
print('⏳ Waiting for operator to upgrade...')
# In production: send this link via Slack/Discord to operator
return upgrade_link
def handle_upgrade_callback(self, webhook_event):
if webhook_event['event'] == 'account.upgraded':
print('🎉 Account upgraded!')
print(f'New tier: {webhook_event["account"]["tier"]}')
# Now we can send
result = self.client.inboxes.send(
self.inbox.id,
to='test@example.com',
subject='Hello!',
body='I can now send emails!'
)
print(f'✅ First email sent: {result.message_id}')
# Usage
agent = AutonomousAgent()
agent.bootstrap()
agent.sign_up_for_service('https://external-service.com')
upgrade_link = agent.upgrade_when_needed()Key Features
1. No Initial Authentication
The agent starts with nothing — no API keys, no OAuth tokens. It creates its first inbox without any credentials.
2. Idempotent Provisioning
Using client_id ensures the agent can restart without creating duplicate inboxes:
// Agent restarts won't create duplicates
const inbox = await client.inboxes.create({
username: 'agent-prod',
clientId: 'deployment-prod-1' // Same ID = same inbox returned
});3. Self-Discovery
The agent checks its own capabilities and adapts behavior accordingly:
const caps = await client.account.getCapabilities();
const canSend = caps.can.some(c => c.action === 'send_messages');
if (!canSend) {
console.log('Operating in receive-only mode');
}4. Automated Service Signup
The agent can verify accounts for any service that uses email confirmation:
- CRM systems
- SaaS platforms
- API services
- Development tools
Real-World Scenarios
Scenario 1: CI/CD Test Agent
// Agent provisions fresh inbox for each test run
const testInbox = await client.inboxes.create({
username: `test-${testRunId}`,
clientId: `test-run-${testRunId}`
});
// Test password reset flow
await triggerPasswordReset(testInbox.address);
const resetEmail = await waitForEmail(testInbox.id, {
subject: 'Reset your password'
});
const resetLink = resetEmail.ctaLinks[0].url;
await completePasswordReset(resetLink);
// Clean up
await client.inboxes.delete(testInbox.id);Scenario 2: Multi-Service Integration Agent
// Agent provisions itself across multiple platforms
const platforms = [
'https://crm.example.com',
'https://helpdesk.example.com',
'https://analytics.example.com'
];
for (const platform of platforms) {
await agent.signUpForService(platform);
console.log(`✅ Integrated with ${platform}`);
}