Skip to main content
Availability: Config files are a Beta feature. See Config Files for how they work.

Syntax

Every config file is one record: a constructor name followed by fields in braces.
  • Config files are not JSON. Field names are bare (never quoted), and values use =, never :.
  • Comments start with -- and run to the end of the line. // and # are errors.
  • Fields and list items are separated by commas. A trailing comma after the last item is an error.
  • Strings are double-quoted, with backslash escapes. Booleans are lowercase true and false.
  • Lists use [ ] and nested records use { }.
  • A field you leave out takes its default. Unknown fields and values outside a field’s allowed list are errors.

References

Config files refer to other things in a few fixed forms. Paths work like this, unless a field says otherwise:
  • A bare name is a file beside the config file.
  • A path without a leading slash is relative to the config file’s folder.
  • A path with a leading slash starts at the root of the Ontology.
Members are always written by email address, not by id.

Prompt files

A playbook or agent sets its instructions with exactly one of prompt or prompt_file. Use prompt only for a prompt that fits on one line; anything longer goes in a markdown file that prompt_file points to. A long inline prompt is flagged by a check and moved into a file by automatic fixes. Add or change the prompt file in the same change as the config file.

Attached files

Playbooks, agents, and dashboards can attach Ontology files to every run with files, a list of { path, alias } records. alias is optional.

Playbook

File: <name>.playbook. Constructor: Playbook.
playbooks/weekly-revenue/weekly-revenue.playbook
access controls the run Threads, not the file:
level is viewer, editor, or owner. Only a member can be an owner, not a role, and each member or role may appear once.

Agent

File: <name>.agent. Constructor: Agent.
agents/revenue-watcher/revenue-watcher.agent
email_recipients, slack_dm_recipients, teams_dm_recipients, feed_channels, subagents, and subagent_invokers keep only the entries that match. An empty or omitted list clears the saved list. If a non-empty list has no matches, the agent’s saved list is left as it was. slack_trigger.channels is different: an empty list means every channel.

Dashboard

File: <name>.dashboard. Constructor: Dashboard. The dashboard’s code lives beside it.
dashboards/sales-overview/sales-overview.dashboard
Each data source has a type and a name, plus the fields its type needs: parameters declares live query parameters, each { name, type, default }; only name is required.

Data App

File: app.dataapp, in a folder of its own under apps/. Constructor: DataApp. The folder is the app: its code, queries, and assets live beside the file, and other config files inside it are not read as objects.
apps/quarterly-revenue/app.dataapp
path values in sources and functions are relative to the app’s content root: root_path when set, otherwise the folder holding app.dataapp. Sources. Each has a name and a type: Functions. Each has a name and exactly one body:
  • path: a file in the app’s folder. The extension picks the kind: .py for Python, .sql for SQL against the app’s private database, .tql for TQL. A .tql body also takes a connector, where id:-1 means the app’s private database.
  • tql_path: a saved .tql file elsewhere in the Ontology.
  • server_handled = true: handled by a function of the same name in the app’s server module.
Optional: description, returns, and parameters (each { name, type, description }). Compute. Jobs. Each job calls one of the app’s functions: A job with neither cron nor after_refresh runs only when started by hand.

Capabilities

Dashboards and data apps list the platform actions their code may call in capabilities. Each entry has a type, and a name the code calls it by (not needed for state and assets). Capabilities other than ask and decide can declare parameters, each { name, type, description }; ask and decide take none. Each capability type must be available to your organization; a check flags one that isn’t. recipients for deliver takes any of subscribers (true for the app’s subscribers), member_emails, roles, runtime_emails (true when the code names recipients as it sends), slack_channel_ids (requires slack_channel in channels), and teams_channel_ids (requires teams_channel).