Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.useterse.ai/llms.txt

Use this file to discover all available pages before exploring further.

Not every tool call should run automatically. When a workflow writes to a production CRM, sends a customer-facing email, or executes a database query, you may want a human to review and approve before it goes through. Tool approvals give you that checkpoint. You declare which tools need approval in your job definition. When the model (or your code) calls one of those tools, the run pauses, notifies you, and waits for a decision. Approve to continue; reject to stop that tool call.

Configuring tool approvals

List the tool names that require approval in toolApprovals:
createJob({
    name: "deal-enrichment",
    triggers: [Triggers.attio.onRecordCreated({ object: AttioObject.Deal })],
    onTrigger: async (event) => {
        const agent = TerseAgent.create({
            prompt: "You enrich new deals and post summaries to the deal desk.",
            skills: [
                Skills.attio({ object: AttioObject.Deal }),
                Skills.web(),
                Skills.slack({ channel: SlackChannel.DealDesk })
            ],
            toolApprovals: ["attio_upsert_record", "slack_send_message"]
        })

        // Agentic: web research runs immediately (read-only)
        const summary = await agent.runAndWait(
            `Summarize what ${event.record.values.company_name} does in one paragraph.`
        )

        // This call pauses and waits for human approval
        await agent.tools.attio.upsertRecord({
            object: AttioObject.Deal,
            matchingAttribute: "record_id",
            records: [{ record_id: event.record.id, research_summary: summary }]
        })

        // So does this one
        await agent.tools.slack.sendMessage({
            channelId: SlackChannel.DealDesk.channelId,
            message: `New deal enriched: ${event.record.values.company_name}`
        })
    }
})
toolApprovals is typed against the tools exposed by your declared skills, so your editor autocompletes the exact tool names. An empty array means no tools require approval; omitting the field entirely has the same effect.

Approval in development vs. production

The approval experience adapts to your environment:

Local development (terse test)

When you test locally, approval requests appear as interactive prompts in your terminal:
  Approval required: attio_upsert_record
    {
      "objectSlug": "deals",
      "matchingAttribute": "record_id",
      "records": [{ "record_id": "rec_abc123", "research_summary": "SaaS company, 150 employees" }]
    }

  Approve attio_upsert_record? (Y/n)
Type Y to approve or n to reject. The run resumes immediately in the same terminal session.

Production (deployed workflows)

In production, Terse delivers approval requests through your configured notification channels and handles them in the app:
ChannelExperience
SlackInteractive message with Approve and Reject buttons so you can decide without leaving Slack
EmailNotification with a link to the run in the Terse app
In-appPending approvals appear in the Notifications page with approve/reject actions
You can also approve or reject from the Activity tab by opening the paused run and reviewing the tool call in context.

When to use tool approvals

Tool approvals add latency because the run waits for a human. Use them deliberately. Good candidates are write operations to production CRMs during early development, customer-facing messages (emails, Slack DMs to external contacts), database mutations (especially deletes), and any workflow where compliance requires a human checkpoint. Skip them for read-only operations like queries and enrichment lookups, internal notifications to team Slack channels or dashboards, workflows that have been validated and are running reliably, and high-volume operations where per-run approval isn’t practical. A common pattern is to start with approvals enabled during development and the first few production runs, then remove them once the workflow behaves correctly.

Notification configuration

Terse delivers approval requests through the notification settings on your Notifications page. To receive them, make sure:
  1. You’ve added a notification destination. Open the Notifications page, switch to the Destination tab, and add a Slack workspace or confirm your email.
  2. You’ve enabled approval requests. On the same page, open the Notification Types tab and include “Approval requests” in the “Notify me about” action types.
Terse tries Slack first when you have an active destination. If Slack isn’t configured, it falls back to email. Every approval request Terse sends is logged in your notification history.

Where to go next

Activity & observability

Monitor runs, inspect failures, and review the full action trace.

Skills & integrations

Control which integrations the model can use.