@oalo-ai/cli 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +392 -2
- package/man/oalo.1 +1530 -0
- package/package.json +44 -4
- package/plugin/.claude-plugin/plugin.json +12 -0
- package/plugin/skills/oalo/SKILL.md +414 -0
- package/src/api.js +132 -0
- package/src/app-ref.js +11 -0
- package/src/args.js +67 -0
- package/src/bot-settings.json +468 -0
- package/src/channel.js +162 -0
- package/src/commands/apps.js +64 -0
- package/src/commands/bots.js +278 -0
- package/src/commands/call.js +179 -0
- package/src/commands/channels.js +110 -0
- package/src/commands/data.js +446 -0
- package/src/commands/db.js +58 -0
- package/src/commands/deploy.js +431 -0
- package/src/commands/dockerfile.js +81 -0
- package/src/commands/docs.js +70 -0
- package/src/commands/emit.js +124 -0
- package/src/commands/env.js +223 -0
- package/src/commands/graphs.js +570 -0
- package/src/commands/incidents.js +44 -0
- package/src/commands/link.js +150 -0
- package/src/commands/login.js +180 -0
- package/src/commands/logs.js +69 -0
- package/src/commands/mcp.js +125 -0
- package/src/commands/metrics.js +168 -0
- package/src/commands/products.js +169 -0
- package/src/commands/qa.js +98 -0
- package/src/commands/rehearse.js +100 -0
- package/src/commands/run.js +152 -0
- package/src/commands/secrets.js +68 -0
- package/src/commands/setup.js +96 -0
- package/src/commands/skill.js +142 -0
- package/src/commands/sources.js +377 -0
- package/src/commands/switches.js +156 -0
- package/src/commands/tail.js +84 -0
- package/src/commands/tokens.js +85 -0
- package/src/commands/typegen.js +505 -0
- package/src/commands/whoami.js +112 -0
- package/src/config.js +157 -0
- package/src/data.js +392 -0
- package/src/envfile.js +71 -0
- package/src/events.js +63 -0
- package/src/graphfiles.js +273 -0
- package/src/help.js +920 -0
- package/src/index.js +216 -0
- package/src/mcp/tools.js +773 -0
- package/src/server.js +73 -0
- package/src/workspace.js +44 -0
package/man/oalo.1
ADDED
|
@@ -0,0 +1,1530 @@
|
|
|
1
|
+
.TH OALO 1 "" "oalo 0.1.0" "OALO CLI"
|
|
2
|
+
.SH NAME
|
|
3
|
+
oalo \- wire a local app into your Oalo workspace
|
|
4
|
+
.SH SYNOPSIS
|
|
5
|
+
.B oalo
|
|
6
|
+
.I command
|
|
7
|
+
[\fIargs\fR] [\fIflags\fR]
|
|
8
|
+
.SH DESCRIPTION
|
|
9
|
+
The OALO command line: link a local app to an OALO workspace, deploy it, read and write its data, make tables searchable by bots, change bot settings, and run workflows. \fBoalo help <command>\fR prints the same detail as this page for one command; \fBoalo help \-\-json\fR prints all of it for a program or an agent to read.
|
|
10
|
+
.SH COMMANDS
|
|
11
|
+
.SS login
|
|
12
|
+
Connect this machine to a workspace by approving it in the browser.
|
|
13
|
+
.PP
|
|
14
|
+
\fBoalo login <workspace> [\-\-name "<this machine>"] [\-\-no\-browser]\fR
|
|
15
|
+
.br
|
|
16
|
+
\fBoalo login \-\-server <url>\fR
|
|
17
|
+
.br
|
|
18
|
+
.TP
|
|
19
|
+
\fB\-\-server <url>\fR
|
|
20
|
+
Workspace URL, e.g. https://acme.oalo.ai. Defaults to OALO_URL or the linked project.
|
|
21
|
+
.TP
|
|
22
|
+
\fB\-\-name <name>\fR
|
|
23
|
+
What the connection is called in the dashboard. Default: this machine's hostname.
|
|
24
|
+
.TP
|
|
25
|
+
\fB\-\-no\-browser\fR
|
|
26
|
+
Print the approval URL without opening it (for a remote shell).
|
|
27
|
+
.IP \(bu 2
|
|
28
|
+
Opens the dashboard on Account \-> CLI & agents with a code. Approve it there (check the code matches) and the CLI saves a CLI token plus a read\-only data token.
|
|
29
|
+
.IP \(bu 2
|
|
30
|
+
Saved to ~/.oalo/credentials.json (mode 0600), by workspace URL, never in a project. Every command, oalo mcp included, finds them there.
|
|
31
|
+
.IP \(bu 2
|
|
32
|
+
The code lasts 10 minutes. Nothing is created until you approve.
|
|
33
|
+
.PP
|
|
34
|
+
Exit codes: 0 connected; 1 denied, expired or unreachable; 2 missing \-\-server.
|
|
35
|
+
.SS logout
|
|
36
|
+
Revoke this machine's connection and forget its saved tokens.
|
|
37
|
+
.PP
|
|
38
|
+
\fBoalo logout [\-\-server <url>]\fR
|
|
39
|
+
.br
|
|
40
|
+
.TP
|
|
41
|
+
\fB\-\-server <url>\fR
|
|
42
|
+
Workspace URL. Defaults to OALO_URL or the linked project.
|
|
43
|
+
.IP \(bu 2
|
|
44
|
+
Revokes the connection on the server when it was made by oalo login, then removes every saved token for that workspace.
|
|
45
|
+
.PP
|
|
46
|
+
Exit codes: 0 done; 2 missing \-\-server.
|
|
47
|
+
.SS whoami
|
|
48
|
+
Show the workspace, person and connection this machine uses, and check its tokens.
|
|
49
|
+
.PP
|
|
50
|
+
\fBoalo whoami [\-\-json]\fR
|
|
51
|
+
.br
|
|
52
|
+
.TP
|
|
53
|
+
\fB\-\-json\fR
|
|
54
|
+
Print everything as JSON.
|
|
55
|
+
.IP \(bu 2
|
|
56
|
+
Checks the CLI token by connecting and the data token by reading the manifest, so it tells you which one is the problem when a command is refused.
|
|
57
|
+
.IP \(bu 2
|
|
58
|
+
Also shows the workspace's API version and features, and says when this CLI is too old for it.
|
|
59
|
+
.PP
|
|
60
|
+
Exit codes: 0 connected and both checks passed; 1 a token failed, or the workspace is unreachable; 2 not connected.
|
|
61
|
+
.SS link
|
|
62
|
+
Point this project at a workspace and save credentials.
|
|
63
|
+
.PP
|
|
64
|
+
\fBoalo link \-\-server <url> [\-\-token <sync token>] [\-\-cli\-token <token>] [\-\-app <slug>] [\-\-env dev|prod] [\-\-no\-skill]\fR
|
|
65
|
+
.br
|
|
66
|
+
\fBoalo link \-\-status\fR
|
|
67
|
+
.br
|
|
68
|
+
.TP
|
|
69
|
+
\fB\-\-server <url>\fR
|
|
70
|
+
Workspace URL, e.g. https://acme.oalo.ai
|
|
71
|
+
.TP
|
|
72
|
+
\fB\-\-token <token>\fR
|
|
73
|
+
Sync token (data plane). Not needed after oalo login, which saved one.
|
|
74
|
+
.TP
|
|
75
|
+
\fB\-\-cli\-token <token>\fR
|
|
76
|
+
CLI token (control plane), for tail and mcp. Optional.
|
|
77
|
+
.TP
|
|
78
|
+
\fB\-\-app <slug>\fR
|
|
79
|
+
The app that deploy, env, logs, secrets and dockerfile use when you don't pass \-\-app (\fBoalo apps\fR lists them). \fBoalo deploy \-\-new\fR sets it.
|
|
80
|
+
.TP
|
|
81
|
+
\fB\-\-env dev|prod\fR
|
|
82
|
+
Which schema later commands touch. Default dev.
|
|
83
|
+
.TP
|
|
84
|
+
\fB\-\-status\fR
|
|
85
|
+
Show the current link and re\-check reachability.
|
|
86
|
+
.TP
|
|
87
|
+
\fB\-\-no\-skill\fR
|
|
88
|
+
Don't install or refresh the Oalo skill for coding agents (see \fBoalo skill\fR).
|
|
89
|
+
.IP \(bu 2
|
|
90
|
+
Every token is verified against the thing it is for BEFORE anything is saved, so a bad or mixed\-up token fails here rather than later.
|
|
91
|
+
.IP \(bu 2
|
|
92
|
+
Writes .oalo/config.json (safe to commit) and ~/.oalo/credentials.json (mode 0600, never in the project). OALO_HOME relocates the credential store.
|
|
93
|
+
.IP \(bu 2
|
|
94
|
+
Also installs the Oalo skill for coding agents (.claude/skills/oalo/SKILL.md), or refreshes it, from this CLI version; an AGENTS.md section from \fBoalo skill \-\-agents\fR is refreshed too.
|
|
95
|
+
.PP
|
|
96
|
+
Exit codes: 0 linked; 1 verification failed; 2 missing or invalid arguments.
|
|
97
|
+
.SS typegen
|
|
98
|
+
Generate TypeScript bindings from the workspace's own schema: its models, and the workflows apps can call.
|
|
99
|
+
.PP
|
|
100
|
+
\fBoalo typegen [\-\-out <file>] [\-\-check]\fR
|
|
101
|
+
.br
|
|
102
|
+
\fBoalo typegen \-\-dart [\-\-out <project dir>] [\-\-check]\fR
|
|
103
|
+
.br
|
|
104
|
+
.TP
|
|
105
|
+
\fB\-\-out <file>\fR
|
|
106
|
+
Output path. Default oalo.generated.ts. With \-\-dart, the Flutter project's root (default the current folder).
|
|
107
|
+
.TP
|
|
108
|
+
\fB\-\-dart\fR
|
|
109
|
+
For a Flutter app from Oalo's template: write lib/sync/generated and lib/models (the Base's own Dart generator, the one the box uses), and .oalo/dart\-defines.json with the Base's address, the linked app's slug and the env, for \fBflutter run \-\-dart\-define\-from\-file=.oalo/dart\-defines.json\fR.
|
|
110
|
+
.TP
|
|
111
|
+
\fB\-\-check\fR
|
|
112
|
+
Do not write; exit non\-zero if the file is stale or missing. For CI.
|
|
113
|
+
.IP \(bu 2
|
|
114
|
+
Commit the output. Document interfaces are OPEN: the manifest describes some fields and rows may carry more, so undeclared keys stay reachable.
|
|
115
|
+
.IP \(bu 2
|
|
116
|
+
A table\-scoped token generates only the tables it can read.
|
|
117
|
+
.IP \(bu 2
|
|
118
|
+
\-\-dart files are the same ones the box writes after a model changes; run it again after \fBoalo data models create\fR. Commit them.
|
|
119
|
+
.IP \(bu 2
|
|
120
|
+
The env is stamped in the header: dev and prod are separate schemas.
|
|
121
|
+
.IP \(bu 2
|
|
122
|
+
Workflows with an api trigger get <Name>Input and <Name>Output types and runWorkflow(name, input, {contact, wait}), which calls POST /api/workflows/v1/<name>/run from the app's server with OALO_URL and OALO_SYNC_TOKEN. A preview's token runs it as a test: dev data, outside actions simulated. \-\-check fails when a workflow's input or output changes too.
|
|
123
|
+
.IP \(bu 2
|
|
124
|
+
Every file also gets createChatSession(bot, user), for the chat widget signed in as your app's user: the endpoint in the widget's data\-user\-url answers with it (see \fBoalo docs chat\-widget\fR).
|
|
125
|
+
.IP \(bu 2
|
|
126
|
+
And verifyOaloToolCall(req), which an endpoint declared as a bot tool in .oalo/app.json uses to check a call came from Oalo and for which user (see \fBoalo docs app\-tools\fR).
|
|
127
|
+
.IP \(bu 2
|
|
128
|
+
And the workspace's products: PRODUCTS, the ProductId type and isProductId() (Dart: the Products class and allProductIds). Use them wherever code names a product. \-\-check fails when one is added or archived.
|
|
129
|
+
.PP
|
|
130
|
+
Exit codes: 0 written, or up to date under \-\-check; 1 stale, missing, or fetch failed; 2 not linked.
|
|
131
|
+
.SS tail
|
|
132
|
+
Watch loop runs, jobs, builds and activity as they happen.
|
|
133
|
+
.PP
|
|
134
|
+
\fBoalo tail [\-\-filter <text>] [\-\-json] [\-\-all]\fR
|
|
135
|
+
.br
|
|
136
|
+
.TP
|
|
137
|
+
\fB\-\-filter <text>\fR
|
|
138
|
+
Only events whose name or payload contains this text.
|
|
139
|
+
.TP
|
|
140
|
+
\fB\-\-json\fR
|
|
141
|
+
One JSON object per line. Pipes into jq.
|
|
142
|
+
.TP
|
|
143
|
+
\fB\-\-all\fR
|
|
144
|
+
Include high\-frequency streaming chunk events.
|
|
145
|
+
.IP \(bu 2
|
|
146
|
+
Answers 'I did a thing, did the expected thing happen?'. A flow that never fired shows as silence.
|
|
147
|
+
.IP \(bu 2
|
|
148
|
+
Does NOT show direct Sync REST writes (they do not broadcast); you see their consequences.
|
|
149
|
+
.IP \(bu 2
|
|
150
|
+
Events go to stdout, the banner to stderr, so grep and jq both behave. Runs until interrupted.
|
|
151
|
+
.IP \(bu 2
|
|
152
|
+
Needs a CLI token.
|
|
153
|
+
.PP
|
|
154
|
+
Exit codes: 0 stopped cleanly; 1 could not connect; 2 no CLI token.
|
|
155
|
+
.SS call
|
|
156
|
+
Call any build\-surface event directly. The escape hatch.
|
|
157
|
+
.PP
|
|
158
|
+
\fBoalo call <event> ['<json params>']\fR
|
|
159
|
+
.br
|
|
160
|
+
\fBoalo call \-\-list [text] [\-\-json]\fR
|
|
161
|
+
.br
|
|
162
|
+
.TP
|
|
163
|
+
\fB\-\-list [text]\fR
|
|
164
|
+
List the events you can call, from the workspace. With text, the matching events and the params each accepts.
|
|
165
|
+
.TP
|
|
166
|
+
\fB\-\-namespaces\fR
|
|
167
|
+
The events you may call, counted per namespace (what \fB\-\-list\fR with no text shows).
|
|
168
|
+
.TP
|
|
169
|
+
\fB\-\-compact\fR
|
|
170
|
+
Print the reply as one line of JSON.
|
|
171
|
+
.IP \(bu 2
|
|
172
|
+
The build surface has ~500 events. First\-class commands cover the common ones; this reaches the rest without a command per feature.
|
|
173
|
+
.IP \(bu 2
|
|
174
|
+
Params are a JSON object. Org and user identity come from your token, never the params, so a call cannot exceed what you can do.
|
|
175
|
+
.IP \(bu 2
|
|
176
|
+
\-\-list comes from the server's own handlers and is filtered to what you may call, so it never goes stale. On an older workspace it falls back to a list of namespaces.
|
|
177
|
+
.IP \(bu 2
|
|
178
|
+
An unknown event returns a clean error naming what you sent. An event that exists but gets the wrong params says which params it takes.
|
|
179
|
+
.IP \(bu 2
|
|
180
|
+
Example: oalo call loops:run_now '{"name":"Nurture"}'
|
|
181
|
+
.IP \(bu 2
|
|
182
|
+
Needs a CLI token.
|
|
183
|
+
.PP
|
|
184
|
+
Exit codes: 0 the call succeeded; 1 the call failed or was rejected; 2 bad arguments or no token.
|
|
185
|
+
.SS run
|
|
186
|
+
Fire a loop, or send a bot a test message, and watch what happens.
|
|
187
|
+
.PP
|
|
188
|
+
\fBoalo run loop <name> [\-\-env dev|prod] [\-\-watch]\fR
|
|
189
|
+
.br
|
|
190
|
+
\fBoalo run bot <id> "<message>"\fR
|
|
191
|
+
.br
|
|
192
|
+
.TP
|
|
193
|
+
\fB\-\-watch\fR
|
|
194
|
+
Stream events after firing. Default on for bots.
|
|
195
|
+
.TP
|
|
196
|
+
\fB\-\-timeout <s>\fR
|
|
197
|
+
How long to watch. Default 30.
|
|
198
|
+
.TP
|
|
199
|
+
\fB\-\-env dev|prod\fR
|
|
200
|
+
Which schema the loop runs against.
|
|
201
|
+
.TP
|
|
202
|
+
\fB\-\-app <slug>\fR
|
|
203
|
+
Only for a loop pinned to one app: that app's slug (\fBoalo apps\fR) or id. Loops are org\-wide by default.
|
|
204
|
+
.IP \(bu 2
|
|
205
|
+
IMPORTANT: \fBrun loop\fR fires the loop DIRECTLY and does NOT exercise its trigger binding. Triggers come from the event bus (a real form submission, a real inbound message). So this proves the loop body works; to test that its trigger is wired, use \fBoalo emit\fR.
|
|
206
|
+
.IP \(bu 2
|
|
207
|
+
bot ids accept an integer, a numeric string, or a public bot_ id.
|
|
208
|
+
.IP \(bu 2
|
|
209
|
+
Needs a CLI token.
|
|
210
|
+
.PP
|
|
211
|
+
Exit codes: 0 ran, or watch window elapsed; 1 the run failed to start; 2 bad arguments or no token.
|
|
212
|
+
.SS emit
|
|
213
|
+
Fire a domain event (form.submitted, order.created, ...) to test a loop's trigger.
|
|
214
|
+
.PP
|
|
215
|
+
\fBoalo emit <event type> [\-\-payload '<json>'] [\-\-contact <id>] [\-\-dry\-run] [\-\-json]\fR
|
|
216
|
+
.br
|
|
217
|
+
\fBoalo emit \-\-list [\-\-json]\fR
|
|
218
|
+
.br
|
|
219
|
+
.TP
|
|
220
|
+
\fB\-\-payload <json>\fR
|
|
221
|
+
The event's payload, a JSON object. \fBoalo emit \-\-list\fR shows each event's fields.
|
|
222
|
+
.TP
|
|
223
|
+
\fB\-\-contact <id>\fR
|
|
224
|
+
An existing contact the event is about. Never creates one.
|
|
225
|
+
.TP
|
|
226
|
+
\fB\-\-dry\-run\fR
|
|
227
|
+
List the loops it would fire, and emit nothing.
|
|
228
|
+
.TP
|
|
229
|
+
\fB\-\-list\fR
|
|
230
|
+
Every event a trigger can listen for, with its payload fields and the loops listening now.
|
|
231
|
+
.TP
|
|
232
|
+
\fB\-\-json\fR
|
|
233
|
+
Print the reply as JSON.
|
|
234
|
+
.IP \(bu 2
|
|
235
|
+
\fBoalo run loop\fR fires a loop directly and skips its trigger. emit goes through the real event bus, so it tests the trigger and its payload filter too.
|
|
236
|
+
.IP \(bu 2
|
|
237
|
+
The loops it fires do real things: send email or WhatsApp, mark invoices paid. Run \-\-dry\-run first.
|
|
238
|
+
.IP \(bu 2
|
|
239
|
+
Admins and members with Developer access only (an admin turns it on under Team). Events are tagged as coming from the CLI and posted to the team feed.
|
|
240
|
+
.IP \(bu 2
|
|
241
|
+
The type must be one a trigger can listen for; a typo gets a suggestion instead of vanishing.
|
|
242
|
+
.PP
|
|
243
|
+
Exit codes: 0 emitted (or dry run done); 1 refused or failed; 2 bad arguments or no token.
|
|
244
|
+
.SS data
|
|
245
|
+
Models and rows in this workspace: list, read, push (bulk upsert), delete, watch, promote, and make tables searchable by bots.
|
|
246
|
+
.PP
|
|
247
|
+
\fBoalo data models [\-\-json]\fR
|
|
248
|
+
.br
|
|
249
|
+
\fBoalo data models create <name> \-\-field name:type [\-\-field ...] [\-\-owned\-by <field>]\fR
|
|
250
|
+
.br
|
|
251
|
+
\fBoalo data list <table> [\-\-since N] [\-\-limit N] [\-\-include\-deleted] [\-\-json]\fR
|
|
252
|
+
.br
|
|
253
|
+
\fBoalo data get <table> <id> [\-\-json]\fR
|
|
254
|
+
.br
|
|
255
|
+
\fBoalo data push <table> <file.csv|.json|.jsonl> [\-\-id\-field id] [\-\-format csv|json|jsonl] [\-\-types] [\-\-from N] [\-\-new\-ids] [\-\-dry\-run] [\-\-json]\fR
|
|
256
|
+
.br
|
|
257
|
+
\fBoalo data delete <table> <id>\fR
|
|
258
|
+
.br
|
|
259
|
+
\fBoalo data watch <table> [\-\-since N] [\-\-json]\fR
|
|
260
|
+
.br
|
|
261
|
+
\fBoalo data promote <table>\fR
|
|
262
|
+
.br
|
|
263
|
+
\fBoalo data routes [\-\-json]\fR
|
|
264
|
+
.br
|
|
265
|
+
\fBoalo data events <table> created [updated] | \-\-off\fR
|
|
266
|
+
.br
|
|
267
|
+
\fBoalo data vectorize <table> [\-\-fields a,b] [\-\-where '<field> in a,b'] [\-\-describe '<text>'] [\-\-id <column>] [\-\-json]\fR
|
|
268
|
+
.br
|
|
269
|
+
\fBoalo data vectorize <table> \-\-off\fR
|
|
270
|
+
.br
|
|
271
|
+
\fBoalo data keep\-from\-ai <table> [<field,...>] [\-\-off] [\-\-json]\fR
|
|
272
|
+
.br
|
|
273
|
+
.TP
|
|
274
|
+
\fB\-\-env dev|prod\fR
|
|
275
|
+
Which schema. Default: the project's link, else dev. Writing to prod needs \-\-env prod on the command line.
|
|
276
|
+
.TP
|
|
277
|
+
\fB\-\-since N\fR
|
|
278
|
+
list, watch: only rows changed after this sequence number.
|
|
279
|
+
.TP
|
|
280
|
+
\fB\-\-limit N\fR
|
|
281
|
+
list: how many rows (the server caps it).
|
|
282
|
+
.TP
|
|
283
|
+
\fB\-\-order seqnum|\-seqnum\fR
|
|
284
|
+
list: oldest change first (the default), or newest first.
|
|
285
|
+
.TP
|
|
286
|
+
\fB\-\-include\-deleted\fR
|
|
287
|
+
list: include deleted rows.
|
|
288
|
+
.TP
|
|
289
|
+
\fB\-\-format csv|json|jsonl\fR
|
|
290
|
+
push: the file's format, when its extension doesn't say.
|
|
291
|
+
.TP
|
|
292
|
+
\fB\-\-field name:type\fR
|
|
293
|
+
models create: a field. Repeat it, or comma\-separate. Types: string text integer float boolean datetime date json list references:<table>.
|
|
294
|
+
.TP
|
|
295
|
+
\fB\-\-owned\-by <field>\fR
|
|
296
|
+
models create: rows belong to the app user in this field (each member sees only their own). Without it the model is shared.
|
|
297
|
+
.TP
|
|
298
|
+
\fB\-\-id\-field <name>\fR
|
|
299
|
+
push: which field holds each record's id (default id). Re\-sending a record updates it.
|
|
300
|
+
.TP
|
|
301
|
+
\fB\-\-types\fR
|
|
302
|
+
push, CSV only: turn plain numbers, true/false and empty cells into numbers, booleans and null. Off by default so ids like 007 stay text.
|
|
303
|
+
.TP
|
|
304
|
+
\fB\-\-from N\fR
|
|
305
|
+
push: skip the first N records, to resume a push that stopped.
|
|
306
|
+
.TP
|
|
307
|
+
\fB\-\-new\-ids\fR
|
|
308
|
+
push: let the server make ids for records without one. A re\-send then adds copies.
|
|
309
|
+
.TP
|
|
310
|
+
\fB\-\-dry\-run\fR
|
|
311
|
+
push: parse, check the model exists, show the first row, write nothing.
|
|
312
|
+
.TP
|
|
313
|
+
\fB\-\-fields a,b\fR
|
|
314
|
+
vectorize: the fields (a model's) or columns (a plain table's) whose text bots search. Turns it on, and embeds the existing rows.
|
|
315
|
+
.TP
|
|
316
|
+
\fB\-\-where <filter>\fR
|
|
317
|
+
vectorize, models only: embed only matching rows. \fBstatus in active,draft\fR, \fBstatus not in archived\fR, \fBstatus = active\fR, \fBstatus != archived\fR, \fBcover present\fR, \fBcover absent\fR.
|
|
318
|
+
.TP
|
|
319
|
+
\fB\-\-describe <text>\fR
|
|
320
|
+
vectorize: what the table holds. Bots see its first 120 characters when deciding what to search.
|
|
321
|
+
.TP
|
|
322
|
+
\fB\-\-id <column>\fR
|
|
323
|
+
vectorize, plain tables: the unique column each row is keyed by (default id).
|
|
324
|
+
.TP
|
|
325
|
+
\fB\-\-off\fR
|
|
326
|
+
events, vectorize: turn it off. keep\-from\-ai: take the named fields off the list, or all of them when none are named.
|
|
327
|
+
.TP
|
|
328
|
+
\fB\-\-json\fR
|
|
329
|
+
Print the reply as JSON.
|
|
330
|
+
.IP \(bu 2
|
|
331
|
+
dev is a sandbox; live apps read prod. Push to dev, check it, then \fBoalo data promote <table>\fR copies dev rows to prod.
|
|
332
|
+
.IP \(bu 2
|
|
333
|
+
Reads use the saved data token (read\-only). Row writes use a write token limited to the tables written, made as you over the CLI token the first time you write a table and saved beside it (\fBoalo tokens list\fR shows it; it expires in 30 days).
|
|
334
|
+
.IP \(bu 2
|
|
335
|
+
models create and promote run as you over the CLI token, so they follow your dashboard access.
|
|
336
|
+
.IP \(bu 2
|
|
337
|
+
push sends up to 1,000 rows per request, waits out the rate limit (120 writes a minute), retries network errors, and lists rows the server rejected.
|
|
338
|
+
.IP \(bu 2
|
|
339
|
+
Every write syncs to apps on that schema at once. A delete marks the row deleted; it leaves synced apps.
|
|
340
|
+
.IP \(bu 2
|
|
341
|
+
The exact contract: \fBoalo data routes\fR, or the OpenAPI spec at <workspace>/api/docs.
|
|
342
|
+
.IP \(bu 2
|
|
343
|
+
vectorize works on an Oalo model (both schemas) or a table the app made (the \-\-env schema). With no flags it shows the status: fields, filter, rows embedded. New and edited rows are embedded within 15 minutes, whoever writes them. Then attach it to a bot with \fBoalo bots knowledge <bot> \-\-add <table>\fR.
|
|
344
|
+
.IP \(bu 2
|
|
345
|
+
vectorize sends the text of the chosen fields to the embedding provider (Voyage); a bot's answer sends the rows its search finds to its AI model. Leave out fields that shouldn't leave Oalo.
|
|
346
|
+
.IP \(bu 2
|
|
347
|
+
keep\-from\-ai names fields a bot's data tools (data_search, data_related, table_search, search) leave out of what they hand its AI model, and that can't be embedded. They're still stored, synced to your apps, and read by workflows. A field that's embedded now has to be vectorized away first. With no fields, the list.
|
|
348
|
+
.PP
|
|
349
|
+
Exit codes: 0 done; 1 failed, or some rows were rejected; 2 bad arguments or no token.
|
|
350
|
+
.SS incidents
|
|
351
|
+
A live app's outages and restart bursts, as Oalo's uptime check saw them, newest first.
|
|
352
|
+
.PP
|
|
353
|
+
\fBoalo incidents [\-\-app <slug>] [\-\-all] [\-\-json]\fR
|
|
354
|
+
.br
|
|
355
|
+
.TP
|
|
356
|
+
\fB\-\-app <slug>\fR
|
|
357
|
+
The app. Default: the one saved with \fBoalo link \-\-app\fR.
|
|
358
|
+
.TP
|
|
359
|
+
\fB\-\-all\fR
|
|
360
|
+
Show the details of closed incidents too (open ones always show them).
|
|
361
|
+
.TP
|
|
362
|
+
\fB\-\-json\fR
|
|
363
|
+
The reply as JSON.
|
|
364
|
+
.IP \(bu 2
|
|
365
|
+
Oalo checks each live server app every minute: its port answers (and .oalo/app.json's health path, when set), and how often Docker restarted its processes. An incident opens after 3 failed checks in a row, or 3 restarts in 10 minutes; it closes after 2 good checks.
|
|
366
|
+
.IP \(bu 2
|
|
367
|
+
Each one says what was seen: which process, how many restarts, a memory kill with the size and the fix, the exit code, and the last log lines. The workspace is told in the dashboard's bell and by email (each person can turn that off under Notifications).
|
|
368
|
+
.PP
|
|
369
|
+
Exit codes: 0 no open incident; 1 an incident is open, or the request failed; 2 bad arguments or no CLI token.
|
|
370
|
+
.SS db
|
|
371
|
+
All of an env's data as plain SQL (every app's own tables and the Oalo models), to keep a copy or take it anywhere.
|
|
372
|
+
.PP
|
|
373
|
+
\fBoalo db dump [\-\-env dev|prod] [\-\-out <file.sql>] [\-\-force]\fR
|
|
374
|
+
.br
|
|
375
|
+
.TP
|
|
376
|
+
\fB\-\-env dev|prod\fR
|
|
377
|
+
Which env's data. Default prod.
|
|
378
|
+
.TP
|
|
379
|
+
\fB\-\-out <file.sql>\fR
|
|
380
|
+
Where to write it. Default <workspace>\-<env>\-<date>.sql here.
|
|
381
|
+
.TP
|
|
382
|
+
\fB\-\-force\fR
|
|
383
|
+
Replace the file if it exists.
|
|
384
|
+
.IP \(bu 2
|
|
385
|
+
Workspace admins only: it holds every member's data. Restore it into any Postgres with psql \-f.
|
|
386
|
+
.IP \(bu 2
|
|
387
|
+
Your code is in git (oalo deploy \-\-pull); this is the data. Together they are everything you need to run your apps elsewhere.
|
|
388
|
+
.PP
|
|
389
|
+
Exit codes: 0 a whole dump was written; 1 refused, unreachable, or cut off (the partial file is removed); 2 bad arguments, the file exists, or no CLI token.
|
|
390
|
+
.SS metrics
|
|
391
|
+
A number from the workspace's data: count, sum or average over a model's rows, events or contacts, grouped or over time.
|
|
392
|
+
.PP
|
|
393
|
+
\fBoalo metrics <model | events | contacts> [\-\-sum|\-\-avg|\-\-min|\-\-max|\-\-distinct <field>] [\-\-by <field>] [\-\-every day|week|month] [\-\-days N] [\-\-where <filter>] [\-\-json]\fR
|
|
394
|
+
.br
|
|
395
|
+
.TP
|
|
396
|
+
\fB\-\-sum <field>\fR
|
|
397
|
+
The sum of a number field. Also \-\-avg, \-\-min, \-\-max, and \-\-distinct (how many different values). Default: count the rows.
|
|
398
|
+
.TP
|
|
399
|
+
\fB\-\-avg <field>\fR
|
|
400
|
+
The average of a number field.
|
|
401
|
+
.TP
|
|
402
|
+
\fB\-\-min <field>\fR
|
|
403
|
+
The lowest value of a number field.
|
|
404
|
+
.TP
|
|
405
|
+
\fB\-\-max <field>\fR
|
|
406
|
+
The highest value of a number field.
|
|
407
|
+
.TP
|
|
408
|
+
\fB\-\-distinct <field>\fR
|
|
409
|
+
How many different values a field has.
|
|
410
|
+
.TP
|
|
411
|
+
\fB\-\-by <field>\fR
|
|
412
|
+
Group by a field, largest first. Contacts group by status, source or custom_fields.<name>.
|
|
413
|
+
.TP
|
|
414
|
+
\fB\-\-every <day|week|month>\fR
|
|
415
|
+
Over time, one row per day, week or month.
|
|
416
|
+
.TP
|
|
417
|
+
\fB\-\-days N\fR
|
|
418
|
+
The window, ending now. Default: all time.
|
|
419
|
+
.TP
|
|
420
|
+
\fB\-\-where <filter>\fR
|
|
421
|
+
Only matching rows: "status = paid and total > 100". Also !=, >=, <, <=, ~ (contains), in a,b, present, absent.
|
|
422
|
+
.TP
|
|
423
|
+
\fB\-\-event <type>\fR
|
|
424
|
+
events: one type, like order.created. Default: every type.
|
|
425
|
+
.TP
|
|
426
|
+
\fB\-\-time <created|changed|field>\fR
|
|
427
|
+
A model row counts at when it was created (default), last changed, or one of its date fields.
|
|
428
|
+
.TP
|
|
429
|
+
\fB\-\-compare\fR
|
|
430
|
+
Also the same over the window before (needs \-\-days).
|
|
431
|
+
.TP
|
|
432
|
+
\fB\-\-env dev|prod\fR
|
|
433
|
+
A model's live (default) or dev data.
|
|
434
|
+
.TP
|
|
435
|
+
\fB\-\-json\fR
|
|
436
|
+
The answer as JSON.
|
|
437
|
+
.IP \(bu 2
|
|
438
|
+
The same query the dashboards draw. Model rows count at when they were created, stamped by the server; rows from before the stamp are counted as untracked.
|
|
439
|
+
.IP \(bu 2
|
|
440
|
+
A model's fields are checked: \fBoalo data models\fR lists them. An app's server asks the same with queryMetric from \fBoalo typegen\fR (see \fBoalo docs dashboards\fR).
|
|
441
|
+
.PP
|
|
442
|
+
Exit codes: 0 done; 1 the query failed; 2 bad arguments or no CLI token.
|
|
443
|
+
.SS dashboards
|
|
444
|
+
The workspace's dashboards, and a chart put on one (made when no dashboard has that name).
|
|
445
|
+
.PP
|
|
446
|
+
\fBoalo dashboards [\-\-json]\fR
|
|
447
|
+
.br
|
|
448
|
+
\fBoalo dashboards add <dashboard> <model | events | contacts> \-\-title "<title>" \-\-kind number|line|bars|table [metrics flags] [\-\-app <slug>] [\-\-width 1|2|3]\fR
|
|
449
|
+
.br
|
|
450
|
+
\fBoalo dashboards add <dashboard> \-\-title "<title>" \-\-kind funnel \-\-steps a,b,c [\-\-days N]\fR
|
|
451
|
+
.br
|
|
452
|
+
.TP
|
|
453
|
+
\fB\-\-title <title>\fR
|
|
454
|
+
The chart's title. A chart with the same title on that dashboard is replaced.
|
|
455
|
+
.TP
|
|
456
|
+
\fB\-\-kind <kind>\fR
|
|
457
|
+
number (a total; \-\-compare adds the window before), line (needs \-\-every), bars (needs \-\-by), table, funnel.
|
|
458
|
+
.TP
|
|
459
|
+
\fB\-\-steps a,b\fR
|
|
460
|
+
funnel: event types, in order.
|
|
461
|
+
.TP
|
|
462
|
+
\fB\-\-width <1|2|3>\fR
|
|
463
|
+
Columns of three.
|
|
464
|
+
.TP
|
|
465
|
+
\fB\-\-app <slug>\fR
|
|
466
|
+
A dashboard made now shows on this app too (its Dashboard tab).
|
|
467
|
+
.TP
|
|
468
|
+
\fB\-\-json\fR
|
|
469
|
+
The answer as JSON.
|
|
470
|
+
.IP \(bu 2
|
|
471
|
+
add runs the query first and refuses one that can't draw, then prints its numbers. It changes what everyone with access sees.
|
|
472
|
+
.IP \(bu 2
|
|
473
|
+
The flags after the model are the same as oalo metrics.
|
|
474
|
+
.PP
|
|
475
|
+
Exit codes: 0 done; 1 the request failed; 2 bad arguments or no CLI token.
|
|
476
|
+
.SS products
|
|
477
|
+
What the workspace sells (Oalo commerce on its own Stripe account): list, create, rename, change a price, archive, and see orders.
|
|
478
|
+
.PP
|
|
479
|
+
\fBoalo products [\-\-all] [\-\-json]\fR
|
|
480
|
+
.br
|
|
481
|
+
\fBoalo products create <id> \-\-name "<name>" \-\-price <amount> \-\-once|\-\-monthly|\-\-yearly [\-\-trial <days>] [\-\-currency <code>] [\-\-description <text>] [\-\-live] [\-\-yes]\fR
|
|
482
|
+
.br
|
|
483
|
+
\fBoalo products edit <id> [\-\-name "<name>"] [\-\-description <text>]\fR
|
|
484
|
+
.br
|
|
485
|
+
\fBoalo products price <id> <amount> [\-\-yes]\fR
|
|
486
|
+
.br
|
|
487
|
+
\fBoalo products archive <id> \-\-yes\fR
|
|
488
|
+
.br
|
|
489
|
+
\fBoalo products delete <id> \-\-yes\fR
|
|
490
|
+
.br
|
|
491
|
+
\fBoalo products orders [<id>] [\-\-limit N]\fR
|
|
492
|
+
.br
|
|
493
|
+
.TP
|
|
494
|
+
\fB\-\-name <name>\fR
|
|
495
|
+
create, edit: the name buyers see.
|
|
496
|
+
.TP
|
|
497
|
+
\fB\-\-price <amount>\fR
|
|
498
|
+
create: the price, like 9.99.
|
|
499
|
+
.TP
|
|
500
|
+
\fB\-\-once\fR
|
|
501
|
+
create: paid once.
|
|
502
|
+
.TP
|
|
503
|
+
\fB\-\-monthly\fR
|
|
504
|
+
create: a subscription, billed every month.
|
|
505
|
+
.TP
|
|
506
|
+
\fB\-\-yearly\fR
|
|
507
|
+
create: a subscription, billed every year.
|
|
508
|
+
.TP
|
|
509
|
+
\fB\-\-trial <days>\fR
|
|
510
|
+
create: free days before a subscription's first charge.
|
|
511
|
+
.TP
|
|
512
|
+
\fB\-\-currency <code>\fR
|
|
513
|
+
create: ISO code, like EUR. Default USD.
|
|
514
|
+
.TP
|
|
515
|
+
\fB\-\-description <text>\fR
|
|
516
|
+
create, edit: shown on the checkout page.
|
|
517
|
+
.TP
|
|
518
|
+
\fB\-\-live\fR
|
|
519
|
+
create: on your live Stripe key (real charges). Without it, the test key.
|
|
520
|
+
.TP
|
|
521
|
+
\fB\-\-yes\fR
|
|
522
|
+
Go ahead: needed for archive and delete, for \-\-live, and for a price over 500.
|
|
523
|
+
.TP
|
|
524
|
+
\fB\-\-all\fR
|
|
525
|
+
list: archived products too.
|
|
526
|
+
.TP
|
|
527
|
+
\fB\-\-limit N\fR
|
|
528
|
+
orders: how many, newest first. Default 50.
|
|
529
|
+
.TP
|
|
530
|
+
\fB\-\-json\fR
|
|
531
|
+
The reply as JSON.
|
|
532
|
+
.IP \(bu 2
|
|
533
|
+
The id (premium, pro_yearly) is what code uses: BuyButton productId, a row's product_id (with availability product), and a member's purchased_products. \fBoalo typegen\fR writes the ids as PRODUCTS and the ProductId type (Dart: the Products class), so a typo fails to compile.
|
|
534
|
+
.IP \(bu 2
|
|
535
|
+
Payments run on the workspace's own Stripe key (Payment settings). A product made with the test key is bought with test cards only.
|
|
536
|
+
.IP \(bu 2
|
|
537
|
+
price makes a new Stripe price and archives the old one: new buyers pay the new price, existing subscriptions keep theirs.
|
|
538
|
+
.IP \(bu 2
|
|
539
|
+
archive stops a product being sold; its orders stay and its buyers keep access. delete is for an archived product nobody bought, and frees its id.
|
|
540
|
+
.IP \(bu 2
|
|
541
|
+
PayPal, Apple and Google prices are set up from the dashboard's Storefront or by asking the builder.
|
|
542
|
+
.PP
|
|
543
|
+
Exit codes: 0 done; 1 the request failed; 2 bad arguments, a confirmation (\-\-yes) needed, or no CLI token.
|
|
544
|
+
.SS channels
|
|
545
|
+
Every channel the workspace has (WhatsApp, Instagram, email, web chat) and which bot answers each; change the bot, check or connect a number.
|
|
546
|
+
.PP
|
|
547
|
+
\fBoalo channels [\-\-json]\fR
|
|
548
|
+
.br
|
|
549
|
+
\fBoalo channels set whatsapp|instagram <number or @account> \-\-bot <bot>\fR
|
|
550
|
+
.br
|
|
551
|
+
\fBoalo channels check whatsapp <number>\fR
|
|
552
|
+
.br
|
|
553
|
+
\fBoalo channels connect whatsapp \-\-bot <bot>\fR
|
|
554
|
+
.br
|
|
555
|
+
\fBoalo channels connect instagram\fR
|
|
556
|
+
.br
|
|
557
|
+
\fBoalo channels disconnect whatsapp|instagram <number or @account> \-\-yes\fR
|
|
558
|
+
.br
|
|
559
|
+
.TP
|
|
560
|
+
\fB\-\-bot <bot>\fR
|
|
561
|
+
The bot's public id (\fBoalo bots\fR lists them).
|
|
562
|
+
.TP
|
|
563
|
+
\fB\-\-yes\fR
|
|
564
|
+
Go ahead with disconnect. Without it, disconnect only says what it would do.
|
|
565
|
+
.TP
|
|
566
|
+
\fB\-\-json\fR
|
|
567
|
+
The reply as JSON.
|
|
568
|
+
.IP \(bu 2
|
|
569
|
+
A WhatsApp number can be given as shown (+54 9 11 5555\-0100), as its digits, or by its id; an Instagram account as @username or its id.
|
|
570
|
+
.IP \(bu 2
|
|
571
|
+
WhatsApp numbers and Instagram accounts are kept by the platform, where Meta's messages arrive; your Base asks it. Email is the sending address (no bot answers it); the web chat is each published bot's own widget.
|
|
572
|
+
.IP \(bu 2
|
|
573
|
+
connect prints a link to open in a browser, because Meta's own sign\-in has to run there. The WhatsApp link is for you only and works for a few minutes.
|
|
574
|
+
.IP \(bu 2
|
|
575
|
+
Changes (set, connect, disconnect) are for workspace admins. Reading is for admins and members with Developer access. Disconnecting stops the bot answering at once; the conversations stay in the Inbox.
|
|
576
|
+
.PP
|
|
577
|
+
Exit codes: 0 done (check: Oalo can send on the number); 1 the request failed, or check found it can't send; 2 bad arguments or no CLI token.
|
|
578
|
+
.SS setup
|
|
579
|
+
The setup agent on your Base makes an app run that Oalo can't run on its own, on a branch you then accept or reject.
|
|
580
|
+
.PP
|
|
581
|
+
\fBoalo setup [\-\-app <slug>]\fR
|
|
582
|
+
.br
|
|
583
|
+
\fBoalo setup status [\-\-app <slug>] [\-\-json]\fR
|
|
584
|
+
.br
|
|
585
|
+
\fBoalo setup accept [\-\-app <slug>]\fR
|
|
586
|
+
.br
|
|
587
|
+
\fBoalo setup reject [\-\-app <slug>]\fR
|
|
588
|
+
.br
|
|
589
|
+
\fBoalo setup auto on|off [\-\-app <slug>]\fR
|
|
590
|
+
.br
|
|
591
|
+
.TP
|
|
592
|
+
\fB\-\-app <slug>\fR
|
|
593
|
+
The app. Default: the one saved with \fBoalo link \-\-app\fR.
|
|
594
|
+
.TP
|
|
595
|
+
\fB\-\-json\fR
|
|
596
|
+
The reply as JSON.
|
|
597
|
+
.IP \(bu 2
|
|
598
|
+
The agent works in the app's folder on a branch, oalo/setup: it reads the repo and adds what's missing (a Procfile, a Dockerfile, .oalo/app.json, a fix for a hard\-coded port), the smallest change that makes it run. It never writes a secret; it names the variables to set.
|
|
599
|
+
.IP \(bu 2
|
|
600
|
+
Oalo checks each attempt itself: the app is detected and, for a server app, installed, its \fBrelease:\fR run, and its preview answering. Up to 6 attempts and a dollar budget (shown), then it stops and says why.
|
|
601
|
+
.IP \(bu 2
|
|
602
|
+
When it runs, the preview shows the branch. accept makes its commits the app's code (a fast\-forward); reject throws them away. Deploys wait until then.
|
|
603
|
+
.IP \(bu 2
|
|
604
|
+
status has the agent's report: what the app is, what it changed and why, variables to set, whether it can run as several copies, what it couldn't fix.
|
|
605
|
+
.IP \(bu 2
|
|
606
|
+
auto on: a dev deploy that finds nothing runnable, or a preview that doesn't run, starts one by itself. Off by default.
|
|
607
|
+
.IP \(bu 2
|
|
608
|
+
Admins and members with Developer access only.
|
|
609
|
+
.PP
|
|
610
|
+
Exit codes: 0 done; 1 refused, or (status) the last setup failed; 2 bad arguments or no CLI token.
|
|
611
|
+
.SS sources
|
|
612
|
+
Feeds that send Oalo rows from outside (another system, a webhook, an export), keeping only the fields you choose.
|
|
613
|
+
.PP
|
|
614
|
+
\fBoalo sources [list] [\-\-json]\fR
|
|
615
|
+
.br
|
|
616
|
+
\fBoalo sources create <name> \-\-from <sample.csv|.json|.jsonl> [\-\-table <new model>] [\-\-id\-field <field>] [\-\-mode upsert|snapshot] [\-\-auth bearer|hmac|url] [\-\-env dev|prod]\fR
|
|
617
|
+
.br
|
|
618
|
+
\fBoalo sources create <name> \-\-table <existing model or table> [\-\-fields a,b] [\-\-id\-field <field>] [\-\-auth bearer|hmac|url]\fR
|
|
619
|
+
.br
|
|
620
|
+
\fB (either form) [\-\-keep\-from\-ai a,b] [\-\-retention <days>]\fR
|
|
621
|
+
.br
|
|
622
|
+
\fBoalo sources show <name> [\-\-json]\fR
|
|
623
|
+
.br
|
|
624
|
+
\fBoalo sources create <name> \-\-bot <bot> [\-\-auth bearer|hmac|url]\fR
|
|
625
|
+
.br
|
|
626
|
+
\fBoalo sources push <name> <file.csv|.json|.jsonl> [\-\-json]\fR
|
|
627
|
+
.br
|
|
628
|
+
\fBoalo sources push <name> <doc.pdf|.docx|.md|.html|.txt> [more...] [\-\-json]\fR
|
|
629
|
+
.br
|
|
630
|
+
\fBoalo sources remove <name> <document>\fR
|
|
631
|
+
.br
|
|
632
|
+
\fBoalo sources fetch <name> <https url> [\-\-every <minutes>] [\-\-header <"Name: value">] [\-\-records\-at <path>] [\-\-document <name>] [\-\-now]\fR
|
|
633
|
+
.br
|
|
634
|
+
\fBoalo sources fetch <name> <postgres url> \-\-relation <schema.view> [\-\-key <column>] [\-\-cursor <column>] [\-\-every <minutes>] [\-\-now]\fR
|
|
635
|
+
.br
|
|
636
|
+
\fBoalo sources fetch <name> \-\-now | \-\-off\fR
|
|
637
|
+
.br
|
|
638
|
+
\fBoalo sources fields <name> a,b\fR
|
|
639
|
+
.br
|
|
640
|
+
\fBoalo sources retention <name> <days|off>\fR
|
|
641
|
+
.br
|
|
642
|
+
\fBoalo sources rotate <name>\fR
|
|
643
|
+
.br
|
|
644
|
+
\fBoalo sources delete <name> [\-\-wipe]\fR
|
|
645
|
+
.br
|
|
646
|
+
.TP
|
|
647
|
+
\fB\-\-from <file>\fR
|
|
648
|
+
create: a sample of what the sender sends. Its fields and their types make the source's fields and a new model (\-\-table, default the source's name).
|
|
649
|
+
.TP
|
|
650
|
+
\fB\-\-bot <bot>\fR
|
|
651
|
+
create: send documents into this bot's knowledge (its public id, from oalo bots) instead of rows into a table. Each upload is one document by name; the same name replaces it.
|
|
652
|
+
.TP
|
|
653
|
+
\fB\-\-table <model>\fR
|
|
654
|
+
create: the model or plain table the rows go to (a table the app made with its own SQL, or an import kept as it is). An existing one keeps all its fields or columns, or the ones in \-\-fields. A plain table's \-\-id\-field must be a unique column.
|
|
655
|
+
.TP
|
|
656
|
+
\fB\-\-keep\-from\-ai a,b\fR
|
|
657
|
+
create: fields stored and synced but never handed to a bot's AI model (see oalo data keep\-from\-ai).
|
|
658
|
+
.TP
|
|
659
|
+
\fB\-\-retention <days>\fR
|
|
660
|
+
create, a new model only: drop rows the source hasn't sent in this many days (1 to 3650), each night. Rows added by hand stay.
|
|
661
|
+
.TP
|
|
662
|
+
\fB\-\-fields a,b\fR
|
|
663
|
+
create, existing model: keep only these fields. Anything else a sender sends is dropped, never stored.
|
|
664
|
+
.TP
|
|
665
|
+
\fB\-\-id\-field <field>\fR
|
|
666
|
+
create: the field that identifies a record (default id). A record sent again updates its row.
|
|
667
|
+
.TP
|
|
668
|
+
\fB\-\-mode snapshot\fR
|
|
669
|
+
create: each upload is the whole set, and rows it leaves out are deleted. Only for a model the source makes. Default upsert.
|
|
670
|
+
.TP
|
|
671
|
+
\fB\-\-auth bearer|hmac|url\fR
|
|
672
|
+
create: how a sender proves it's allowed. bearer (default): Authorization: Bearer <secret>. hmac: a signature header over the raw body (\-\-hmac\-header, default x\-signature; \-\-hmac\-format sha256=hex, hex or base64), for tools that sign their webhooks. url: the secret is the last part of the address, for tools that can only send to an address.
|
|
673
|
+
.TP
|
|
674
|
+
\fB\-\-env dev|prod\fR
|
|
675
|
+
create: which copy of the model the rows go to. Default prod.
|
|
676
|
+
.TP
|
|
677
|
+
\fB\-\-every <minutes>\fR
|
|
678
|
+
fetch: how often Oalo fetches the address, 5 to 10080 minutes. Default 60.
|
|
679
|
+
.TP
|
|
680
|
+
\fB\-\-header <value>\fR
|
|
681
|
+
fetch: a request header, "Name: value" (an API key, say: \-\-header "Authorization: Bearer $KEY"). Repeat it for more, up to 10. Sealed on the server; show prints only the names. Left out, the ones set before stay; \-\-header "" clears them.
|
|
682
|
+
.TP
|
|
683
|
+
\fB\-\-records\-at <path>\fR
|
|
684
|
+
fetch, a table's source: the records are the list at this key of the JSON answer (data.items).
|
|
685
|
+
.TP
|
|
686
|
+
\fB\-\-document <name>\fR
|
|
687
|
+
fetch, a knowledge source: the document's name (default the address's last part).
|
|
688
|
+
.TP
|
|
689
|
+
\fB\-\-relation <name>\fR
|
|
690
|
+
fetch, a postgres:// address: the view (or table) to read, like public.orders_for_oalo. Write a view of just the columns to share.
|
|
691
|
+
.TP
|
|
692
|
+
\fB\-\-key <column>\fR
|
|
693
|
+
fetch, a postgres:// address: the view's column that identifies a row. Default the source's id field.
|
|
694
|
+
.TP
|
|
695
|
+
\fB\-\-cursor <column>\fR
|
|
696
|
+
fetch, a postgres:// address: a column that grows as rows change (updated_at). Each run then reads only rows past the last one seen, up to 50,000. Without it, each run reads the whole view (up to 200,000 rows), so a snapshot source deletes what the view no longer has.
|
|
697
|
+
.TP
|
|
698
|
+
\fB\-\-now\fR
|
|
699
|
+
fetch: fetch once now, and say what was stored.
|
|
700
|
+
.TP
|
|
701
|
+
\fB\-\-off\fR
|
|
702
|
+
fetch: stop fetching.
|
|
703
|
+
.TP
|
|
704
|
+
\fB\-\-wipe\fR
|
|
705
|
+
delete: also delete the rows, when the source made the model.
|
|
706
|
+
.TP
|
|
707
|
+
\fB\-\-json\fR
|
|
708
|
+
The reply as JSON.
|
|
709
|
+
.IP \(bu 2
|
|
710
|
+
A sender posts JSON (an object or an array), NDJSON or CSV to the source's address. Keys and CSV headers are snake\-cased as the CSV import does it, so "Order ID" and order_id are one field.
|
|
711
|
+
.IP \(bu 2
|
|
712
|
+
The secret is shown when the source is made, and by rotate; it only writes. Each upload answers what it stored, rejected and dropped, is listed in show, and fires source.<name>.received for workflows.
|
|
713
|
+
.IP \(bu 2
|
|
714
|
+
Rows sync to your apps at once and fire the model's row events, as Sync API writes do. Up to 10,000 records a request, 120 requests a minute per source, 200,000 rows a day per workspace.
|
|
715
|
+
.IP \(bu 2
|
|
716
|
+
push sends a file from here, over your CLI token, in batches of 1,000; in snapshot mode the rows missing from the whole file are deleted after its last batch.
|
|
717
|
+
.IP \(bu 2
|
|
718
|
+
A \-\-bot source takes one document an upload: the file as the body named by ?name= (or an X\-Document\-Name header, or a form upload), or JSON {"name", "text"}. Its text is read on arrival, so a file without text (a scanned PDF) is refused then. Oalo keeps the text, not the file. DELETE to the address with ?name= removes a document. The bot answers from it once indexed, live at once (bots have no draft knowledge).
|
|
719
|
+
.IP \(bu 2
|
|
720
|
+
fetch from a postgres:// address reads a view in your own database: tested when set (connected, columns read), then on the schedule. Public addresses only, TLS required, a read\-only session with a 30 s statement timeout, opened per run. The address, password included, is sealed; show prints it without the password. Pass it from an environment variable ("$ORDERS_DB_URL") to keep it out of your shell history.
|
|
721
|
+
.IP \(bu 2
|
|
722
|
+
fetch is for a system that can't post: Oalo GETs the address on a schedule and stores the answer as a post would be (JSON, NDJSON or CSV by its Content\-Type; a knowledge source's document). Public https addresses only, up to 3 redirects, 10 MB. An answer that hasn't changed is skipped. show has the last run and its error.
|
|
723
|
+
.IP \(bu 2
|
|
724
|
+
Into a plain table, each record writes only the columns it has, cast by Postgres to the column's type; a value that doesn't fit rejects that record and says why. Snapshot, retention and delete \-\-wipe are for a model the source made.
|
|
725
|
+
.PP
|
|
726
|
+
Exit codes: 0 done; 1 refused, failed, or some records were rejected; 2 bad arguments or no CLI token.
|
|
727
|
+
.SS bots
|
|
728
|
+
The workspace's bots: the tables each can search, and every setting (knowledge, memory, model, replies, limits).
|
|
729
|
+
.PP
|
|
730
|
+
\fBoalo bots [\-\-json]\fR
|
|
731
|
+
.br
|
|
732
|
+
\fBoalo bots knowledge <bot> [\-\-json]\fR
|
|
733
|
+
.br
|
|
734
|
+
\fBoalo bots knowledge <bot> \-\-add <source> [\-\-add ...] [\-\-remove <source>] [\-\-json]\fR
|
|
735
|
+
.br
|
|
736
|
+
\fBoalo bots tools <bot> [\-\-add <tool>] [\-\-remove <tool>] [\-\-json]\fR
|
|
737
|
+
.br
|
|
738
|
+
\fBoalo bots settings <bot> [\-\-json]\fR
|
|
739
|
+
.br
|
|
740
|
+
\fBoalo bots settings <bot> set key=value [key=value ...] [\-\-yes] [\-\-dry\-run] [\-\-json]\fR
|
|
741
|
+
.br
|
|
742
|
+
\fBoalo bots settings \-\-explain [<key> | <group>] [\-\-json]\fR
|
|
743
|
+
.br
|
|
744
|
+
.TP
|
|
745
|
+
\fBtools \-\-add <tool>\fR
|
|
746
|
+
Let the bot call one of the workspace's tools, by name. Your server apps' own endpoints are listed once a deploy reads their .oalo/app.json (see \fBoalo docs app\-tools\fR). \-\-remove takes it away.
|
|
747
|
+
.TP
|
|
748
|
+
\fB\-\-add <source>\fR
|
|
749
|
+
knowledge: attach a searchable table: its handle (model:products, table:prod.faq) or just its name when that's unique. Repeat it, or comma\-separate.
|
|
750
|
+
.TP
|
|
751
|
+
\fB\-\-remove <source>\fR
|
|
752
|
+
Detach one. The table stays searchable for other bots.
|
|
753
|
+
.TP
|
|
754
|
+
\fBset key=value\fR
|
|
755
|
+
settings: change one or more. A value starting with @ is read from that file (for the frame). none, default or an empty value clears a setting where its help says so.
|
|
756
|
+
.TP
|
|
757
|
+
\fB\-\-yes\fR
|
|
758
|
+
settings set: apply to a published bot. Without it a published bot's change is shown and not saved.
|
|
759
|
+
.TP
|
|
760
|
+
\fB\-\-dry\-run\fR
|
|
761
|
+
settings set: show what would change; save nothing.
|
|
762
|
+
.TP
|
|
763
|
+
\fB\-\-explain [key]\fR
|
|
764
|
+
settings: what each setting does, its values and default. A key, a group (knowledge, memory, model, replies, limits, data) or all.
|
|
765
|
+
.TP
|
|
766
|
+
\fB\-\-json\fR
|
|
767
|
+
The bots, or the bot's sources and what else could be attached, as JSON.
|
|
768
|
+
.IP \(bu 2
|
|
769
|
+
<bot> is the bot's public id (bot_...), as \fBoalo bots\fR prints it.
|
|
770
|
+
.IP \(bu 2
|
|
771
|
+
A source is a table made searchable with \fBoalo data vectorize <table> \-\-fields ...\fR. A bot always searches its own knowledge base (documents) too.
|
|
772
|
+
.IP \(bu 2
|
|
773
|
+
The same as ticking a table in the bot's Knowledge pane in the dashboard, with the same access as there.
|
|
774
|
+
.IP \(bu 2
|
|
775
|
+
settings go through the dashboard's own actions, with the same checks and access. A change sets only the settings it names: the model without the provider keeps the provider, one limit keeps the others, one context.* key keeps the rest of the context config.
|
|
776
|
+
.IP \(bu 2
|
|
777
|
+
Every setting is described in \fBman oalo\fR (BOT SETTINGS) and by \fBoalo bots settings \-\-explain\fR.
|
|
778
|
+
.PP
|
|
779
|
+
Exit codes: 0 done; 1 refused or failed; 2 bad arguments or no CLI token.
|
|
780
|
+
.SS tokens
|
|
781
|
+
List, create and revoke the workspace's sync tokens, for an app's own server.
|
|
782
|
+
.PP
|
|
783
|
+
\fBoalo tokens list [\-\-json]\fR
|
|
784
|
+
.br
|
|
785
|
+
\fBoalo tokens create \-\-name <name> \-\-scope write:<table> [\-\-scope ...] [\-\-days N] [\-\-json]\fR
|
|
786
|
+
.br
|
|
787
|
+
\fBoalo tokens revoke <id>\fR
|
|
788
|
+
.br
|
|
789
|
+
.TP
|
|
790
|
+
\fB\-\-name <name>\fR
|
|
791
|
+
What the token is for, shown in the dashboard.
|
|
792
|
+
.TP
|
|
793
|
+
\fB\-\-scope <scope>\fR
|
|
794
|
+
read, write, read_manifest, read:<table>, write:<table>, events (send events to POST /api/events/v1), workflows (call workflows, POST /api/workflows/v1/<name>/run), chat (sign the chat widget in as your app's user, POST /api/chat/v1/sessions), or env:dev / env:prod (lock it to one env's data: env:dev makes events and workflow calls safe test runs, for running your app on your machine). Repeat it. Prefer the narrowest. An unknown scope is refused.
|
|
795
|
+
.TP
|
|
796
|
+
\fB\-\-days N\fR
|
|
797
|
+
Expiry in days (default 90; 0 for none).
|
|
798
|
+
.IP \(bu 2
|
|
799
|
+
A sync token reads or writes every row of its tables, for every member. It belongs in a server's secrets, never in a mobile or web app.
|
|
800
|
+
.IP \(bu 2
|
|
801
|
+
The token is printed once. Copy it into the app server's secrets right away.
|
|
802
|
+
.PP
|
|
803
|
+
Exit codes: 0 done; 1 refused or failed; 2 bad arguments or no CLI token.
|
|
804
|
+
.SS docs
|
|
805
|
+
Read the Oalo platform docs from your workspace: list, search, or print a page as markdown.
|
|
806
|
+
.PP
|
|
807
|
+
\fBoalo docs [\-\-audience developer|trainer] [\-\-json]\fR
|
|
808
|
+
.br
|
|
809
|
+
\fBoalo docs <slug> [\-\-json]\fR
|
|
810
|
+
.br
|
|
811
|
+
\fBoalo docs \-\-search "<words>" [\-\-json]\fR
|
|
812
|
+
.br
|
|
813
|
+
.TP
|
|
814
|
+
\fB\-\-search <words>\fR
|
|
815
|
+
Pages ranked for the words, each with the line that matched.
|
|
816
|
+
.TP
|
|
817
|
+
\fB\-\-audience developer|trainer\fR
|
|
818
|
+
Only pages for that reader (pages for both always show).
|
|
819
|
+
.TP
|
|
820
|
+
\fB\-\-json\fR
|
|
821
|
+
Structured output: summaries for a list or search, the full page with markdown for a slug.
|
|
822
|
+
.IP \(bu 2
|
|
823
|
+
Served by your workspace's own server (its Base), so the pages match the version it runs.
|
|
824
|
+
.IP \(bu 2
|
|
825
|
+
Good starting pages for building on Oalo: bring\-your\-repo and connect\-your\-own\-frontend for your own code, app\-environment, tokens\-and\-credentials, data\-models, sync\-rest\-api, triggers\-and\-chaining.
|
|
826
|
+
.IP \(bu 2
|
|
827
|
+
A page goes to stdout as markdown, so \fBoalo docs data\-models > notes.md\fR saves it. Related pages are listed on stderr.
|
|
828
|
+
.PP
|
|
829
|
+
Exit codes: 0 done; 1 no such page, or the workspace failed; 2 no CLI token.
|
|
830
|
+
.SS apps
|
|
831
|
+
List the workspace's apps: type, state, preview and live addresses, and the live release.
|
|
832
|
+
.PP
|
|
833
|
+
\fBoalo apps [\-\-json]\fR
|
|
834
|
+
.br
|
|
835
|
+
.TP
|
|
836
|
+
\fB\-\-json\fR
|
|
837
|
+
Print the apps as JSON.
|
|
838
|
+
.IP \(bu 2
|
|
839
|
+
The first column is the slug, which \fBoalo deploy \-\-app\fR and \fBoalo link \-\-app\fR take.
|
|
840
|
+
.PP
|
|
841
|
+
Exit codes: 0 done; 1 the workspace failed; 2 no CLI token.
|
|
842
|
+
.SS deploy
|
|
843
|
+
Send this repo's commits to an app and run them: the preview (dev) by default, the live release with \-\-env prod.
|
|
844
|
+
.PP
|
|
845
|
+
\fBoalo deploy [\-\-app <slug>] [\-\-env dev|prod] [\-\-allow\-dirty] [\-\-json]\fR
|
|
846
|
+
.br
|
|
847
|
+
\fBoalo deploy \-\-new [<name>] [\-\-name "Display name"]\fR
|
|
848
|
+
.br
|
|
849
|
+
\fBoalo deploy \-\-new [<name>] \-\-from <https url> [\-\-branch <name>] [\-\-token\-env <VAR>]\fR
|
|
850
|
+
.br
|
|
851
|
+
\fBoalo deploy \-\-app <slug> \-\-pull\fR
|
|
852
|
+
.br
|
|
853
|
+
\fBoalo deploy \-\-app <slug> \-\-replace\fR
|
|
854
|
+
.br
|
|
855
|
+
\fBoalo deploy \-\-app <slug> \-\-history\fR
|
|
856
|
+
.br
|
|
857
|
+
\fBoalo deploy \-\-app <slug> \-\-rollback [\-\-to <sha>]\fR
|
|
858
|
+
.br
|
|
859
|
+
.TP
|
|
860
|
+
\fB\-\-app <slug>\fR
|
|
861
|
+
The app (\fBoalo apps\fR lists them). Default: the app saved with \fBoalo link \-\-app\fR.
|
|
862
|
+
.TP
|
|
863
|
+
\fB\-\-env dev|prod\fR
|
|
864
|
+
dev updates the preview; prod builds and swaps the live release. prod must be on the command line.
|
|
865
|
+
.TP
|
|
866
|
+
\fB\-\-new [<name>]\fR
|
|
867
|
+
Make a new app from this repo: its type found from the files at the repo's root (no Dockerfile needed), its commits kept as the app's history, its preview set up. The name (default: the repo's folder) becomes its slug, and this project is linked to it. When nothing at the root says what the app is (a monorepo, say), it is made as code only and the deploy says what to add: see \fBoalo docs bring\-your\-repo\fR.
|
|
868
|
+
.TP
|
|
869
|
+
\fB\-\-name <display name>\fR
|
|
870
|
+
With \-\-new: the app's display name. Default: its slug.
|
|
871
|
+
.TP
|
|
872
|
+
\fB\-\-from <https url>\fR
|
|
873
|
+
With \-\-new: make the app from a Git repository at this address instead of this folder (no local checkout needed). The Base clones one branch with its whole history (https to a public host only, up to 200 MB, 5 minutes), then makes the app as \-\-new does. The name defaults to the repository's. Nothing is linked here.
|
|
874
|
+
.TP
|
|
875
|
+
\fB\-\-branch <name>\fR
|
|
876
|
+
With \-\-from: the branch to import. Default: the repository's default branch.
|
|
877
|
+
.TP
|
|
878
|
+
\fB\-\-token\-env <VAR>\fR
|
|
879
|
+
With \-\-from: for a private repository, the environment variable holding an access token that can read it (a GitHub, GitLab, Bitbucket or Forgejo personal access token). Without it, at a terminal, you're asked for the token, hidden, when the host wants one. It is used for that one clone: never stored, logged or kept in the app's repo.
|
|
880
|
+
.TP
|
|
881
|
+
\fB\-\-pull\fR
|
|
882
|
+
Fetch the app's code as Oalo has it into oalo/<slug>, to merge changes made there (by the builder agent or a teammate).
|
|
883
|
+
.TP
|
|
884
|
+
\fB\-\-replace\fR
|
|
885
|
+
Make this branch the app's code even though the histories differ. The app's current code is tagged first so it can be recovered.
|
|
886
|
+
.TP
|
|
887
|
+
\fB\-\-allow\-dirty\fR
|
|
888
|
+
Deploy the last commit even though there are uncommitted changes (which are not sent).
|
|
889
|
+
.TP
|
|
890
|
+
\fB\-\-history\fR
|
|
891
|
+
The live releases the app has had, newest first.
|
|
892
|
+
.TP
|
|
893
|
+
\fB\-\-rollback\fR
|
|
894
|
+
Make the release before the current one live again (or \-\-to <sha>). Again goes further back; it never returns to a release you rolled back from. It is built and checked like any live deploy; a failing one leaves the current release live.
|
|
895
|
+
.TP
|
|
896
|
+
\fB\-\-to <sha>\fR
|
|
897
|
+
With \-\-rollback: the release to make live (\fB\-\-history\fR lists them).
|
|
898
|
+
.IP \(bu 2
|
|
899
|
+
What is sent is the current branch's commits, as a git bundle, signed in with your CLI token. No git remote or extra credential is needed. Uncommitted changes are never sent.
|
|
900
|
+
.IP \(bu 2
|
|
901
|
+
The app only moves forward. If it has commits your repo lacks, the deploy stops and lists them: run \-\-pull, merge, deploy again.
|
|
902
|
+
.IP \(bu 2
|
|
903
|
+
dev: dependencies are reinstalled when package.json, a lockfile, requirements.txt, mix.exs or pubspec.yaml changed, then the preview restarts.
|
|
904
|
+
.IP \(bu 2
|
|
905
|
+
prod: the app is built (install, then its build script), a Procfile \fBrelease:\fR line runs, and the live release swaps over once the new one answers on its port. A failed build or release command leaves the old release live; a release that crashes or never answers is removed, and the old one keeps serving (the error shows its last lines).
|
|
906
|
+
.IP \(bu 2
|
|
907
|
+
How a server app starts: its Procfile (\fBweb:\fR, workers, \fBrelease:\fR), else its package.json \fBstart\fR (\fBdev\fR in the preview), else the runtime's default (index.js, main.py, app.py, manage.py, mix).
|
|
908
|
+
.IP \(bu 2
|
|
909
|
+
\-\-from is what the dashboard's Add app, From Git does: the same app, the same type detection, secret scan and preview. A token is never a flag value, since that stays in your shell history.
|
|
910
|
+
.IP \(bu 2
|
|
911
|
+
Admins and members with Developer access only. Progress streams while it runs.
|
|
912
|
+
.PP
|
|
913
|
+
Exit codes: 0 deployed; 1 refused or failed; 2 bad arguments, no CLI token, or not in a git repo.
|
|
914
|
+
.SS env
|
|
915
|
+
An app's environment variables on Oalo (API keys, settings), per env: list, set, unset, rotate\-token.
|
|
916
|
+
.PP
|
|
917
|
+
\fBoalo env [\-\-app <slug>] [\-\-env dev|prod] [\-\-json]\fR
|
|
918
|
+
.br
|
|
919
|
+
\fBoalo env set NAME=value [NAME=value ...] [\-\-secret | \-\-public] [\-\-no\-restart]\fR
|
|
920
|
+
.br
|
|
921
|
+
\fBoalo env set NAME \-\-secret\fR
|
|
922
|
+
.br
|
|
923
|
+
\fBoalo env set \-\-file .env.production \-\-env prod\fR
|
|
924
|
+
.br
|
|
925
|
+
\fBoalo env unset NAME [NAME ...]\fR
|
|
926
|
+
.br
|
|
927
|
+
\fBoalo env rotate\-token [\-\-env dev|prod]\fR
|
|
928
|
+
.br
|
|
929
|
+
.TP
|
|
930
|
+
\fB\-\-app <slug>\fR
|
|
931
|
+
The app (\fBoalo apps\fR lists them). Default: the app saved with \fBoalo link \-\-app\fR.
|
|
932
|
+
.TP
|
|
933
|
+
\fB\-\-env dev|prod\fR
|
|
934
|
+
dev is the preview, prod the live app. Each has its own variables. Changing prod needs \-\-env prod on the command line.
|
|
935
|
+
.TP
|
|
936
|
+
\fB\-\-secret\fR
|
|
937
|
+
Store as secret: never shown again, and only server apps get it. A NAME with no =value asks for the value without echoing it (or reads stdin when piped).
|
|
938
|
+
.TP
|
|
939
|
+
\fB\-\-public\fR
|
|
940
|
+
Store as public: shown by \fBoalo env\fR, and given to static apps too.
|
|
941
|
+
.TP
|
|
942
|
+
\fB\-\-file <path>\fR
|
|
943
|
+
Set every NAME=value line of a .env file in one step (all or none).
|
|
944
|
+
.TP
|
|
945
|
+
\fB\-\-no\-restart\fR
|
|
946
|
+
Don't restart the preview (dev) or relaunch the live app (prod) after this change.
|
|
947
|
+
.IP \(bu 2
|
|
948
|
+
A variable is secret unless its name starts with VITE_, EXPO_PUBLIC_, NEXT_PUBLIC_, PUBLIC_ or REACT_APP_, or it's set with \-\-public.
|
|
949
|
+
.IP \(bu 2
|
|
950
|
+
Server apps get every variable, in the preview and live. Static apps (React, Expo, Flutter) only get public ones, because whatever their build sees ends up in the browser.
|
|
951
|
+
.IP \(bu 2
|
|
952
|
+
Names Oalo sets itself can't be set: any starting with OALO_, PORT, DATABASE_URL, APP_SCHEMA, APP_SLUG, CONTAINER_HOST (and their VITE_/EXPO_PUBLIC_ forms), and the process basics (PATH, HOME, LANG, TZ, the Mix, Hex and Flutter homes). \fBoalo env set\fR refuses one by name.
|
|
953
|
+
.IP \(bu 2
|
|
954
|
+
A server app gets OALO_URL and OALO_SYNC_TOKEN: a Sync API token for its own env's data that can also send events, call workflows and start chat sessions, so it needs no token of its own. It also signs Oalo's calls to the app's endpoints (.oalo/app.json tools). The preview's token can't touch live data, and its events and workflow calls are test runs. \fBrotate\-token\fR replaces it at once and restarts the app on the new one.
|
|
955
|
+
.IP \(bu 2
|
|
956
|
+
A dev change restarts the preview. A prod change relaunches the live app at the commit it already runs (a build; no new code goes out). \-\-no\-restart skips that, to batch several changes: the last one without it relaunches.
|
|
957
|
+
.IP \(bu 2
|
|
958
|
+
Admins and members with Developer access only.
|
|
959
|
+
.PP
|
|
960
|
+
Exit codes: 0 done; 1 refused or failed; 2 bad arguments or no CLI token.
|
|
961
|
+
.SS secrets
|
|
962
|
+
Keys and tokens found committed to an app's code (on import, and in each push or deploy).
|
|
963
|
+
.PP
|
|
964
|
+
\fBoalo secrets [\-\-app <slug>] [\-\-all] [\-\-json]\fR
|
|
965
|
+
.br
|
|
966
|
+
\fBoalo secrets dismiss <fingerprint> [\-\-app <slug>]\fR
|
|
967
|
+
.br
|
|
968
|
+
.TP
|
|
969
|
+
\fB\-\-app <slug>\fR
|
|
970
|
+
The app (\fBoalo apps\fR lists them). Default: the app saved with \fBoalo link \-\-app\fR.
|
|
971
|
+
.TP
|
|
972
|
+
\fB\-\-all\fR
|
|
973
|
+
Dismissed findings too.
|
|
974
|
+
.TP
|
|
975
|
+
\fB\-\-json\fR
|
|
976
|
+
The findings as JSON.
|
|
977
|
+
.IP \(bu 2
|
|
978
|
+
Only where each one is and what it looks like: no value is ever kept.
|
|
979
|
+
.IP \(bu 2
|
|
980
|
+
For each: rotate it with its provider (it stays in the repo's history), set the new one with \fBoalo env set NAME \-\-secret\fR, and read it from the environment in the code.
|
|
981
|
+
.IP \(bu 2
|
|
982
|
+
Admins and members with Developer access only.
|
|
983
|
+
.PP
|
|
984
|
+
Exit codes: 0 done; 1 refused or failed; 2 bad arguments or no CLI token.
|
|
985
|
+
.SS dockerfile
|
|
986
|
+
How a server app's live image is built, and the Dockerfile it builds from.
|
|
987
|
+
.PP
|
|
988
|
+
\fBoalo dockerfile [\-\-app <slug>] [\-\-json]\fR
|
|
989
|
+
.br
|
|
990
|
+
\fBoalo dockerfile \-\-write [\-\-force] [\-\-app <slug>]\fR
|
|
991
|
+
.br
|
|
992
|
+
.TP
|
|
993
|
+
\fB\-\-app <slug>\fR
|
|
994
|
+
The app (\fBoalo apps\fR lists them). Default: the app saved with \fBoalo link \-\-app\fR.
|
|
995
|
+
.TP
|
|
996
|
+
\fB\-\-write\fR
|
|
997
|
+
Save Oalo's Dockerfile as ./Dockerfile, to change. Once committed, the repo's copy is used.
|
|
998
|
+
.TP
|
|
999
|
+
\fB\-\-force\fR
|
|
1000
|
+
With \-\-write, replace an existing ./Dockerfile.
|
|
1001
|
+
.TP
|
|
1002
|
+
\fB\-\-json\fR
|
|
1003
|
+
method, source (repo or oalo), runtime and the Dockerfile's text.
|
|
1004
|
+
.IP \(bu 2
|
|
1005
|
+
The first that fits: the repo's own Dockerfile; Oalo's for the runtime, for the languages buildpacks can't build; buildpacks for the rest. \fBoalo docs live\-server\-apps\fR lists which language gets which.
|
|
1006
|
+
.IP \(bu 2
|
|
1007
|
+
Every image runs as uid 1000 with a read\-only filesystem (/tmp is writable) and must serve $PORT. A Procfile's lines still name the processes: web runs the image's own command when the Procfile has no web line.
|
|
1008
|
+
.PP
|
|
1009
|
+
Exit codes: 0 done; 1 refused or failed; 2 bad arguments or no CLI token.
|
|
1010
|
+
.SS logs
|
|
1011
|
+
What an app's own processes printed (server, workers, release command), per env.
|
|
1012
|
+
.PP
|
|
1013
|
+
\fBoalo logs [\-\-app <slug>] [\-\-env dev|prod] [\-\-process web|<worker>] [\-\-limit N] [\-\-follow] [\-\-json]\fR
|
|
1014
|
+
.br
|
|
1015
|
+
.TP
|
|
1016
|
+
\fB\-\-app <slug>\fR
|
|
1017
|
+
The app (\fBoalo apps\fR lists them). Default: the app saved with \fBoalo link \-\-app\fR.
|
|
1018
|
+
.TP
|
|
1019
|
+
\fB\-\-env dev|prod\fR
|
|
1020
|
+
dev is the preview, prod the live app. Default dev.
|
|
1021
|
+
.TP
|
|
1022
|
+
\fB\-\-process <name>\fR
|
|
1023
|
+
Only this process: web, a Procfile worker's name, release, build (a live build's output, with \-\-env prod), or oalo (Oalo's own notes).
|
|
1024
|
+
.TP
|
|
1025
|
+
\fB\-\-limit N\fR
|
|
1026
|
+
How many recent lines (default 200, at most 2000).
|
|
1027
|
+
.TP
|
|
1028
|
+
\fB\-\-follow\fR
|
|
1029
|
+
Keep printing new lines as they come, until Ctrl\-C.
|
|
1030
|
+
.TP
|
|
1031
|
+
\fB\-\-json\fR
|
|
1032
|
+
One JSON object per line: at, process, line.
|
|
1033
|
+
.IP \(bu 2
|
|
1034
|
+
The workspace keeps the last 2,000 lines per env in memory; restarting the workspace empties them.
|
|
1035
|
+
.IP \(bu 2
|
|
1036
|
+
Lines from \fBoalo\fR are Oalo's own: which command started, and when a process exited and with what status.
|
|
1037
|
+
.IP \(bu 2
|
|
1038
|
+
Admins and members with Developer access only: an app can print secrets or customers' details.
|
|
1039
|
+
.PP
|
|
1040
|
+
Exit codes: 0 done; 1 refused or failed; 2 bad arguments or no CLI token.
|
|
1041
|
+
.SS loops
|
|
1042
|
+
Test a loop (sends simulated), see its past runs, turn it on or off, or delete it, without pulling and pushing it.
|
|
1043
|
+
.PP
|
|
1044
|
+
\fBoalo loops test <name> [\-\-sample latest|example] [\-\-input <json|@file.json>] [\-\-json]\fR
|
|
1045
|
+
.br
|
|
1046
|
+
\fBoalo loops on <name>\fR
|
|
1047
|
+
.br
|
|
1048
|
+
\fBoalo loops off <name>\fR
|
|
1049
|
+
.br
|
|
1050
|
+
\fBoalo loops delete <name>\fR
|
|
1051
|
+
.br
|
|
1052
|
+
\fBoalo loops runs [<name>] [\-\-limit N] [\-\-json]\fR
|
|
1053
|
+
.br
|
|
1054
|
+
\fBoalo loops runs \-\-id <run> [\-\-json]\fR
|
|
1055
|
+
.br
|
|
1056
|
+
.TP
|
|
1057
|
+
\fB\-\-sample latest|example\fR
|
|
1058
|
+
Test with the loop's most recent real event, or one built from its trigger's fields.
|
|
1059
|
+
.TP
|
|
1060
|
+
\fB\-\-input <json|@file>\fR
|
|
1061
|
+
Test with this input instead: an event envelope {type, contact_id, payload}, or what a scheduled loop's first step reads.
|
|
1062
|
+
.TP
|
|
1063
|
+
\fB\-\-app <slug>\fR
|
|
1064
|
+
Only for a loop pinned to one app: that app's slug (\fBoalo apps\fR) or id. Works with test, runs, on, off and delete.
|
|
1065
|
+
.TP
|
|
1066
|
+
\fB\-\-id <run>\fR
|
|
1067
|
+
runs: one run step by step, with each step's output.
|
|
1068
|
+
.TP
|
|
1069
|
+
\fB\-\-limit N\fR
|
|
1070
|
+
runs: at most this many (default 20).
|
|
1071
|
+
.TP
|
|
1072
|
+
\fB\-\-json\fR
|
|
1073
|
+
Print the test result as JSON.
|
|
1074
|
+
.IP \(bu 2
|
|
1075
|
+
A test runs every step. Steps that send messages or change records are simulated, and their output says what they would have done. Custom tools and AI steps run for real. It works on a loop that is off.
|
|
1076
|
+
.IP \(bu 2
|
|
1077
|
+
A loop that is on runs for real whenever its triggers fire. Starting a run now, for real: \fBoalo run loop <name>\fR.
|
|
1078
|
+
.IP \(bu 2
|
|
1079
|
+
Deleting can't be undone; turning a loop off keeps it.
|
|
1080
|
+
.PP
|
|
1081
|
+
Exit codes: 0 done (a test passed); 1 refused, failed, or the test run failed; 2 bad arguments or no CLI token.
|
|
1082
|
+
.SS flows
|
|
1083
|
+
Turn a chat flow on or off, or delete it, by bot and flow name, without pulling and pushing it.
|
|
1084
|
+
.PP
|
|
1085
|
+
\fBoalo flows on <bot> <flow>\fR
|
|
1086
|
+
.br
|
|
1087
|
+
\fBoalo flows off <bot> <flow>\fR
|
|
1088
|
+
.br
|
|
1089
|
+
\fBoalo flows delete <bot> <flow>\fR
|
|
1090
|
+
.br
|
|
1091
|
+
.IP \(bu 2
|
|
1092
|
+
<bot> is the bot's public id (the folder under .oalo/flows/ after \fBoalo pull\fR, or the MCP tool oalo_list_bots), <flow> its name or id.
|
|
1093
|
+
.IP \(bu 2
|
|
1094
|
+
A flow that is on can start in real conversations. A call_other_flow step only runs a flow that is on.
|
|
1095
|
+
.IP \(bu 2
|
|
1096
|
+
Deleting can't be undone; turning a flow off keeps it.
|
|
1097
|
+
.PP
|
|
1098
|
+
Exit codes: 0 done; 1 refused or failed; 2 bad arguments or no CLI token.
|
|
1099
|
+
.SS pull
|
|
1100
|
+
Fetch chat flows, loops and code tools into .oalo/ as files you can edit.
|
|
1101
|
+
.PP
|
|
1102
|
+
\fBoalo pull [flows|loops|tools] [\-\-bot <id>] [\-\-name <name>] [\-\-force]\fR
|
|
1103
|
+
.br
|
|
1104
|
+
.TP
|
|
1105
|
+
\fB\-\-bot <id>\fR
|
|
1106
|
+
Only this bot's flows (numeric or public bot_ id).
|
|
1107
|
+
.TP
|
|
1108
|
+
\fB\-\-name <name>\fR
|
|
1109
|
+
Only the flow or loop with this name.
|
|
1110
|
+
.TP
|
|
1111
|
+
\fB\-\-force\fR
|
|
1112
|
+
Overwrite files you have edited since the last pull.
|
|
1113
|
+
.IP \(bu 2
|
|
1114
|
+
Writes .oalo/flows/<bot>/<flow>.json, .oalo/loops/<loop>.json (loops pinned to an app under loops/apps/<app>/), .oalo/tools/<tool>.js + .json for code tools, and the node contracts .oalo/catalog/flow.json and loop.json.
|
|
1115
|
+
.IP \(bu 2
|
|
1116
|
+
Only code (JavaScript) tools are pulled; webhooks, built\-ins and Elixir actions are configured in the dashboard. A tool's code is compiled when pushed, so code that doesn't build is refused.
|
|
1117
|
+
.IP \(bu 2
|
|
1118
|
+
A loop file also lists the loop's \fBtriggers\fR (what starts it). Add or delete entries and push: push adds the new ones and removes the ones you deleted, and keeps any a teammate added since your pull. Set a trigger's \fBenabled\fR to turn it on or off.
|
|
1119
|
+
.IP \(bu 2
|
|
1120
|
+
Each file holds the editable object (\fBflow\fR or \fBloop\fR) plus the CLI's bookkeeping: id, version (sent back as base_version on push) and base_hash (how the CLI knows you edited it). Edit the object; leave the bookkeeping alone.
|
|
1121
|
+
.IP \(bu 2
|
|
1122
|
+
A file you have edited is kept, not overwritten, unless you pass \-\-force.
|
|
1123
|
+
.IP \(bu 2
|
|
1124
|
+
To create a flow or loop, write a file in the same shape without id or version, then push it.
|
|
1125
|
+
.IP \(bu 2
|
|
1126
|
+
Needs a CLI token.
|
|
1127
|
+
.PP
|
|
1128
|
+
Exit codes: 0 pulled; 1 pull failed; 2 bad arguments or no token.
|
|
1129
|
+
.SS status
|
|
1130
|
+
Show which flow and loop files changed, locally or on the server.
|
|
1131
|
+
.PP
|
|
1132
|
+
\fBoalo status [<file>...] [\-\-json]\fR
|
|
1133
|
+
.br
|
|
1134
|
+
.TP
|
|
1135
|
+
\fB\-\-json\fR
|
|
1136
|
+
One JSON array of {path, state, note}.
|
|
1137
|
+
.IP \(bu 2
|
|
1138
|
+
States: new (never pushed), clean, modified (push it), behind (the server has a newer version: pull it), conflict (both changed: merge by hand), gone (deleted on the server), invalid (not a readable file), error (the server check failed; the note says why).
|
|
1139
|
+
.IP \(bu 2
|
|
1140
|
+
Needs a CLI token.
|
|
1141
|
+
.PP
|
|
1142
|
+
Exit codes: 0 nothing in conflict; 1 a conflict, an invalid file, or a failed check; 2 no token.
|
|
1143
|
+
.SS lint
|
|
1144
|
+
Check flow and loop files without saving anything.
|
|
1145
|
+
.PP
|
|
1146
|
+
\fBoalo lint [<file>...] [\-\-verbose] [\-\-json]\fR
|
|
1147
|
+
.br
|
|
1148
|
+
.TP
|
|
1149
|
+
\fB\-\-verbose\fR
|
|
1150
|
+
Also show info\-level findings.
|
|
1151
|
+
.TP
|
|
1152
|
+
\fB\-\-json\fR
|
|
1153
|
+
One JSON object per file: {path, findings}.
|
|
1154
|
+
.IP \(bu 2
|
|
1155
|
+
The same checks the server runs before a strict save: node types and keys against the catalog, required settings, edges and conditions, references between steps, and tools the flow or loop calls.
|
|
1156
|
+
.IP \(bu 2
|
|
1157
|
+
Each finding names the node, what is wrong and how to fix it.
|
|
1158
|
+
.IP \(bu 2
|
|
1159
|
+
Needs a CLI token.
|
|
1160
|
+
.PP
|
|
1161
|
+
Exit codes: 0 no errors (warnings allowed); 1 errors found; 2 no token.
|
|
1162
|
+
.SS push
|
|
1163
|
+
Lint and save edited flow, loop and tool files, guarded against concurrent edits.
|
|
1164
|
+
.PP
|
|
1165
|
+
\fBoalo push [<file>...] [\-\-dry\-run] [\-\-no\-strict] [\-\-force] [\-\-all] [\-\-verbose]\fR
|
|
1166
|
+
.br
|
|
1167
|
+
.TP
|
|
1168
|
+
\fB\-\-dry\-run\fR
|
|
1169
|
+
Lint only; save nothing.
|
|
1170
|
+
.TP
|
|
1171
|
+
\fB\-\-no\-strict\fR
|
|
1172
|
+
Save even with error\-level findings. Structural damage is still refused.
|
|
1173
|
+
.TP
|
|
1174
|
+
\fB\-\-force\fR
|
|
1175
|
+
Drop the version guard: overwrite whatever the server has.
|
|
1176
|
+
.TP
|
|
1177
|
+
\fB\-\-all\fR
|
|
1178
|
+
Push every file, not only the edited ones.
|
|
1179
|
+
.TP
|
|
1180
|
+
\fB\-\-verbose\fR
|
|
1181
|
+
Also show info\-level findings.
|
|
1182
|
+
.IP \(bu 2
|
|
1183
|
+
Without files, pushes every file edited since its pull (and new ones).
|
|
1184
|
+
.IP \(bu 2
|
|
1185
|
+
Each save sends the pulled version: if someone saved in between, the push is refused as a conflict and nothing is overwritten. Pull, merge, push again.
|
|
1186
|
+
.IP \(bu 2
|
|
1187
|
+
Saves are strict: error\-level lint findings block them. Fix the findings (each says how) or pass \-\-no\-strict.
|
|
1188
|
+
.IP \(bu 2
|
|
1189
|
+
After a save the file is rewritten from the server's copy with the new version.
|
|
1190
|
+
.IP \(bu 2
|
|
1191
|
+
Needs a CLI token.
|
|
1192
|
+
.PP
|
|
1193
|
+
Exit codes: 0 every file saved; 1 a file was refused, in conflict, or failed; 2 bad arguments or no token.
|
|
1194
|
+
.SS qa
|
|
1195
|
+
Run a scripted test conversation with a bot and print the transcript.
|
|
1196
|
+
.PP
|
|
1197
|
+
\fBoalo qa <bot> "<message>" ["<message>" ...] [\-\-channel web|whatsapp|instagram|sms] [\-\-flow <name>] [\-\-timeout <s>] [\-\-json]\fR
|
|
1198
|
+
.br
|
|
1199
|
+
\fBoalo qa <bot> \-\-script <file.json>\fR
|
|
1200
|
+
.br
|
|
1201
|
+
.TP
|
|
1202
|
+
\fB\-\-channel <name>\fR
|
|
1203
|
+
Act as this channel: web (default), whatsapp, instagram, sms, embed. Changes how the bot behaves (text mode vs pickers).
|
|
1204
|
+
.TP
|
|
1205
|
+
\fB\-\-flow <name>\fR
|
|
1206
|
+
Start this flow with the first message, even while it's off, so a new or changed flow is tested before it's turned on.
|
|
1207
|
+
.TP
|
|
1208
|
+
\fB\-\-script <file>\fR
|
|
1209
|
+
A JSON file: {"channel": "whatsapp", "flow": "<name>", "messages": ["...", "..."]}.
|
|
1210
|
+
.TP
|
|
1211
|
+
\fB\-\-timeout <s>\fR
|
|
1212
|
+
How long one turn may take to settle. Default 90, at most 300.
|
|
1213
|
+
.TP
|
|
1214
|
+
\fB\-\-label <text>\fR
|
|
1215
|
+
Tag stored on the test conversation.
|
|
1216
|
+
.TP
|
|
1217
|
+
\fB\-\-json\fR
|
|
1218
|
+
Print the whole run as JSON: turns (replies, flow state, ms, settled), flow_path, cost_usd.
|
|
1219
|
+
.IP \(bu 2
|
|
1220
|
+
The conversation is a preview with no phone number or external id: the inbox leaves it out and nothing is sent to WhatsApp, Instagram or SMS.
|
|
1221
|
+
.IP \(bu 2
|
|
1222
|
+
Everything else is real: the bot's tools and flows run, collected contact details are saved, handoffs happen. Use a test bot, or flows whose side effects you are fine repeating.
|
|
1223
|
+
.IP \(bu 2
|
|
1224
|
+
Each message waits until the bot settles (no new message and no running flow), then the next is sent. Any flow still active at the end is cancelled and the conversation is closed.
|
|
1225
|
+
.IP \(bu 2
|
|
1226
|
+
At most 20 messages per run. bot accepts a numeric id or a public bot_ id.
|
|
1227
|
+
.IP \(bu 2
|
|
1228
|
+
Needs a CLI token.
|
|
1229
|
+
.PP
|
|
1230
|
+
Exit codes: 0 every turn settled; 1 a turn timed out or the run failed; 2 bad arguments or no token.
|
|
1231
|
+
.SS rehearse
|
|
1232
|
+
Rehearse inbound WhatsApp conversations end to end: routing, triage and the bot's reply.
|
|
1233
|
+
.PP
|
|
1234
|
+
\fBoalo rehearse [\-\-number <phone_number_id>] [\-\-responder <bot_...>] [\-\-timeout <s>] [\-\-json]\fR
|
|
1235
|
+
.br
|
|
1236
|
+
\fBoalo rehearse \-\-script <file.json>\fR
|
|
1237
|
+
.br
|
|
1238
|
+
.TP
|
|
1239
|
+
\fB\-\-number <id>\fR
|
|
1240
|
+
The WhatsApp number (phone_number_id) the customer writes to. Default: the workspace's default number.
|
|
1241
|
+
.TP
|
|
1242
|
+
\fB\-\-responder <bot_...>\fR
|
|
1243
|
+
The bot that should end up answering, by its public id (\fBoalo bots\fR lists them). Default: the bot an enabled triage loop hands threads to, else the number's bot.
|
|
1244
|
+
.TP
|
|
1245
|
+
\fB\-\-script <file>\fR
|
|
1246
|
+
A JSON file: {"scenarios": [{"name", "messages", "known_contact", "opted_out", "open_thread": {"bot_id", "number", "hours_ago", "tags", "assigned", "deal"}, "expect": {"reply", "bot_id", "assigned"}}]}.
|
|
1247
|
+
.TP
|
|
1248
|
+
\fB\-\-timeout <s>\fR
|
|
1249
|
+
How long one message may take to settle. Default 120, at most 300.
|
|
1250
|
+
.TP
|
|
1251
|
+
\fB\-\-json\fR
|
|
1252
|
+
Print every scenario as JSON: turns (what was sent), threads, loop runs and their steps, checks, why_silent, cost_usd.
|
|
1253
|
+
.IP \(bu 2
|
|
1254
|
+
Without \-\-script it runs the standard scenarios: a new customer, a known contact whose thread is still open on another number, returning the same day, returning after 24 hours, writing again after their deal was won, writing again after opting out, handed to a teammate earlier today, and with a teammate but writing from another number.
|
|
1255
|
+
.IP \(bu 2
|
|
1256
|
+
Each message goes through the same code as a real WhatsApp message. The customer is a fictional 555\-01XX number: sends to it are recorded, never posted, its threads stay out of the Inbox, and assignment emails, team\-chat cards and workflow notices are skipped.
|
|
1257
|
+
.IP \(bu 2
|
|
1258
|
+
Real: LLM calls and their cost, loop runs in the run history. At the end its threads are closed and its contact removed.
|
|
1259
|
+
.IP \(bu 2
|
|
1260
|
+
A FAIL prints why the customer got no reply (opted out, a failed triage step, autopilot off, assigned to a teammate).
|
|
1261
|
+
.IP \(bu 2
|
|
1262
|
+
Needs a CLI token.
|
|
1263
|
+
.PP
|
|
1264
|
+
Exit codes: 0 every scenario passed; 1 a scenario failed or the run failed; 2 bad arguments or no token.
|
|
1265
|
+
.SS skill
|
|
1266
|
+
Teach this project's coding agent how to work on Oalo.
|
|
1267
|
+
.PP
|
|
1268
|
+
\fBoalo skill [\-\-agents]\fR
|
|
1269
|
+
.br
|
|
1270
|
+
\fBoalo skill \-\-print\fR
|
|
1271
|
+
.br
|
|
1272
|
+
.TP
|
|
1273
|
+
\fB\-\-agents\fR
|
|
1274
|
+
Also write the rules into AGENTS.md (between oalo markers), for agents other than Claude Code.
|
|
1275
|
+
.TP
|
|
1276
|
+
\fB\-\-print\fR
|
|
1277
|
+
Print the skill instead of installing it.
|
|
1278
|
+
.IP \(bu 2
|
|
1279
|
+
Installs .claude/skills/oalo/SKILL.md, which Claude Code loads on its own: the pull, lint, push, qa loop, and the rules (read the node catalog, never force past a conflict, test on the customer's channel, test conversations do real work).
|
|
1280
|
+
.IP \(bu 2
|
|
1281
|
+
The skill ships with this CLI version, and the installed copy says which. Re\-running replaces it, and the AGENTS.md section when there is one, nothing else. Commit both.
|
|
1282
|
+
.IP \(bu 2
|
|
1283
|
+
\fBoalo link\fR installs it too. After a CLI update, the first command in a project with an older copy says so, once; \fBoalo skill\fR updates it.
|
|
1284
|
+
.PP
|
|
1285
|
+
Exit codes: 0 installed or printed.
|
|
1286
|
+
.SS mcp
|
|
1287
|
+
Serve the workspace over MCP on stdio, for Claude Code or Cursor.
|
|
1288
|
+
.PP
|
|
1289
|
+
\fBoalo mcp\fR
|
|
1290
|
+
.br
|
|
1291
|
+
.IP \(bu 2
|
|
1292
|
+
stdout is the MCP protocol stream. Diagnostics go to stderr.
|
|
1293
|
+
.IP \(bu 2
|
|
1294
|
+
Exposes a curated tool set plus an oalo_call passthrough; the build surface has ~442 events and mapping them all would wreck tool selection.
|
|
1295
|
+
.IP \(bu 2
|
|
1296
|
+
Reads OALO_URL and OALO_CLI_TOKEN, or falls back to what \fBoalo link \-\-cli\-token\fR saved.
|
|
1297
|
+
.IP \(bu 2
|
|
1298
|
+
Needs a CLI token.
|
|
1299
|
+
.PP
|
|
1300
|
+
Exit codes: 0 stopped cleanly; 1 no workspace or CLI token.
|
|
1301
|
+
.SH BOT SETTINGS
|
|
1302
|
+
Read with \fBoalo bots settings <bot>\fR, changed with \fBoalo bots settings <bot> set key=value\fR, explained with \fBoalo bots settings \-\-explain <key>\fR. A change to a published bot needs \-\-yes.
|
|
1303
|
+
.SS knowledge
|
|
1304
|
+
.TP
|
|
1305
|
+
\fBretrieval_strategy\fR
|
|
1306
|
+
How the bot's knowledge reaches the AI each turn. preload packs the best matching passages into the prompt, with no search tools. adhoc gives the AI search tools only, and it searches when it decides to. hybrid does both. none uses no knowledge (the persona only).
|
|
1307
|
+
.br
|
|
1308
|
+
Values: hybrid | preload | adhoc | none. Default: hybrid.
|
|
1309
|
+
.TP
|
|
1310
|
+
\fBretrieval_mode\fR
|
|
1311
|
+
How documents are cut and searched. fast: small chunks, few hits, no reranking (FAQs). deep: big chunks, more hits, reranked (long or system\-level material).
|
|
1312
|
+
.br
|
|
1313
|
+
Values: fast | deep. Default: fast. Changing it re\-indexes the bot's knowledge.
|
|
1314
|
+
.TP
|
|
1315
|
+
\fBgraph_retrieval\fR
|
|
1316
|
+
How the knowledge graph adds to what's found. hierarchical always brings the matched passage's parent topics (its governing rules). similar_only adds related passages beside it. auto is hierarchical when the graph has real depth, else similar_only. off adds nothing.
|
|
1317
|
+
.br
|
|
1318
|
+
Values: auto | hierarchical | similar_only | off. Default: auto.
|
|
1319
|
+
.TP
|
|
1320
|
+
\fBancestor_preload_depth\fR
|
|
1321
|
+
How many levels of parent topics come with a match when graph_retrieval brings them, nearest first. Cheap to raise when the documents are small.
|
|
1322
|
+
.br
|
|
1323
|
+
Values: a number from 1 to 32. Default: 3.
|
|
1324
|
+
.TP
|
|
1325
|
+
\fBcontext.strategy\fR
|
|
1326
|
+
How each turn's context is put together. retrieval: the frame, the persona and what search finds. graph_resolver: everything the member's tier unlocks in the knowledge graph, whole (high recall, more tokens). graph_focused: the same unlocking, but only the unlocked topics' own text, plus a search over the graph for this turn (token\-bounded). The context.* settings below are read by the graph strategies.
|
|
1327
|
+
.br
|
|
1328
|
+
Values: retrieval | graph_resolver | graph_focused. Default: retrieval.
|
|
1329
|
+
.TP
|
|
1330
|
+
\fBcontext.frame_segments\fR
|
|
1331
|
+
Graph topics that load on top of the frame, each its own way. resident: the topic and everything under it, every turn (rules that must always bind). semantic: only the parts that match this turn, plus a list of all its titles. semantic_expand: semantic, with the question rephrased first for a better match. structural: only what the member's tier unlocks under it. Written \fBTHE RULES=resident; THE MAP=semantic\fR, or as JSON. Titles match exactly (case aside).
|
|
1332
|
+
.br
|
|
1333
|
+
Values: Title=mode; ... (modes: resident, semantic, semantic_expand, structural). Default: none.
|
|
1334
|
+
.TP
|
|
1335
|
+
\fBcontext.resident_subtrees\fR
|
|
1336
|
+
Graph topics loaded every turn whatever the member's tier, by title, comma\-separated.
|
|
1337
|
+
.br
|
|
1338
|
+
Values: list. Default: none.
|
|
1339
|
+
.TP
|
|
1340
|
+
\fBcontext.resident_subtree_depth\fR
|
|
1341
|
+
How much of each resident topic loads: full (it and everything under it) or shallow (its own text only). default: full for graph_resolver, shallow for graph_focused.
|
|
1342
|
+
.br
|
|
1343
|
+
Values: full | shallow, or default. Default: default.
|
|
1344
|
+
.TP
|
|
1345
|
+
\fBcontext.tier_field\fR
|
|
1346
|
+
The member field that holds their tier, which decides what the graph strategies unlock.
|
|
1347
|
+
.br
|
|
1348
|
+
Values: text. Default: band.
|
|
1349
|
+
.TP
|
|
1350
|
+
\fBcontext.tier_label\fR
|
|
1351
|
+
The word before the tier value in the title of each tier's topic: "Band 3" for tier 3.
|
|
1352
|
+
.br
|
|
1353
|
+
Values: text. Default: Band.
|
|
1354
|
+
.TP
|
|
1355
|
+
\fBcontext.grant_rel\fR
|
|
1356
|
+
The graph relation from a tier's topic to the topics it unlocks.
|
|
1357
|
+
.br
|
|
1358
|
+
Values: text. Default: grants.
|
|
1359
|
+
.TP
|
|
1360
|
+
\fBcontext.recurse_rel\fR
|
|
1361
|
+
The graph relation followed from an unlocked topic to the further topics it unlocks.
|
|
1362
|
+
.br
|
|
1363
|
+
Values: text. Default: recurses_into.
|
|
1364
|
+
.TP
|
|
1365
|
+
\fBcontext.child_rel\fR
|
|
1366
|
+
The graph relation from a topic to its parent: what "everything under it" follows.
|
|
1367
|
+
.br
|
|
1368
|
+
Values: text. Default: child_of.
|
|
1369
|
+
.TP
|
|
1370
|
+
\fBstate_fields\fR
|
|
1371
|
+
Fields of what the conversation has collected (or the member's own data) whose current values drive an extra search every turn, so the knowledge for the member's situation is there however they phrase the question. Comma\-separated; empty is off.
|
|
1372
|
+
.br
|
|
1373
|
+
Values: list. Default: none.
|
|
1374
|
+
.TP
|
|
1375
|
+
\fBframe\fR
|
|
1376
|
+
Rules that apply to every answer, always in the prompt (they can't depend on a search finding them). @file reads the text from a file; an empty value clears it.
|
|
1377
|
+
.br
|
|
1378
|
+
Values: text. Default: none.
|
|
1379
|
+
.TP
|
|
1380
|
+
\fBprotect_canon\fR
|
|
1381
|
+
After each reply, remove any passage copied word for word from the knowledge loaded that turn. For bots grounded in material that must not be quoted out.
|
|
1382
|
+
.br
|
|
1383
|
+
Values: true or false. Default: false.
|
|
1384
|
+
.TP
|
|
1385
|
+
\fBconversation_record\fR
|
|
1386
|
+
Whether the AI sees what the conversation has established. auto: shown when there are facts. extract: auto, plus reading every customer message for the facts the bot defines. off: never shown (it's still recorded).
|
|
1387
|
+
.br
|
|
1388
|
+
Values: auto | extract | off. Default: auto.
|
|
1389
|
+
.SS memory
|
|
1390
|
+
.TP
|
|
1391
|
+
\fBmember_learning.memory\fR
|
|
1392
|
+
Keep what members tell the bot across conversations. The master switch for the three below.
|
|
1393
|
+
.br
|
|
1394
|
+
Values: true or false. Default: true.
|
|
1395
|
+
.TP
|
|
1396
|
+
\fBmember_learning.interests\fR
|
|
1397
|
+
Track the topics each member asks about.
|
|
1398
|
+
.br
|
|
1399
|
+
Values: true or false. Default: false.
|
|
1400
|
+
.TP
|
|
1401
|
+
\fBmember_learning.trajectory\fR
|
|
1402
|
+
Note when a member's state_fields change between turns.
|
|
1403
|
+
.br
|
|
1404
|
+
Values: true or false. Default: false.
|
|
1405
|
+
.TP
|
|
1406
|
+
\fBmember_learning.query_priors\fR
|
|
1407
|
+
Lean searches toward the member's main interests.
|
|
1408
|
+
.br
|
|
1409
|
+
Values: true or false. Default: false.
|
|
1410
|
+
.SS model
|
|
1411
|
+
.TP
|
|
1412
|
+
\fBmodel\fR
|
|
1413
|
+
The AI model this bot answers with. default: the workspace's default model.
|
|
1414
|
+
.br
|
|
1415
|
+
Values: text, or default. Default: default.
|
|
1416
|
+
.TP
|
|
1417
|
+
\fBprovider\fR
|
|
1418
|
+
How the model is reached: anthropic directly, or opencode (for models from other providers). default: anthropic.
|
|
1419
|
+
.br
|
|
1420
|
+
Values: anthropic | opencode, or default. Default: default.
|
|
1421
|
+
.TP
|
|
1422
|
+
\fBprompt_cache_ttl\fR
|
|
1423
|
+
How long the provider keeps the bot's prompt cached. 1h costs more to write and pays off when a member's messages come 5 to 60 minutes apart. The AI sees the same text either way.
|
|
1424
|
+
.br
|
|
1425
|
+
Values: 5m | 1h. Default: 5m.
|
|
1426
|
+
.SS replies
|
|
1427
|
+
.TP
|
|
1428
|
+
\fBautopilot_default\fR
|
|
1429
|
+
Whether the bot answers new conversations. on: it answers. off: a human inbox, the bot never answers. handoff: it answers until it hands the conversation to a person.
|
|
1430
|
+
.br
|
|
1431
|
+
Values: on | off | handoff. Default: handoff.
|
|
1432
|
+
.TP
|
|
1433
|
+
\fBingestion_window_ms\fR
|
|
1434
|
+
How long to wait for more messages before answering, so a burst of short messages gets one reply. 0 answers at once. default: the channel's own.
|
|
1435
|
+
.br
|
|
1436
|
+
Values: a number from 0 to 600000, or default. Default: default.
|
|
1437
|
+
.TP
|
|
1438
|
+
\fBoffchannel_widget_fallback\fR
|
|
1439
|
+
On WhatsApp and Instagram, which can't show a form: text asks for the answers in the chat, link sends a link to the form on the web.
|
|
1440
|
+
.br
|
|
1441
|
+
Values: text | link. Default: text.
|
|
1442
|
+
.TP
|
|
1443
|
+
\fBoffchannel_handoff\fR
|
|
1444
|
+
On WhatsApp and Instagram: off answers there, link moves the customer to the web chat on the first reply (it costs nothing per message).
|
|
1445
|
+
.br
|
|
1446
|
+
Values: off | link. Default: off.
|
|
1447
|
+
.TP
|
|
1448
|
+
\fBoffchannel_close\fR
|
|
1449
|
+
When a sale is ready: handoff passes the lead to a salesperson, direct has the bot close it in the chat.
|
|
1450
|
+
.br
|
|
1451
|
+
Values: handoff | direct. Default: handoff.
|
|
1452
|
+
.TP
|
|
1453
|
+
\fBlead_watch.mode\fR
|
|
1454
|
+
Flag WhatsApp and Instagram leads about to be lost. tag: a tag and a note only. assign: also assign the conversation to the least busy teammate. off.
|
|
1455
|
+
.br
|
|
1456
|
+
Values: tag | assign | off. Default: tag.
|
|
1457
|
+
.TP
|
|
1458
|
+
\fBlead_watch.stalled_minutes\fR
|
|
1459
|
+
Minutes a customer can leave the bot waiting before the lead counts as stalled.
|
|
1460
|
+
.br
|
|
1461
|
+
Values: a number from 10 to 1440. Default: 30.
|
|
1462
|
+
.TP
|
|
1463
|
+
\fBlead_watch.window_hours\fR
|
|
1464
|
+
Hours after the customer's last WhatsApp message to flag the 24\-hour window as closing.
|
|
1465
|
+
.br
|
|
1466
|
+
Values: a number from 1 to 23. Default: 20.
|
|
1467
|
+
.TP
|
|
1468
|
+
\fBallow_ambient_uploads\fR
|
|
1469
|
+
Show an attach button in the web chat, so members can send files with their message.
|
|
1470
|
+
.br
|
|
1471
|
+
Values: true or false. Default: false.
|
|
1472
|
+
.SS limits
|
|
1473
|
+
.TP
|
|
1474
|
+
\fBapi_rate_limit_per_min\fR
|
|
1475
|
+
Conversations API requests a minute, per end user. none: the workspace default.
|
|
1476
|
+
.br
|
|
1477
|
+
Values: a number from 1 to 100000, or none. Default: none.
|
|
1478
|
+
.TP
|
|
1479
|
+
\fBdaily_message_cap_per_user\fR
|
|
1480
|
+
Messages a day per end user. none: no cap.
|
|
1481
|
+
.br
|
|
1482
|
+
Values: a number from 1 to 100000, or none. Default: none.
|
|
1483
|
+
.TP
|
|
1484
|
+
\fBsoft_daily_cap_cents\fR
|
|
1485
|
+
AI spend a day, in cents, past which the workspace is warned. none: no warning.
|
|
1486
|
+
.br
|
|
1487
|
+
Values: a number from 1 to 100000000, or none. Default: none.
|
|
1488
|
+
.TP
|
|
1489
|
+
\fBhard_daily_cap_cents\fR
|
|
1490
|
+
AI spend a day, in cents, past which the bot stops answering until tomorrow. none: no cap.
|
|
1491
|
+
.br
|
|
1492
|
+
Values: a number from 1 to 100000000, or none. Default: none.
|
|
1493
|
+
.SS data
|
|
1494
|
+
.TP
|
|
1495
|
+
\fBexpose_member_data\fR
|
|
1496
|
+
Let the workspace's dashboards read this bot's member memories and profiles over the Sync API. They are personal data; off unless you need them.
|
|
1497
|
+
.br
|
|
1498
|
+
Values: true or false. Default: false.
|
|
1499
|
+
.SH TOKENS
|
|
1500
|
+
.TP
|
|
1501
|
+
\fBsync\fR
|
|
1502
|
+
data (/api/sync/v1). From \fBoalo login\fR (read\-only), dashboard \-> Account \-> CLI & agents, or dashboard \-> Sync API for an app's own servers. Used by typegen, data.
|
|
1503
|
+
.br
|
|
1504
|
+
Server\-side only. Carries no end\-user identity, so it reads and writes EVERY member's rows. Never ship one inside a mobile or web app.
|
|
1505
|
+
.TP
|
|
1506
|
+
\fBcli\fR
|
|
1507
|
+
control (the build surface). From \fBoalo login\fR, or dashboard \-> Account \-> CLI & agents. Used by whoami, tail, call, run, emit, data, tokens, docs, apps, deploy, env, logs, secrets, loops, flows, pull, status, lint, push, qa, rehearse, bots, sources, mcp.
|
|
1508
|
+
.br
|
|
1509
|
+
Acts as you, with exactly your permissions. No read\-only mode. Treat it like a password.
|
|
1510
|
+
.SH ENVIRONMENT
|
|
1511
|
+
.TP
|
|
1512
|
+
\fBOALO_URL\fR
|
|
1513
|
+
Workspace URL; overrides the linked config.
|
|
1514
|
+
.TP
|
|
1515
|
+
\fBOALO_SYNC_TOKEN\fR
|
|
1516
|
+
Sync token; overrides the stored one.
|
|
1517
|
+
.TP
|
|
1518
|
+
\fBOALO_CLI_TOKEN\fR
|
|
1519
|
+
CLI token; overrides the stored one.
|
|
1520
|
+
.TP
|
|
1521
|
+
\fBOALO_HOME\fR
|
|
1522
|
+
Relocate the credential store (CI, containers, tests).
|
|
1523
|
+
.TP
|
|
1524
|
+
\fBOALO_DEBUG\fR
|
|
1525
|
+
Log channel transport activity to stderr.
|
|
1526
|
+
.TP
|
|
1527
|
+
\fBNO_COLOR\fR
|
|
1528
|
+
Disable colour in tail output.
|
|
1529
|
+
.SH SEE ALSO
|
|
1530
|
+
\fBoalo help\fR, \fBoalo docs\fR (the workspace's platform pages).
|