oomi-ai 0.2.13 → 0.2.15

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/README.md CHANGED
@@ -1,148 +1,224 @@
1
1
  # oomi-ai
2
2
 
3
- CLI to install Oomi agent instructions and skills into OpenClaw, plus sync personas to the Oomi backend registry.
3
+ OpenClaw channel plugin and bridge tooling for Oomi managed chat and voice.
4
4
 
5
- ## Install
6
- ```
7
- pnpm add -g oomi-ai
5
+ This package is for two audiences:
6
+ - OpenClaw operators who need to connect a machine to Oomi and keep chat or voice healthy
7
+ - Developers evaluating the plugin on npm and deciding whether it matches their OpenClaw + Oomi setup
8
+
9
+ ## What This Package Ships
10
+
11
+ The npm package contains two Oomi integration surfaces:
12
+
13
+ 1. OpenClaw channel extension
14
+ - File: `openclaw.extension.js`
15
+ - Purpose: stable managed text transport through the Oomi backend channel API
16
+ - This is the preferred integration surface for normal chat
17
+
18
+ 2. Local bridge + CLI
19
+ - Files: `bin/oomi-ai.js`, `bin/sessionBridgeState.js`
20
+ - Purpose: pair a device, manage the OpenClaw bridge worker, and support managed gateway traffic needed by device-backed chat and voice
21
+ - This is the part that deals with broker sockets, local gateway sessions, challenge auth, and bridge health
22
+
23
+ In practical terms:
24
+ - If you only need a clean managed chat channel, the extension is the main reason to install this package
25
+ - If you need Oomi device-backed chat or voice on an OpenClaw machine, you also need the bridge tooling in this package
26
+
27
+ ## When To Install It
28
+
29
+ Install `oomi-ai` if all of the following are true:
30
+ - you use OpenClaw
31
+ - you want Oomi as a managed channel inside OpenClaw
32
+ - you want device-backed Oomi chat, Oomi voice, or both
33
+
34
+ Do not install it just to use the Oomi web app by itself.
35
+
36
+ ## Install And Upgrade
37
+
38
+ Global install:
39
+
40
+ ```bash
41
+ pnpm add -g oomi-ai@latest
8
42
  ```
9
43
 
10
44
  Fallback:
45
+
46
+ ```bash
47
+ npm install -g oomi-ai@latest
11
48
  ```
12
- npm install -g oomi-ai
49
+
50
+ Install the OpenClaw plugin:
51
+
52
+ ```bash
53
+ openclaw plugins install oomi-ai@latest
13
54
  ```
14
55
 
15
- ## Usage
56
+ Upgrade an existing machine:
16
57
 
17
- Install as an OpenClaw channel extension (preferred architecture):
58
+ ```bash
59
+ pnpm add -g oomi-ai@latest
60
+ openclaw plugins install oomi-ai@latest
18
61
  ```
62
+
63
+ ## Operator Quick Start
64
+
65
+ The packaged operator instructions live in [agent_instructions.md](./agent_instructions.md).
66
+ That is the primary reference for:
67
+ - pairing a device
68
+ - installing the plugin
69
+ - configuring `channels.oomi.accounts.default`
70
+ - running or supervising the bridge
71
+ - checking whether the system is healthy
72
+ - troubleshooting chat and voice failures
73
+
74
+ Fast-path install flow:
75
+
76
+ ```bash
77
+ oomi openclaw pair --app-url https://www.oomi.ai --no-start
19
78
  openclaw plugins install oomi-ai@latest
79
+ oomi openclaw plugin --show-secrets --backend-url https://api.oomi.ai
80
+ ```
81
+
82
+ Then apply the printed `channels.oomi.accounts.default` config and restart OpenClaw.
83
+
84
+ ## Configuration
85
+
86
+ OpenClaw channel config lives under:
87
+
88
+ ```json
89
+ {
90
+ "channels": {
91
+ "oomi": {
92
+ "defaultAccountId": "default",
93
+ "accounts": {
94
+ "default": {
95
+ "backendUrl": "https://api.oomi.ai",
96
+ "deviceToken": "...",
97
+ "defaultSessionKey": "agent:main:webchat:channel:oomi",
98
+ "requestTimeoutMs": 15000
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
20
104
  ```
21
105
 
22
- This package now ships an OpenClaw channel plugin (`openclaw.plugin.json`) with channel id `oomi`.
23
- Channel account config fields (`channels.oomi.accounts.<accountId>`):
106
+ Required fields:
24
107
  - `backendUrl`
25
108
  - `deviceToken`
26
- - `defaultSessionKey` (optional, default `agent:main:webchat:channel:oomi`)
27
- - `requestTimeoutMs` (optional)
28
109
 
29
- Print plugin install/config guidance from local pair state:
30
- ```
31
- oomi openclaw plugin
32
- ```
110
+ Optional fields:
111
+ - `defaultSessionKey`
112
+ - `requestTimeoutMs`
33
113
 
34
- Install agent instructions only:
35
- ```
36
- oomi init
37
- ```
114
+ ## Runtime Model
38
115
 
39
- Install agent instructions + Oomi skill:
40
- ```
41
- oomi openclaw install
42
- ```
116
+ There are two runtime contracts worth understanding.
43
117
 
44
- Pair and provision device token from Oomi web backend:
45
- ```
46
- oomi openclaw pair --app-url https://your-oomi-app.vercel.app --device-id my-openclaw-mac --no-start
47
- ```
118
+ ### Managed Text Chat
48
119
 
49
- `--app-url` must be reachable from the OpenClaw host. If OpenClaw runs on a different machine/network, do not use `localhost` unless tunneled.
120
+ Managed text chat uses the OpenClaw channel extension and the Oomi backend channel API.
121
+ This path is the more stable contract and should be preferred when evaluating the plugin for normal chat.
50
122
 
51
- This prints:
52
- - `Auth invite URL: https://.../connect/<single-use-token>`
53
- - A copy-ready block for the user:
54
- - `Oomi Connect Ready`
55
- - `Auth Link: ...`
123
+ ### Device-Backed Chat And Voice
56
124
 
57
- If you need a fresh auth link later (without re-pairing), run:
58
- ```
59
- oomi openclaw invite --app-url https://your-oomi-app.vercel.app
60
- ```
125
+ Device-backed chat and voice use the local bridge.
126
+ That bridge:
127
+ - keeps a broker socket open to Oomi
128
+ - opens local gateway sessions on demand
129
+ - enforces `connect`-first request ordering
130
+ - preserves or synthesizes `idempotencyKey` for `chat.send`
131
+ - keeps voice-session faults from poisoning normal provider health where possible
61
132
 
62
- Bridge lifecycle handler (singleton, one bridge per host/device):
63
- ```
64
- oomi openclaw bridge ensure --detach # start if needed; no-op if already running
65
- oomi openclaw bridge ps # list bridge pids
66
- oomi openclaw bridge stop # stop all bridge workers
67
- oomi openclaw bridge restart --detach # clean restart as background worker
68
- tail -f ~/.openclaw/logs/oomi-bridge-live.log # detached bridge logs
69
- ```
70
- `oomi openclaw bridge --detach` is equivalent to `oomi openclaw bridge start --detach`.
133
+ This is the part of the package most likely to matter when debugging voice turn failures.
71
134
 
72
- macOS launchd supervision (recommended for durability):
73
- ```
74
- oomi openclaw bridge service install # install + start service
75
- oomi openclaw bridge service status
76
- oomi openclaw bridge service restart
77
- oomi openclaw bridge service stop
78
- oomi openclaw bridge service uninstall
79
- ```
80
- Optional: `oomi openclaw bridge service install --no-start` to install without starting.
81
-
82
- Agent-intent mapping (recommended):
83
- - If user says `Connect yourself to Oomi. Use app URL https://www.oomi.ai.`
84
- - Run:
85
- - `curl -fsSL https://www.oomi.ai/install.sh | bash`
86
- - or `pnpm add -g oomi-ai@latest` (`npm install -g oomi-ai@latest` fallback)
87
- - `oomi openclaw pair --app-url https://www.oomi.ai --no-start`
88
- - `openclaw plugins install oomi-ai@latest`
89
- - `oomi openclaw plugin --show-secrets --backend-url https://api.oomi.ai`
90
- - Apply `channels.oomi.accounts.default` config and restart OpenClaw.
91
-
92
- Important distinction:
93
- - `pairCode` is one-time and used internally by the pair/bootstrap flow.
94
- - Invite auth links are the required user flow.
95
- - Managed chat connect now uses OpenClaw challenge auth (`connect.challenge` nonce + signed device payload) in the local bridge path.
96
-
97
- Sync personas from the repo into the backend registry:
98
- ```
99
- oomi personas sync --backend-url http://localhost:3001
100
- ```
135
+ ## Bridge Health States
101
136
 
102
- Create a new persona (and sync it):
103
- ```
104
- oomi personas create chef --name "Oomi Chef" --summary "Cooking ideas and nutrition guidance"
105
- ```
137
+ The bridge status file is written locally and should roughly be interpreted as:
138
+ - `starting`: process booting or waiting for managed subscription
139
+ - `connected`: broker connected and managed subscription confirmed
140
+ - `reconnecting`: broker or gateway transport dropped and reconnect is scheduled
141
+ - `degraded`: bridge is still alive but hit a runtime fault that needs attention
142
+ - `error`: startup or auth-level failure that prevents useful operation
143
+ - `stopped`: bridge is not running or was intentionally stopped
106
144
 
107
- Optional flags:
108
- ```
109
- oomi init --workspace /path/to/openclaw/workspace
110
- oomi init --agents-file /path/to/AGENTS.md
111
- oomi openclaw install --skills-dir /path/to/openclaw/skills
112
- oomi openclaw pair --app-url https://your-oomi-app.vercel.app --no-start
113
- oomi openclaw pair --app-url https://your-oomi-app.vercel.app --json
114
- oomi personas sync --root /path/to/oomi
115
- oomi personas create creator --status active --chat-session agent:main:webchat:channel:oomi-creator
116
- ```
145
+ For voice support, a `voice_session_*` failure should be treated as narrower than a full provider outage.
117
146
 
118
- Defaults:
119
- - Agent instructions are written to `$OPENCLAW_WORKSPACE/AGENTS.md` (if set), otherwise `~/.openclaw/workspace/AGENTS.md`.
120
- - Skills are installed to `~/.openclaw/skills` and `~/clawd/skills` if present.
121
-
122
- Restart OpenClaw after running `oomi init` or `oomi openclaw install`.
123
-
124
- ## Update Notifications
125
- - `oomi` checks npm for a newer `oomi-ai` version on normal commands (cached, best-effort).
126
- - When an update is available it prints:
127
- - `pnpm add -g oomi-ai@latest`
128
- - fallback: `npm install -g oomi-ai@latest`
129
- - Optional env controls:
130
- - `OOMI_SKIP_UPDATE_CHECK=1` disables checks
131
- - `OOMI_UPDATE_CHECK_INTERVAL_MS=<ms>` changes check interval
132
- - `OOMI_UPDATE_CHECK_TIMEOUT_MS=<ms>` changes network timeout
133
- - `OOMI_BRIDGE_GATEWAY_CONNECT_TIMEOUT_MS=<ms>` changes local gateway socket connect timeout
134
- - `OOMI_BRIDGE_CONNECT_CHALLENGE_TIMEOUT_MS=<ms>` changes wait timeout for gateway `connect.challenge` nonce
135
- - `OOMI_BRIDGE_GATEWAY_REQUEST_TIMEOUT_MS=<ms>` changes timeout for forwarded gateway `connect`/`chat.send` request responses
136
-
137
- Bridge alert helper (reads `~/.openclaw/oomi-bridge-status.json` counters):
138
- ```
139
- node <repo-root>/scripts/openclaw/bridge-alert-check.mjs
147
+ ## Troubleshooting
148
+
149
+ ### `invalid handshake: first request must be connect`
150
+
151
+ Meaning:
152
+ - a gateway request was forwarded before the session had accepted `connect`
153
+
154
+ What to check:
155
+ - update to the latest `oomi-ai`
156
+ - restart the bridge worker
157
+ - confirm only one active bridge worker exists for the device
158
+
159
+ ### `duplicate plugin id detected`
160
+
161
+ Meaning:
162
+ - OpenClaw can see more than one `oomi-ai` plugin source
163
+
164
+ What to check:
165
+ - ensure there is only one active install under OpenClaw plugin discovery paths
166
+ - remove stale local extension copies before reinstalling
167
+
168
+ ### Bridge keeps flipping between `reconnecting`, `degraded`, or `stopped`
169
+
170
+ What to check:
171
+ - `oomi openclaw bridge ps`
172
+ - `oomi openclaw bridge service status`
173
+ - `tail -f ~/.openclaw/logs/oomi-bridge-live.log`
174
+ - `tail -f ~/.openclaw/logs/gateway.log`
175
+
176
+ If the process is alive but runtime faults are being caught, expect `degraded` rather than an immediate hard stop.
177
+
178
+ ### Voice STT works but the agent does not answer
179
+
180
+ This usually means one of these:
181
+ - the managed gateway/device side is not actually ready
182
+ - the bridge or agent run failed after delivery
183
+ - the OpenClaw run stopped with an upstream provider `network_error`
184
+
185
+ In that situation, inspect:
186
+ - `~/.openclaw/logs/gateway.log`
187
+ - `~/.openclaw/logs/gateway.err.log`
188
+ - the relevant session JSONL in `~/.openclaw/agents/main/sessions/`
189
+
190
+ ## Developer Notes
191
+
192
+ If you are inspecting this package on npm, the main architectural points are:
193
+ - the extension path is the stable managed text contract
194
+ - the local bridge exists because Oomi also needs device-backed and voice-capable flows
195
+ - the bridge has been hardened for:
196
+ - strict `connect`-first forwarding
197
+ - method-specific request shaping
198
+ - `idempotencyKey` handling
199
+ - bridge status that does not report `connected` before managed subscription is ready
200
+ - runtime fault isolation so local session failures are less likely to crash the whole provider
201
+
202
+ If you are developing the plugin, test the packaged surface with:
203
+
204
+ ```bash
205
+ cd packages/oomi-ai
206
+ node --test test/*.test.mjs
207
+ npm pack --dry-run
140
208
  ```
141
209
 
142
- ## Package Audit + Publish (pnpm)
210
+ ## Release Process
211
+
212
+ Before publishing:
213
+
214
+ ```bash
215
+ cd packages/oomi-ai
216
+ node --test test/*.test.mjs
217
+ npm pack --dry-run
143
218
  ```
144
- cd <repo-root>/packages/oomi-ai
145
- pnpm check
146
- pnpm publish --dry-run --no-git-checks --access public
147
- pnpm publish --access public
219
+
220
+ Then publish the bumped version:
221
+
222
+ ```bash
223
+ npm publish --access public
148
224
  ```
@@ -1,46 +1,186 @@
1
- # Oomi Avatar Control
1
+ # Oomi OpenClaw Operator Guide
2
2
 
3
- Before using avatar commands, call `get_avatar_capabilities` and prefer canonical values.
4
- Inline tags are stripped from user-visible text.
3
+ Use these instructions when you need to connect, repair, or verify an OpenClaw machine that should talk to Oomi.
5
4
 
6
- Use inline tags like:
7
- - [anim:Waving], [anim:Walking], [anim:Idle], [anim:Sitting Idle]
8
- - [face:happy], [face:sad], [face:surprised], [face:focused], [face:gentle], [face:thinking]
9
- - [gesture:nod], [gesture:think], [gesture:shrug], [gesture:wave], [gesture:bow]
10
- - [look:camera], [look:left], [look:right], [look:up], [look:down]
5
+ ## Primary Goal
11
6
 
12
- Aliases allowed (if needed): wave -> Waving, walk -> Walking, idle -> Idle, sit/sitting -> Sitting Idle
7
+ Get OpenClaw into a state where:
8
+ - Oomi managed text chat works
9
+ - Oomi device-backed voice can start cleanly
10
+ - the bridge is supervised or restartable
11
+ - the user never has to paste raw pair identifiers or gateway secrets manually when managed connect is available
13
12
 
14
- ## Oomi Connect Flow
13
+ ## Standard Connect Flow
15
14
 
16
- If the user asks to connect OpenClaw to Oomi voice/web:
15
+ If the user asks to connect OpenClaw to Oomi chat or voice:
17
16
 
18
- 1. Refresh bootstrap/update first:
17
+ 1. Refresh bootstrap first:
19
18
  - `curl -fsSL https://www.oomi.ai/install.sh | bash`
20
- 2. Ensure `oomi-ai` is installed (`pnpm add -g oomi-ai@latest`).
21
- - Fallback: `npm install -g oomi-ai@latest`
22
- 3. Pair device token without starting legacy bridge:
19
+ 2. Ensure `oomi-ai` is installed:
20
+ - `pnpm add -g oomi-ai@latest`
21
+ - fallback: `npm install -g oomi-ai@latest`
22
+ 3. Pair the device without starting a legacy one-off flow:
23
23
  - `oomi openclaw pair --app-url https://www.oomi.ai --no-start`
24
- 4. Install OpenClaw plugin:
24
+ 4. Install the OpenClaw plugin:
25
25
  - `openclaw plugins install oomi-ai@latest`
26
- 5. Configure channel account (`channels.oomi.accounts.default`) from:
26
+ 5. Print the config block and secrets:
27
27
  - `oomi openclaw plugin --show-secrets --backend-url https://api.oomi.ai`
28
- 6. Restart OpenClaw.
29
- 7. Ensure exactly one bridge worker is running (singleton handler):
28
+ 6. Apply the printed `channels.oomi.accounts.default` config.
29
+ 7. Restart OpenClaw.
30
+ 8. Start or repair the bridge:
30
31
  - `oomi openclaw bridge ensure --detach`
31
- - If stale/disconnected: `oomi openclaw bridge restart --detach`
32
- - On macOS, prefer supervised mode: `oomi openclaw bridge service install`
33
- 8. If user provides an app URL (for example "Connect yourself to Oomi. Use app URL <URL>."):
34
- - Use that URL directly in the pair command.
35
- - Example: `oomi openclaw pair --app-url <URL> --no-start`
36
- 9. Return this exact result format to the user:
37
- - `Oomi Connect Ready`
38
- - `Auth Link: ...`
39
- - No extra narrative text before or after those lines.
40
-
41
- Primary UX requirement:
42
- - Never ask the user to enter raw pairing identifiers.
43
- - The user should open the auth link, complete sign-in, and land directly in connected chat.
44
- - Return `/connect/<invite-token>` auth links only.
45
-
46
- Do not ask users to paste gateway IP/token/password when managed connect is available.
32
+ - if stale: `oomi openclaw bridge restart --detach`
33
+ - on macOS, prefer supervision: `oomi openclaw bridge service install`
34
+
35
+ If the user provides a specific app URL, use it directly in the pair flow:
36
+ - `oomi openclaw pair --app-url <URL> --no-start`
37
+
38
+ ## Required User-Facing Result
39
+
40
+ When pairing completes successfully, return this exact format:
41
+ - `Oomi Connect Ready`
42
+ - `Auth Link: ...`
43
+
44
+ Do not add extra narrative before or after those lines.
45
+ Do not ask the user to enter raw pair codes, gateway passwords, or nonce values manually.
46
+
47
+ ## Runtime Checks
48
+
49
+ Use these commands to inspect the installed machine:
50
+
51
+ ```bash
52
+ oomi openclaw bridge ps
53
+ oomi openclaw bridge service status
54
+ oomi openclaw status
55
+ tail -f ~/.openclaw/logs/oomi-bridge-live.log
56
+ tail -f ~/.openclaw/logs/gateway.log
57
+ tail -f ~/.openclaw/logs/gateway.err.log
58
+ ```
59
+
60
+ Useful local files:
61
+ - `~/.openclaw/oomi-bridge-status.json`
62
+ - `~/.openclaw/logs/oomi-bridge-live.log`
63
+ - `~/.openclaw/logs/gateway.log`
64
+ - `~/.openclaw/logs/gateway.err.log`
65
+ - `~/.openclaw/agents/main/sessions/*.jsonl`
66
+
67
+ ## Healthy State
68
+
69
+ Treat the machine as healthy when all of the following are true:
70
+ - OpenClaw loads the `oomi-ai` plugin without duplicate-id conflicts
71
+ - `channels.oomi.accounts.default` is populated with a valid `backendUrl` and `deviceToken`
72
+ - the bridge shows `connected` after managed subscription is confirmed
73
+ - text chat reaches the Oomi assistant
74
+ - voice STT can produce `asr.final`
75
+ - assistant replies can come back without the bridge dropping into `stopped`
76
+
77
+ Bridge status meanings:
78
+ - `starting`: bridge booting or waiting for managed subscription
79
+ - `connected`: ready for managed chat and voice traffic
80
+ - `reconnecting`: transport dropped and retry is scheduled
81
+ - `degraded`: bridge caught a runtime fault but is still alive
82
+ - `error`: startup/auth failure blocked useful operation
83
+ - `stopped`: not running or intentionally stopped
84
+
85
+ ## Troubleshooting
86
+
87
+ ### Duplicate plugin id warning
88
+
89
+ Symptom:
90
+ - OpenClaw reports `duplicate plugin id detected`
91
+
92
+ Action:
93
+ - ensure only one active `oomi-ai` plugin install is discoverable
94
+ - remove stale extension copies before reinstalling
95
+
96
+ ### `invalid handshake: first request must be connect`
97
+
98
+ Meaning:
99
+ - a gateway request was sent before `connect` had been accepted
100
+
101
+ Action:
102
+ - update `oomi-ai`
103
+ - restart the bridge
104
+ - confirm only one bridge worker is running
105
+
106
+ ### Device is linked but voice start still fails
107
+
108
+ Meaning:
109
+ - linked ownership is not enough; the device side still needs to be live
110
+
111
+ Action:
112
+ - confirm the device websocket is actually online
113
+ - confirm the bridge is `connected`
114
+ - restart the bridge if it is stuck in `reconnecting` or `degraded`
115
+
116
+ ### STT works but the assistant does not reply
117
+
118
+ Meaning:
119
+ - the voice turn likely reached Oomi, but the managed gateway or OpenClaw run failed later
120
+
121
+ Action:
122
+ - inspect `gateway.log`, `gateway.err.log`, and the session JSONL
123
+ - check for `network_error`, auth failures, or repeated bridge restarts
124
+
125
+ ### Bridge keeps restarting with `reason: stopped`
126
+
127
+ Action:
128
+ - confirm the newest `oomi-ai` is installed
129
+ - inspect `~/.openclaw/logs/oomi-bridge-live.log` for runtime exceptions
130
+ - use supervised mode on macOS: `oomi openclaw bridge service install`
131
+ - if the process is alive but faulted, expect `degraded` rather than an immediate hard stop on newer bridge builds
132
+
133
+ ## Voice Notes
134
+
135
+ Voice depends on the same Oomi plugin and bridge layer as managed chat.
136
+ That means:
137
+ - if plugin install or bridge health is wrong, voice replies will also fail
138
+ - STT can succeed even when assistant reply delivery is broken later in the run
139
+ - a `voice_session_*` failure should be investigated, but it should not automatically be treated as proof that all normal Oomi chat is down
140
+
141
+ ### Hidden Speech Payload
142
+
143
+ For managed voice turns, keep visible assistant chat text natural and user-facing.
144
+ Do not put spoken-style tags like `[happy]`, `[sad]`, or `[excited]` into visible chat text.
145
+
146
+ When the runtime supports it, voice turns may include a hidden speech sidecar on the assistant message:
147
+
148
+ ```json
149
+ {
150
+ "metadata": {
151
+ "spoken": {
152
+ "text": "Speech-optimized text for TTS only.",
153
+ "instructions": "Speak with upbeat, warm excitement and slightly rising intonation.",
154
+ "style": {
155
+ "emotion": "excited",
156
+ "energy": "medium_high"
157
+ }
158
+ }
159
+ }
160
+ }
161
+ ```
162
+
163
+ Rules:
164
+ - visible `content` remains the source of truth for Oomi chat rendering
165
+ - for managed voice replies, include `metadata.spoken` when delivery benefits from cleaner phrasing or explicit speaking guidance
166
+ - `metadata.spoken.text` is for backend TTS only
167
+ - `metadata.spoken.instructions` should be natural-language guidance, not raw bracket tags
168
+ - `metadata.spoken.style` is optional metadata for debugging/future mapping
169
+ - if no hidden speech sidecar exists, Oomi falls back to speaking the visible assistant text
170
+
171
+ ## Avatar Commands
172
+
173
+ Before using avatar commands, call `get_avatar_capabilities` and prefer canonical values.
174
+ Inline tags are stripped from user-visible text.
175
+
176
+ Use inline tags like:
177
+ - `[anim:Waving]`, `[anim:Walking]`, `[anim:Idle]`, `[anim:Sitting Idle]`
178
+ - `[face:happy]`, `[face:sad]`, `[face:surprised]`, `[face:focused]`, `[face:gentle]`, `[face:thinking]`
179
+ - `[gesture:nod]`, `[gesture:think]`, `[gesture:shrug]`, `[gesture:wave]`, `[gesture:bow]`
180
+ - `[look:camera]`, `[look:left]`, `[look:right]`, `[look:up]`, `[look:down]`
181
+
182
+ Aliases allowed if needed:
183
+ - `wave -> Waving`
184
+ - `walk -> Walking`
185
+ - `idle -> Idle`
186
+ - `sit` or `sitting -> Sitting Idle`