Systems that run unattended, until they shouldn't.
Chat, execution, and event-driven work across every channel, with a human handed the wheel when it matters.
Drive it. It knows when to step back.
Send a message on any channel and watch it classify, use a tool, and answer, or hand a refund it can't verify to a person. Same brain, every channel, on a budget.
It answers what it can. It escalates what it shouldn't.
What you just drove is this decision. Every message runs two gates before it can answer: is the classifier sure enough, and is this safe to act on unattended. Fail either and it doesn't improvise, it hands the thread to a person exactly where the agent left off.
Intent and a confidence score, computed on every message before anything is allowed to act.
Below the bar and it doesn't guess. That alone routes the message to a person.
Money, an account change, or anything sensitive is escalated even when it's confident.
Clear and in-scope, it answers from your tools and data, with the tool call logged.
Anything else goes to a human with the whole thread attached, nothing dropped.
One brain behind every channel.
Web, Telegram, WhatsApp, and Discord aren't four bots, they're four doors to the same agent, the same tools, the same memory. A customer doesn't get a worse answer for using a different app, and a person handing off sees the whole conversation, wherever it started.
Every message and tool call is recorded and replayable, so a bad run is debuggable, not a mystery.
An agent you can leave running.
The loop that answers a message is short and unremarkable. The reason you can hand it your customers is the scaffolding around it: a budget it can't exceed, an allowlist it can't reach past, an approval gate on anything with a side effect, and a trace of everything it did.
1# the loop is short. the guards are why you can leave it running2class SupportAgent(Agent):3 tools = [read_orders, read_bookings, search_kb] # allowlist only4 cost_cap = 0.50 # dollars per conversation5 step_cap = 867 def handle(self, msg):8 plan = self.classify(msg) # intent + confidence9 if plan.confidence < BAR or plan.touches_money:10 return self.escalate(msg) # hand to a human11 if self.spent >= self.cost_cap:12 return self.escalate("hit the budget")13 return self.act(plan) # call a tool, answerA hard ceiling on spend and tool calls per conversation, so it can't quietly rack up a bill.
It can only call the tools you granted, with the arguments you allow. No surprise capabilities.
Anything that spends money or changes an account pauses for a human yes.
Every message, classification, and tool call recorded, so a bad run is debuggable.
The demo bots reply. A useful one runs unattended, until it shouldn't.
Anyone can wire a bot that answers canned messages. The value is the judgement: handling the ordinary case across every channel without you, and knowing the exact edge where a decision becomes a person's to make. We build the agent, and we build the line it won't cross, because a capable bot without that line is a liability, not a product.
What we build
8 buildsTell us what should run itself.
Send the workflow and the line it shouldn't cross. We come back with a scope, a plan, and where a demo proves it.