How AutessaScript runs
The execution model: the autessa.* global, the ok/data/errors response envelope, dispatch guards (depth, budget, read-only, strict validation), and scripts calling scripts.
The decision: you are writing an AutessaScript. What can you rely on about how it runs,
and how do you read the result of every autessa.* call?
The globals
Every script runs with a globalThis.autessa object already in scope — the whole SDK tree,
one function per method. You never import or construct it; autessa.agents.create({...}) is
just there. Namespaces nest (autessa.autessadb.query.query), and a call takes a body object
and an optional options argument.
The response contract: the ok/data/errors envelope
Every autessa.* call returns an envelope, not a bare value:
const { ok, data, errors } = autessa.agents.create({ agentType: 'SIMPLE', agentName: 'Bot' });
if (ok) {
console.log('created', data.agent.agentId);
} else {
console.error('failed', errors);
}
okis a boolean — always check it before usingdata.dataholds the response shape documented for that method (the response schema in its docs).errorsis a non-empty array of human-readable reason strings wheneverokis false — soerrors(anderrors[0]) always tells you what went wrong. It is absent on success.
A script's own final result follows the same idea: return the value you want the caller to receive; failures surface through the envelope rather than by throwing raw exceptions.
Dispatch guards
Each autessa.* call passes a guard chain before it reaches the backing endpoint:
- Depth — a script may call other scripts/tools, which may call more; the runtime caps how deep that recursion can go, so a runaway call tree is stopped.
- Budget — there is a per-run ceiling on how many SDK calls a single run may make (a read-then-write counts as more than one). Exceeding it fails the call rather than the run spinning forever.
- Read-only policy — a run can be marked read-only; under it, any MUTATE-classified call is refused. Read calls still work. This is how a plan/preview run is kept side-effect-free.
- Strict validation — mutations are validated against the authored request shape, and an undeclared field is rejected rather than silently forwarded. The documented request schema is the contract; if a field isn't in the docs, it won't reach the endpoint.
Created-resource tracking and calling scripts from scripts
- When a run creates resources (a table, an agent, a row), the runtime tracks what was created, so a run's side effects are attributable.
- Scripts can invoke other scripts and tools through the SDK; the depth and budget guards above govern that fan-out. Design chains to stay well within the caps — prefer a trigger chain (see the automations guide) over one script that recurses deeply.
Decision rules
- Always destructure and check
ok. Never usedatabefore confirmingokis true. - Send only documented fields on mutations. Strict validation rejects the rest.
- Mark preview runs read-only. Rely on the read-only policy to guarantee no writes during a dry run.
- Respect the budget. Batch where the SDK offers a batch method (e.g.
autessa.autessadb.query.batchUpdate) instead of a call per row.
Worked example
const { ok, data } = autessa.autessadb.query.query({ tableId: 'tbl_leads',
whereGroups: [{ logicalOperator: 'AND', conditions: [
{ columnName: 'status', operator: 'EQUALS', value: 'new' } ] }], page: 1, pageSize: 50 });
if (!ok) return { processed: 0 };
// one batched write instead of one call per row — stays within the SDK budget
autessa.autessadb.query.batchUpdate({ tableId: 'tbl_leads',
rowIds: data.rows.map(r => r.id), columnData: { status: { textValue: 'queued' } } });
See also
- agents-tools-managers — when to script directly versus configure an agent.
- automations — trigger chains as the alternative to deep script recursion.