Skip to main content

Human Proxy — Act As You

V2 and above. Part of the invite-only hosted editions, not the free self-hosted V1. See the editions.

Overview​

AI Partner can act as you across five communication channels:

ChannelInboundOutboundYour identity
EmailRead, classify, draft replySend as you (Gmail or SMTP)your@email.com
Slack DMRead your DMs (user OAuth)Reply in your workspaceYour Slack identity
Telegram DMRead your personal DMs (userbot)Reply from your real accountYour Telegram account
Phone (Twilio)Take voicemails, transcribePlace outbound calls (gated)Your Twilio number
MeetingJoin, listen, respondSpeak with your voice cloneYour voice

Every outgoing action passes your authority policy first. Nothing is ever sent without either your standing permission or your explicit approval.


Telegram serves two roles:

  1. Approval channel — you receive approval requests and tap buttons to approve/edit/skip
  2. Notification channel — heartbeat briefings, goal completions, file deliveries
  1. 1
    Create a Telegram bot
    1. Open Telegram and search for @BotFather
    2. Send /newbot
    3. Choose a name (e.g., "AI Partner") and username (e.g., my_ai_partner_bot)
    4. Copy the bot token: 7123456789:AAF-your-token-here
  2. 2
    Get your Telegram chat ID
    1. Send any message to your new bot
    2. Open https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates in a browser
    3. Find "chat":{"id":123456789} — that number is your chat ID
  3. 3
    Enter credentials in AI Partner

    Go to Settings → Messaging → Telegram:

    • Bot token: 7123456789:AAF-your-token-here
    • Your chat ID: 123456789
    • Click Test Connection — you should receive a test message in Telegram
  4. 4
    Configure your authority policy

    Edit workspace/AUTHORITY.md to add draft_and_ask rules for the actions you want approval on:

    ## Draft + ask
    - action: reply_email + counterparty: client
    - action: send_slack_dm + counterparty: colleague

    Now any time the agent wants to reply to a client email, it'll ask via Telegram first.


Setting up email proxy (Gmail)​

  1. 1
    Generate a Gmail App Password
    1. Go to myaccount.google.com/security
    2. Enable 2-Step Verification (required for app passwords)
    3. Under 2-Step Verification → scroll down → App passwords
    4. Select "Mail" and "Other (custom name)" → enter "AI Partner"
    5. Copy the generated 16-character password
  2. 2
    Add it in the app

    Settings → Integrations → Gmail — your address and the app password. It takes effect straight away, and the credential is stored encrypted.

  3. 3
    Set up email trigger (optional)

    To have AI Partner monitor your inbox automatically (not just on-demand):

    Go to Settings → Integrations → Email Trigger:

    • Enable auto-monitoring
    • Set check interval (default: every 5 minutes)
    • Set intent filter (which emails warrant a reply vs. FYI)
  4. 4
    Test it

    Ask in chat:

    Check my inbox and summarize the last 5 unread emails.

    If configured correctly, you'll see a list of emails in the chat within 10–15 seconds.


Setting up Slack proxy​

This uses user OAuth — meaning the agent reads and sends as your actual Slack identity, not a bot.

This gives the agent access to your personal Slack account, including your DMs. Set the rules in your AUTHORITY.md before enabling it, not after.

  1. 1
    Get your Slack user token
    1. Go to api.slack.com/apps → Create New App
    2. OAuth & Permissions → User Token Scopes → add: chat:write, im:read, im:history, channels:read
    3. Install to workspace → copy the User OAuth Token (starts with xoxp-)
  2. 2
    Add it in the app

    Settings → Integrations → Slack — paste the user token.

  3. 3
    Test it
    List my unread Slack DMs from the last 24 hours.

Setting up Telegram DM proxy (userbot)​

This is different from the bot setup above. The userbot reads your personal Telegram DMs — messages sent to your real Telegram account, not to your bot.

The Telegram userbot logs into your actual Telegram account using your phone number and API credentials. Telegram's Terms of Service allow this for personal use. Do not use this to spam or mass-message.

  1. 1
    Get Telegram API credentials
    1. Go to my.telegram.org/apps
    2. Log in with your phone number
    3. Create an application → copy API ID and API Hash
  2. 2
    Add them in the app

    Settings → Integrations → Telegram (personal account) — the API ID, the API hash and your phone number.

  3. 3
    Confirm it's you

    Telegram sends a confirmation code to your phone. AI Partner asks you for it in the app the first time it connects.


Setting up phone (Twilio)​

AI Partner can take voicemails and place outbound calls on your behalf.

  1. 1
    Get a Twilio number
    1. Sign up at twilio.com
    2. Buy a phone number
    3. Copy your Account SID and Auth Token from the dashboard
  2. 2
    Add them in the app

    Settings → Integrations → Phone — your account credentials and the number to call from.

  3. 3
    Point incoming calls at AI Partner

    The Phone settings page shows the exact address to paste into your phone provider's console for incoming calls, with a copy button.

    Once set, a caller to your number is greeted, their message is recorded and transcribed, and you're notified on your messaging channel with the transcript.

  4. 4
    Place outbound calls (gated)

    By default, outbound calls are blocked in AUTHORITY.md. To enable them:

    ## Draft + ask
    - action: place_phone_call + counterparty: vendor

    Now you can say:

    Call Mike at the plumber's office and ask if they can come Thursday morning.

    The agent drafts the call script, sends you a Telegram approval, and places the call after you approve.


Everyone you interact with​

Every person AI Partner interacts with on your behalf gets a counterparty record:

Name: Sarah Johnson
Company: Acme Inc.
Relationship class: client
Email: sarah@acme.com
Slack: @sarah_acme
Phone: +14155559876

Tone notes: prefers bullet points, quick to respond, formal in email
Last contact: 2026-05-10 via email
Open commitments:
- "Send revised project timeline by May 15" (from email 2026-05-10)

This record is updated automatically every time the agent interacts with Sarah. The next time she emails, the agent knows her tone, your relationship, and any open commitments — without you telling it again.

View all contacts: sidebar → Memory → Counterparties


Testing the full flow​

Here's a complete test you can run immediately after setup:

1. Ask AI Partner: "Draft a reply to the most recent email from any colleague.
Use my voice, keep it professional. Send me a Telegram preview."

2. Check Telegram — you should see the draft with Approve/Edit/Skip buttons.

3. Tap "Edit" and reply with a correction.

4. Confirm AI Partner sent the corrected version.

If this works, your human proxy is fully operational.


Identity persistence + credentials vault (Phase 5)​

Before Phase 5, every bye partner → wake up partner cycle wiped your login state. The fix is two volumes:

VolumeMount pointSurvivesWhat lives there
aipartner-home-${userId}/home/partnercontainer restartChromium profile, gh auth, SSH keys, app configs, pip packages, npm caches
aipartner-workspace/workspacecontainer restartgenerated files, learned skills, goal output directories

On every wake up partner, the entrypoint:

  1. Mounts the per-user volume
  2. Creates .config/chromium-profile, .config/gh, .ssh, .secrets, .mozilla with correct permissions
  3. Decrypts every .secrets/*.age file into an env var (uppercased name) — so the agent reaches in with $GH_TOKEN etc. without prompting you again

Chromium now uses --user-data-dir=/home/partner/.config/chromium-profile — so cookies, saved logins, and storage state survive between sessions.

Secrets vault — never paste tokens into chat again​

When the user says set my gh token to ghp_xxxx, the agent calls credentials_set (one of the new Phase 5 MCP tools):

credentials_set(name="gh_token", value="ghp_xxxx", scope="github")
→ age encrypts the value → /home/partner/.secrets/gh_token.age
→ audit log: "user set gh_token@github"
→ returns: { name, scope, env_var: "GH_TOKEN", set_at }

On the next wake-up the boot-time loader sees gh_token.age, decrypts it, and exports GH_TOKEN so gh picks it up via env automatically. The agent can also read at runtime via credentials_get.

MCP tools exposed to the agent (gated to partner mode — they refuse to run when partner is asleep):

ToolWhat it does
credentials_setEncrypt + store a value
credentials_getDecrypt + return one value (treat as sensitive — don't echo to chat)
credentials_listList names + scope (NEVER values)
credentials_unsetPermanently remove

The age identity (private key) lives at /home/partner/.secrets/identity.age-key and is generated on first set. Threat model: anyone with root inside the T3 container can decrypt your secrets. The encryption protects against volume theft / snapshot leaks, not against attackers inside your own container. For higher assurance (TPM-backed key, hardware-token unwrap), file an issue.


Taking control mid-task​

When the agent hits a CAPTCHA or a login wall, it stops and asks for you rather than guessing. The Inspector shows the live page with a Take Control button.

So during a run:

  1. The agent reaches a login page and pauses
  2. You see that page live in the Inspector
  3. Click Take Control
  4. Click and type directly on the live view — your input lands in the browser you're actually watching, not some other one

Clear the obstacle, hand control back, and the run continues from where it paused. See Teach by Demo for the same window's other job. 5. Type your password — keystrokes go to T3 6. Click "Release Control" — agent resumes, sees the now-authenticated page state

Combined with the persistent volume from Phase 5, you only need to log in once per site per user. The next partner session has your cookies already.