oomi-ai 0.2.49 → 0.3.0
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 +227 -463
- package/agent_instructions.md +244 -234
- package/bin/oomi-ai.js +4028 -5797
- package/bin/sessionBridgeState.js +78 -78
- package/lib/openclawPaths.js +70 -71
- package/lib/openclawProfile.js +216 -216
- package/lib/personaApiClient.js +133 -303
- package/lib/spokenMetadata.js +137 -137
- package/openclaw.extension.js +341 -341
- package/openclaw.plugin.json +17 -17
- package/package.json +59 -59
- package/persona-app/README.md +27 -0
- package/persona-app/registry/v1.json +63 -0
- package/persona-app/schema/persona-app.v1.schema.json +90 -0
- package/skills/oomi/SKILL.md +165 -182
- package/skills/oomi/agent_instructions.md +99 -80
- package/lib/channelPluginClient.js +0 -119
- package/lib/openclawDevGateway.js +0 -384
- package/lib/personaJobExecutor.js +0 -139
- package/lib/personaJobPoller.js +0 -112
- package/lib/personaPortAllocator.js +0 -36
- package/lib/personaRuntimeManager.js +0 -496
- package/lib/personaRuntimeProcess.js +0 -924
- package/lib/personaRuntimeRegistry.js +0 -67
- package/lib/personaRuntimeSupervisor.js +0 -330
- package/lib/scaffold.js +0 -108
- package/lib/template.js +0 -45
- package/skills/oomi/config.json +0 -3
- package/skills/oomi/scripts/get_avatar_capabilities.py +0 -40
- package/skills/oomi/scripts/get_data.py +0 -49
- package/skills/oomi/scripts/install_agent_instructions.py +0 -78
- package/skills/oomi/scripts/send_goal.py +0 -53
- package/skills/oomi/scripts/sync.py +0 -46
- package/skills/oomi/setup.py +0 -41
- package/templates/persona-app/.env.example +0 -8
- package/templates/persona-app/README.md +0 -47
- package/templates/persona-app/eslint.config.js +0 -28
- package/templates/persona-app/index.html +0 -18
- package/templates/persona-app/oomi.runtime.json +0 -13
- package/templates/persona-app/package.json +0 -44
- package/templates/persona-app/persona/brief.md +0 -14
- package/templates/persona-app/persona.json +0 -14
- package/templates/persona-app/public/manifest.webmanifest +0 -8
- package/templates/persona-app/public/oomi.health.json +0 -6
- package/templates/persona-app/src/App.css +0 -379
- package/templates/persona-app/src/App.tsx +0 -17
- package/templates/persona-app/src/index.css +0 -53
- package/templates/persona-app/src/main.tsx +0 -23
- package/templates/persona-app/src/pages/HomePage.tsx +0 -127
- package/templates/persona-app/src/pages/ScenePage.tsx +0 -158
- package/templates/persona-app/src/persona/config.ts +0 -6
- package/templates/persona-app/src/persona/notes.ts +0 -9
- package/templates/persona-app/src/spatial.ts +0 -82
- package/templates/persona-app/src/vite-env.d.ts +0 -3
- package/templates/persona-app/template.json +0 -13
- package/templates/persona-app/tsconfig.app.json +0 -23
- package/templates/persona-app/tsconfig.json +0 -7
- package/templates/persona-app/tsconfig.node.json +0 -21
- package/templates/persona-app/vendor/webspatial/FORK.md +0 -6
- package/templates/persona-app/vendor/webspatial/core-sdk/LICENSE +0 -21
- package/templates/persona-app/vendor/webspatial/core-sdk/dist/iife/index.d.ts +0 -906
- package/templates/persona-app/vendor/webspatial/core-sdk/dist/iife/index.global.js +0 -75
- package/templates/persona-app/vendor/webspatial/core-sdk/dist/iife/index.global.js.map +0 -1
- package/templates/persona-app/vendor/webspatial/core-sdk/dist/index.d.ts +0 -906
- package/templates/persona-app/vendor/webspatial/core-sdk/dist/index.js +0 -3131
- package/templates/persona-app/vendor/webspatial/core-sdk/dist/index.js.map +0 -1
- package/templates/persona-app/vendor/webspatial/core-sdk/package.json +0 -45
- package/templates/persona-app/vendor/webspatial/react-sdk/LICENSE +0 -21
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/default/index.d.ts +0 -365
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/default/index.js +0 -4167
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/default/index.js.map +0 -1
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-dev-runtime.d.ts +0 -82
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-dev-runtime.js +0 -66
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-dev-runtime.js.map +0 -1
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-dev-runtime.web.d.ts +0 -2
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-dev-runtime.web.js +0 -18
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-dev-runtime.web.js.map +0 -1
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-runtime.d.ts +0 -5
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-runtime.js +0 -66
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-runtime.js.map +0 -1
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-runtime.web.d.ts +0 -1
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-runtime.web.js +0 -18
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-runtime.web.js.map +0 -1
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/web/index.d.ts +0 -365
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/web/index.js +0 -4207
- package/templates/persona-app/vendor/webspatial/react-sdk/dist/web/index.js.map +0 -1
- package/templates/persona-app/vendor/webspatial/react-sdk/package.json +0 -94
- package/templates/persona-app/vite.config.ts +0 -31
package/skills/oomi/SKILL.md
CHANGED
|
@@ -1,191 +1,174 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: oomi
|
|
3
|
-
description: Support Oomi OpenClaw installs, bridge health, managed chat and voice setup, and avatar control.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Oomi Skill
|
|
7
|
-
|
|
8
|
-
Use this skill when you need to:
|
|
9
|
-
- connect an OpenClaw machine to Oomi
|
|
10
|
-
- repair the Oomi plugin or bridge on a machine
|
|
11
|
-
- inspect managed chat or voice health
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
"pitch": "neutral",
|
|
156
|
-
"energy": "warm",
|
|
157
|
-
"volume": "normal",
|
|
158
|
-
"pause_after_ms": 280
|
|
159
|
-
}
|
|
160
|
-
],
|
|
161
|
-
"instructions": "Speak with upbeat, warm excitement and slightly rising intonation.",
|
|
162
|
-
"style": {
|
|
163
|
-
"emotion": "excited",
|
|
164
|
-
"energy": "medium_high"
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
```
|
|
170
|
-
|
|
1
|
+
---
|
|
2
|
+
name: oomi
|
|
3
|
+
description: Support Oomi OpenClaw installs, bridge health, managed chat and voice setup, persona app tools, and avatar control.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Oomi Skill
|
|
7
|
+
|
|
8
|
+
Use this skill when you need to:
|
|
9
|
+
- connect an OpenClaw machine to Oomi
|
|
10
|
+
- repair the Oomi plugin or bridge on a machine
|
|
11
|
+
- inspect managed chat or voice health
|
|
12
|
+
- inspect or update component-composed Oomi persona app state
|
|
13
|
+
- control the Oomi avatar with inline tags
|
|
14
|
+
|
|
15
|
+
## Primary Operator Workflow
|
|
16
|
+
|
|
17
|
+
If the user wants OpenClaw connected to Oomi:
|
|
18
|
+
|
|
19
|
+
1. Ensure `oomi-ai` is installed or updated:
|
|
20
|
+
```bash
|
|
21
|
+
pnpm add -g oomi-ai@latest
|
|
22
|
+
```
|
|
23
|
+
Fallback:
|
|
24
|
+
```bash
|
|
25
|
+
npm install -g oomi-ai@latest
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
2. Pair the device:
|
|
29
|
+
```bash
|
|
30
|
+
oomi openclaw pair --app-url https://www.oomi.ai --no-start
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
3. Install the plugin:
|
|
34
|
+
```bash
|
|
35
|
+
openclaw plugins install oomi-ai@latest
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
4. Print config guidance:
|
|
39
|
+
```bash
|
|
40
|
+
oomi openclaw plugin --show-secrets --backend-url https://api.oomi.ai
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
5. Apply the `channels.oomi.accounts.default` config and restart OpenClaw.
|
|
44
|
+
|
|
45
|
+
6. Refresh the running bridge after package updates:
|
|
46
|
+
```bash
|
|
47
|
+
oomi openclaw refresh --skip-version-check
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
7. Start or repair the bridge:
|
|
51
|
+
```bash
|
|
52
|
+
oomi openclaw bridge ensure --detach
|
|
53
|
+
```
|
|
54
|
+
If stale:
|
|
55
|
+
```bash
|
|
56
|
+
oomi openclaw bridge restart --detach
|
|
57
|
+
```
|
|
58
|
+
On macOS, prefer supervised mode:
|
|
59
|
+
```bash
|
|
60
|
+
oomi openclaw bridge service install
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Health Checks
|
|
64
|
+
|
|
65
|
+
Use these when chat or voice is failing:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
oomi openclaw bridge ps
|
|
69
|
+
oomi openclaw bridge service status
|
|
70
|
+
oomi openclaw status
|
|
71
|
+
tail -f ~/.openclaw/logs/oomi-bridge-live.log
|
|
72
|
+
tail -f ~/.openclaw/logs/gateway.log
|
|
73
|
+
tail -f ~/.openclaw/logs/gateway.err.log
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Interpret bridge states like this:
|
|
77
|
+
- `starting`: booting or waiting for managed subscription
|
|
78
|
+
- `connected`: ready for managed traffic
|
|
79
|
+
- `reconnecting`: retry scheduled after transport failure
|
|
80
|
+
- `degraded`: bridge caught a runtime fault but is still alive
|
|
81
|
+
- `error`: startup or auth failure blocked operation
|
|
82
|
+
- `stopped`: not running or intentionally shut down
|
|
83
|
+
|
|
84
|
+
## Common Failures
|
|
85
|
+
|
|
86
|
+
### Duplicate plugin id
|
|
87
|
+
- Cause: multiple discoverable `oomi-ai` installs
|
|
88
|
+
- Action: remove stale plugin copies and reinstall once
|
|
89
|
+
|
|
90
|
+
### `invalid handshake: first request must be connect`
|
|
91
|
+
- Cause: gateway request ordering broke
|
|
92
|
+
- Action: update `oomi-ai`, restart the bridge, confirm only one bridge worker exists
|
|
93
|
+
|
|
94
|
+
### STT works but the assistant does not reply
|
|
95
|
+
- Cause: the voice turn reached Oomi, but the managed gateway or OpenClaw run failed later
|
|
96
|
+
- Action: inspect `gateway.log`, `gateway.err.log`, and the session JSONL for that run
|
|
97
|
+
|
|
98
|
+
## Persona App State Tools
|
|
99
|
+
|
|
100
|
+
Component-composed persona apps are the default Oomi mini-app path. Use these commands when the user asks about or updates an existing native/web Oomi persona app such as Fitness Today:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
oomi persona-apps list --json
|
|
104
|
+
oomi persona-apps show fitness-today --json
|
|
105
|
+
oomi persona-apps apply-action fitness-today --action fitness.complete_workout --payload-json '{"goalId":"easy-run","minutes":20}' --json
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Rules:
|
|
109
|
+
- answer from returned `appState.bindings`, not from memory
|
|
110
|
+
- apply updates through approved `persona-apps apply-action` actions
|
|
111
|
+
- if the persona app does not exist, ask the user to add it from the Oomi client first so permissions and hydration can run
|
|
112
|
+
- do not create local persona UI projects from the OpenClaw machine
|
|
113
|
+
- do not execute persona UI jobs or start local persona app runtimes
|
|
114
|
+
|
|
115
|
+
## Hidden Speech Payload
|
|
116
|
+
|
|
117
|
+
Managed voice can carry a hidden TTS-only speech sidecar alongside the normal assistant message.
|
|
118
|
+
|
|
119
|
+
Use this shape when a voice turn needs more natural delivery without changing visible chat text:
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"metadata": {
|
|
124
|
+
"spoken": {
|
|
125
|
+
"text": "Speech-optimized text for TTS only.",
|
|
126
|
+
"language": "English",
|
|
127
|
+
"segments": [
|
|
128
|
+
{
|
|
129
|
+
"text": "Hey! It's Nemu, but close enough.",
|
|
130
|
+
"pace": "medium_fast",
|
|
131
|
+
"pitch": "slightly_high",
|
|
132
|
+
"energy": "bright",
|
|
133
|
+
"volume": "normal",
|
|
134
|
+
"pause_after_ms": 220
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"text": "Right now, I'm just waking up into this conversation with you.",
|
|
138
|
+
"pace": "medium",
|
|
139
|
+
"pitch": "neutral",
|
|
140
|
+
"energy": "warm",
|
|
141
|
+
"volume": "normal",
|
|
142
|
+
"pause_after_ms": 280
|
|
143
|
+
}
|
|
144
|
+
],
|
|
145
|
+
"instructions": "Speak with upbeat, warm excitement and slightly rising intonation.",
|
|
146
|
+
"style": {
|
|
147
|
+
"emotion": "excited",
|
|
148
|
+
"energy": "medium_high"
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
171
155
|
Rules:
|
|
172
156
|
- keep visible assistant `content` clean and user-facing
|
|
173
157
|
- do not place raw intonation tags in visible chat
|
|
174
158
|
- for managed cloned-voice replies, include `metadata.spoken` when backend TTS should speak the turn
|
|
175
159
|
- `metadata.spoken.text` is backend TTS input only
|
|
176
|
-
- `metadata.spoken.language` should
|
|
160
|
+
- `metadata.spoken.language` should use the backend-supported language value for the active provider; use `English` only when no more specific locale is supplied
|
|
177
161
|
- `metadata.spoken.segments` can carry bounded per-segment prosody for pace, pitch, volume, and pause timing
|
|
178
162
|
- `metadata.spoken.instructions` should use natural-language speaking guidance
|
|
179
163
|
- if you omit `metadata.spoken`, the shared package helper may synthesize it as a compatibility guardrail before backend TTS
|
|
180
164
|
- backend cloned voice is strict: if `metadata.spoken` does not reach Oomi, playback fails instead of falling back to flat speech
|
|
181
|
-
|
|
182
|
-
## Avatar Control
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
-
|
|
189
|
-
-
|
|
190
|
-
-
|
|
191
|
-
- gaze: `[look:camera]`, `[look:left]`, `[look:right]`, `[look:up]`, `[look:down]`
|
|
165
|
+
|
|
166
|
+
## Avatar Control
|
|
167
|
+
|
|
168
|
+
Prefer canonical avatar values. Use aliases only when explicitly needed.
|
|
169
|
+
|
|
170
|
+
Supported inline tags include:
|
|
171
|
+
- animations: `[anim:Waving]`, `[anim:Walking]`, `[anim:Idle]`, `[anim:Sitting Idle]`
|
|
172
|
+
- expressions: `[face:happy]`, `[face:sad]`, `[face:surprised]`, `[face:focused]`, `[face:gentle]`, `[face:thinking]`
|
|
173
|
+
- gestures: `[gesture:nod]`, `[gesture:think]`, `[gesture:shrug]`, `[gesture:wave]`, `[gesture:bow]`
|
|
174
|
+
- gaze: `[look:camera]`, `[look:left]`, `[look:right]`, `[look:up]`, `[look:down]`
|
|
@@ -1,80 +1,99 @@
|
|
|
1
|
-
# Oomi Avatar Control
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
Inline tags are stripped from user-visible text.
|
|
5
|
-
|
|
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]
|
|
11
|
-
|
|
12
|
-
Aliases allowed (if needed): wave -> Waving, walk -> Walking, idle -> Idle, sit/sitting -> Sitting Idle
|
|
13
|
-
|
|
14
|
-
## Oomi Connect Flow
|
|
15
|
-
|
|
16
|
-
If the user asks to connect OpenClaw to Oomi voice
|
|
17
|
-
|
|
18
|
-
1. Refresh bootstrap/update first:
|
|
19
|
-
- `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:
|
|
23
|
-
- `oomi openclaw pair --app-url https://www.oomi.ai --no-start`
|
|
24
|
-
4. Install OpenClaw plugin:
|
|
25
|
-
- `openclaw plugins install oomi-ai@latest`
|
|
26
|
-
5. Configure channel account (`channels.oomi.accounts.default`) from:
|
|
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):
|
|
30
|
-
- `oomi openclaw
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
- `
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
-
|
|
44
|
-
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
|
|
63
|
-
"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
-
|
|
73
|
-
- `metadata.spoken
|
|
74
|
-
- `metadata.spoken.
|
|
75
|
-
- `metadata.spoken.
|
|
76
|
-
- `metadata.spoken.
|
|
77
|
-
- `metadata.spoken.
|
|
78
|
-
-
|
|
79
|
-
- if
|
|
80
|
-
-
|
|
1
|
+
# Oomi Avatar Control
|
|
2
|
+
|
|
3
|
+
Prefer canonical avatar values.
|
|
4
|
+
Inline tags are stripped from user-visible text.
|
|
5
|
+
|
|
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]
|
|
11
|
+
|
|
12
|
+
Aliases allowed (if needed): wave -> Waving, walk -> Walking, idle -> Idle, sit/sitting -> Sitting Idle
|
|
13
|
+
|
|
14
|
+
## Oomi Connect Flow
|
|
15
|
+
|
|
16
|
+
If the user asks to connect OpenClaw to Oomi voice or chat:
|
|
17
|
+
|
|
18
|
+
1. Refresh bootstrap/update first:
|
|
19
|
+
- `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:
|
|
23
|
+
- `oomi openclaw pair --app-url https://www.oomi.ai --no-start`
|
|
24
|
+
4. Install OpenClaw plugin:
|
|
25
|
+
- `openclaw plugins install oomi-ai@latest`
|
|
26
|
+
5. Configure channel account (`channels.oomi.accounts.default`) from:
|
|
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):
|
|
30
|
+
- `oomi openclaw refresh --skip-version-check`
|
|
31
|
+
- `oomi openclaw bridge ensure --detach`
|
|
32
|
+
- If stale/disconnected: `oomi openclaw bridge restart --detach`
|
|
33
|
+
- On macOS, prefer supervised mode: `oomi openclaw bridge service install`
|
|
34
|
+
8. If user provides an app URL (for example "Connect yourself to Oomi. Use app URL <URL>."):
|
|
35
|
+
- Use that URL directly in the pair command.
|
|
36
|
+
- Example: `oomi openclaw pair --app-url <URL> --no-start`
|
|
37
|
+
9. Return this exact result format to the user:
|
|
38
|
+
- `Oomi Connect Ready`
|
|
39
|
+
- `Auth Link: ...`
|
|
40
|
+
- No extra narrative text before or after those lines.
|
|
41
|
+
|
|
42
|
+
Primary UX requirement:
|
|
43
|
+
- Never ask the user to enter raw pairing identifiers.
|
|
44
|
+
- The user should open the auth link, complete sign-in, and land directly in connected chat.
|
|
45
|
+
- Return `/connect/<invite-token>` auth links only.
|
|
46
|
+
|
|
47
|
+
Do not ask users to paste gateway IP/token/password when managed connect is available.
|
|
48
|
+
|
|
49
|
+
## Hidden Speech Payload
|
|
50
|
+
|
|
51
|
+
For managed voice turns, keep visible assistant chat text natural and user-facing.
|
|
52
|
+
Do not put spoken-style tags like `[happy]`, `[sad]`, or `[excited]` into visible chat text.
|
|
53
|
+
|
|
54
|
+
When the runtime supports it, voice turns may include a hidden speech sidecar on the assistant message:
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"metadata": {
|
|
59
|
+
"spoken": {
|
|
60
|
+
"text": "Speech-optimized text for TTS only.",
|
|
61
|
+
"instructions": "Speak with upbeat, warm excitement and slightly rising intonation.",
|
|
62
|
+
"style": {
|
|
63
|
+
"emotion": "excited",
|
|
64
|
+
"energy": "medium_high"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Rules:
|
|
72
|
+
- visible `content` remains the source of truth for Oomi chat rendering
|
|
73
|
+
- for managed voice replies, include `metadata.spoken` when delivery benefits from cleaner phrasing or explicit speaking guidance
|
|
74
|
+
- `metadata.spoken.text` is for backend TTS only
|
|
75
|
+
- `metadata.spoken.language` should use the backend-supported language value for the active provider; use `English` only when no more specific locale is supplied
|
|
76
|
+
- `metadata.spoken.segments` can carry bounded per-segment prosody for pace, pitch, volume, and pause timing
|
|
77
|
+
- `metadata.spoken.instructions` should be natural-language guidance, not raw bracket tags
|
|
78
|
+
- `metadata.spoken.style` is optional metadata for debugging or future mapping
|
|
79
|
+
- if no hidden speech sidecar exists, Oomi falls back to speaking the visible assistant text
|
|
80
|
+
- if you omit `metadata.spoken`, the plugin now synthesizes a bounded hidden fallback from visible assistant text
|
|
81
|
+
- visible chat text is never rewritten by the plugin
|
|
82
|
+
|
|
83
|
+
## Persona App API Tools
|
|
84
|
+
|
|
85
|
+
Oomi persona apps are component-composed client surfaces backed by approved templates, components, data bindings, actions, and permissions.
|
|
86
|
+
|
|
87
|
+
Persona UI creation and rendering happen inside Oomi-managed systems. Use the Oomi API tools instead:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
oomi persona-apps list --json
|
|
91
|
+
oomi persona-apps show fitness-today --json
|
|
92
|
+
oomi persona-apps apply-action fitness-today --action fitness.complete_workout --payload-json '{"goalId":"easy-run","minutes":20}' --json
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Rules:
|
|
96
|
+
- answer from returned `appState.bindings`, not memory
|
|
97
|
+
- apply updates only through approved `persona-apps apply-action` actions
|
|
98
|
+
- if the persona app is missing, ask the user to add it from the Oomi client first so permissions and hydration can run
|
|
99
|
+
- do not execute persona UI jobs or start local persona app runtimes
|