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 +192 -116
- package/agent_instructions.md +175 -35
- package/bin/oomi-ai.js +337 -39
- package/bin/sessionBridgeState.js +29 -2
- package/openclaw.extension.js +41 -2
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/skills/oomi/SKILL.md +127 -60
- package/skills/oomi/agent_instructions.md +30 -0
package/README.md
CHANGED
|
@@ -1,148 +1,224 @@
|
|
|
1
1
|
# oomi-ai
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
OpenClaw channel plugin and bridge tooling for Oomi managed chat and voice.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
49
|
+
|
|
50
|
+
Install the OpenClaw plugin:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
openclaw plugins install oomi-ai@latest
|
|
13
54
|
```
|
|
14
55
|
|
|
15
|
-
|
|
56
|
+
Upgrade an existing machine:
|
|
16
57
|
|
|
17
|
-
|
|
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
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
```
|
|
110
|
+
Optional fields:
|
|
111
|
+
- `defaultSessionKey`
|
|
112
|
+
- `requestTimeoutMs`
|
|
33
113
|
|
|
34
|
-
|
|
35
|
-
```
|
|
36
|
-
oomi init
|
|
37
|
-
```
|
|
114
|
+
## Runtime Model
|
|
38
115
|
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
oomi openclaw install
|
|
42
|
-
```
|
|
116
|
+
There are two runtime contracts worth understanding.
|
|
43
117
|
|
|
44
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
219
|
+
|
|
220
|
+
Then publish the bumped version:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
npm publish --access public
|
|
148
224
|
```
|
package/agent_instructions.md
CHANGED
|
@@ -1,46 +1,186 @@
|
|
|
1
|
-
# Oomi
|
|
1
|
+
# Oomi OpenClaw Operator Guide
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
13
|
+
## Standard Connect Flow
|
|
15
14
|
|
|
16
|
-
If the user asks to connect OpenClaw to Oomi voice
|
|
15
|
+
If the user asks to connect OpenClaw to Oomi chat or voice:
|
|
17
16
|
|
|
18
|
-
1. Refresh bootstrap
|
|
17
|
+
1. Refresh bootstrap first:
|
|
19
18
|
- `curl -fsSL https://www.oomi.ai/install.sh | bash`
|
|
20
|
-
2. Ensure `oomi-ai` is installed
|
|
21
|
-
-
|
|
22
|
-
|
|
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.
|
|
26
|
+
5. Print the config block and secrets:
|
|
27
27
|
- `oomi openclaw plugin --show-secrets --backend-url https://api.oomi.ai`
|
|
28
|
-
6.
|
|
29
|
-
7.
|
|
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
|
-
-
|
|
32
|
-
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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`
|