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
trueandfalse. - 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.
Prompt files
A playbook or agent sets its instructions with exactly one ofprompt 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 withfiles, 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:.pyfor Python,.sqlfor SQL against the app’s private database,.tqlfor TQL. A.tqlbody also takes aconnector, whereid:-1means the app’s private database.tql_path: a saved.tqlfile elsewhere in the Ontology.server_handled = true: handled by a function of the same name in the app’s server module.
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 incapabilities. 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).