Skip to main content
A personal assistant answers one person in a direct message, acts through that person’s governed Connections, and remembers what they ask it to remember. Your application owns the messaging connection and the pairing. Checkfu does not operate messaging adapters. See Connect your own messaging app. Checkfu owns the Session truth: every Run in the DM’s Session acts as the person, under their PermissionAssignments and Budget. Start with the quickstart. In one Workspace, create an Agent, select an Environment, and start a Session. Session admission freezes the resolved AgentVersion, Environment authority, and acted_as. Every later interaction is read from and appended to the Session event log.

What this example demonstrates

  1. Pair the person in the application, before any Checkfu call. The app sends a single-use, short-lived pairing code into the DM and accepts it only when the same member echoes it back in the same DM. That proves continuity of the conversation; the authenticator is the application, not Checkfu.
  2. Provision one Principal and one Agent per person. The person’s Principal is found again by its external subject. The person holds act_as and approve on their own Agent, and the Agent holds use_environment on the Environment.
  3. Start one direct Session for the DM with acted_as set to the person and the person’s principal-owned MemoryStore mounted read-write. Admission is refused without act_as, use_environment, or the Agent’s grant on the store. The Session is created with the ordinary Session API.
  4. Connect an app with connections.apply. The Connection is owned by the person; connections.apply mints use_connection and use_tool for the person and their Agent and pins the Connection on the Agent as a new AgentVersion. The DM moves to a new Session on that version with the same acted_as and memory mount.
  5. Decide ActionApprovals as the person. The app reads the parked approval from the event log, renders the draft only when the logged arguments hash to the frozen digest, and calls actionApprovals.decide with expected_version and acted_as the person. The ledger names the person, with the app’s key as the authenticating caller.
  6. Keep reminders app-side. The app serves reminder Custom tools that act only for the platform-frozen actedAs, keeps the schedule in its own state, and drives the person’s current DM Session when a reminder is due. The resulting Run is the person’s Run, bounded like a message they typed.
Memory mounts are authorized against the Session’s Agent, not against acted_as. Per-person isolation therefore comes from the application granting each person’s store to exactly that person’s Agent, and act_as on that Agent to exactly that person.

Retention, delivery, and recovery boundaries

Your messaging provider can redeliver an incoming message, and a reply to the provider can fail after Checkfu has accepted Session truth. Deduplicate by a stable message key and reconcile provider delivery rather than creating a second transcript. A lost provider response can leave an external effect indeterminate; do not retry it blindly. Standard retention may preserve permitted Session and Memory content subject to policy and erasure. ZDR does not durably store execution content or memory documents, so persistent personal memory and content replay are unavailable for that path, and the draft cannot be rendered when the logged arguments are gone. Usage remains authoritative for Budgets. Check capability status for the exact provider and deployment before depending on restart recovery, revocation, erasure, a memory operation, or an execution lane.

Pinned source boundary

The optional source reads a parked approval from the Session event stream. The durable event is the starting point for the approval UI; a button press or reply in your messaging app is not approval authority until your service calls actionApprovals.decide.
path=examples/personal-assistant/src/draft.ts

What this example omits

This page does not promise a DM that Checkfu itself verifies is private to one person, an Automation that acts as the person with their own Connections, exactly-once delivery to the messaging provider, silent memory mutation, provider-side approval authority, or durable personal memory under ZDR. Reminders live only in the application’s state and fire only while it runs.