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.
Files changed (88) hide show
  1. package/README.md +227 -463
  2. package/agent_instructions.md +244 -234
  3. package/bin/oomi-ai.js +4028 -5797
  4. package/bin/sessionBridgeState.js +78 -78
  5. package/lib/openclawPaths.js +70 -71
  6. package/lib/openclawProfile.js +216 -216
  7. package/lib/personaApiClient.js +133 -303
  8. package/lib/spokenMetadata.js +137 -137
  9. package/openclaw.extension.js +341 -341
  10. package/openclaw.plugin.json +17 -17
  11. package/package.json +59 -59
  12. package/persona-app/README.md +27 -0
  13. package/persona-app/registry/v1.json +63 -0
  14. package/persona-app/schema/persona-app.v1.schema.json +90 -0
  15. package/skills/oomi/SKILL.md +165 -182
  16. package/skills/oomi/agent_instructions.md +99 -80
  17. package/lib/channelPluginClient.js +0 -119
  18. package/lib/openclawDevGateway.js +0 -384
  19. package/lib/personaJobExecutor.js +0 -139
  20. package/lib/personaJobPoller.js +0 -112
  21. package/lib/personaPortAllocator.js +0 -36
  22. package/lib/personaRuntimeManager.js +0 -496
  23. package/lib/personaRuntimeProcess.js +0 -924
  24. package/lib/personaRuntimeRegistry.js +0 -67
  25. package/lib/personaRuntimeSupervisor.js +0 -330
  26. package/lib/scaffold.js +0 -108
  27. package/lib/template.js +0 -45
  28. package/skills/oomi/config.json +0 -3
  29. package/skills/oomi/scripts/get_avatar_capabilities.py +0 -40
  30. package/skills/oomi/scripts/get_data.py +0 -49
  31. package/skills/oomi/scripts/install_agent_instructions.py +0 -78
  32. package/skills/oomi/scripts/send_goal.py +0 -53
  33. package/skills/oomi/scripts/sync.py +0 -46
  34. package/skills/oomi/setup.py +0 -41
  35. package/templates/persona-app/.env.example +0 -8
  36. package/templates/persona-app/README.md +0 -47
  37. package/templates/persona-app/eslint.config.js +0 -28
  38. package/templates/persona-app/index.html +0 -18
  39. package/templates/persona-app/oomi.runtime.json +0 -13
  40. package/templates/persona-app/package.json +0 -44
  41. package/templates/persona-app/persona/brief.md +0 -14
  42. package/templates/persona-app/persona.json +0 -14
  43. package/templates/persona-app/public/manifest.webmanifest +0 -8
  44. package/templates/persona-app/public/oomi.health.json +0 -6
  45. package/templates/persona-app/src/App.css +0 -379
  46. package/templates/persona-app/src/App.tsx +0 -17
  47. package/templates/persona-app/src/index.css +0 -53
  48. package/templates/persona-app/src/main.tsx +0 -23
  49. package/templates/persona-app/src/pages/HomePage.tsx +0 -127
  50. package/templates/persona-app/src/pages/ScenePage.tsx +0 -158
  51. package/templates/persona-app/src/persona/config.ts +0 -6
  52. package/templates/persona-app/src/persona/notes.ts +0 -9
  53. package/templates/persona-app/src/spatial.ts +0 -82
  54. package/templates/persona-app/src/vite-env.d.ts +0 -3
  55. package/templates/persona-app/template.json +0 -13
  56. package/templates/persona-app/tsconfig.app.json +0 -23
  57. package/templates/persona-app/tsconfig.json +0 -7
  58. package/templates/persona-app/tsconfig.node.json +0 -21
  59. package/templates/persona-app/vendor/webspatial/FORK.md +0 -6
  60. package/templates/persona-app/vendor/webspatial/core-sdk/LICENSE +0 -21
  61. package/templates/persona-app/vendor/webspatial/core-sdk/dist/iife/index.d.ts +0 -906
  62. package/templates/persona-app/vendor/webspatial/core-sdk/dist/iife/index.global.js +0 -75
  63. package/templates/persona-app/vendor/webspatial/core-sdk/dist/iife/index.global.js.map +0 -1
  64. package/templates/persona-app/vendor/webspatial/core-sdk/dist/index.d.ts +0 -906
  65. package/templates/persona-app/vendor/webspatial/core-sdk/dist/index.js +0 -3131
  66. package/templates/persona-app/vendor/webspatial/core-sdk/dist/index.js.map +0 -1
  67. package/templates/persona-app/vendor/webspatial/core-sdk/package.json +0 -45
  68. package/templates/persona-app/vendor/webspatial/react-sdk/LICENSE +0 -21
  69. package/templates/persona-app/vendor/webspatial/react-sdk/dist/default/index.d.ts +0 -365
  70. package/templates/persona-app/vendor/webspatial/react-sdk/dist/default/index.js +0 -4167
  71. package/templates/persona-app/vendor/webspatial/react-sdk/dist/default/index.js.map +0 -1
  72. package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-dev-runtime.d.ts +0 -82
  73. package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-dev-runtime.js +0 -66
  74. package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-dev-runtime.js.map +0 -1
  75. package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-dev-runtime.web.d.ts +0 -2
  76. package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-dev-runtime.web.js +0 -18
  77. package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-dev-runtime.web.js.map +0 -1
  78. package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-runtime.d.ts +0 -5
  79. package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-runtime.js +0 -66
  80. package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-runtime.js.map +0 -1
  81. package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-runtime.web.d.ts +0 -1
  82. package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-runtime.web.js +0 -18
  83. package/templates/persona-app/vendor/webspatial/react-sdk/dist/jsx/jsx-runtime.web.js.map +0 -1
  84. package/templates/persona-app/vendor/webspatial/react-sdk/dist/web/index.d.ts +0 -365
  85. package/templates/persona-app/vendor/webspatial/react-sdk/dist/web/index.js +0 -4207
  86. package/templates/persona-app/vendor/webspatial/react-sdk/dist/web/index.js.map +0 -1
  87. package/templates/persona-app/vendor/webspatial/react-sdk/package.json +0 -94
  88. package/templates/persona-app/vite.config.ts +0 -31
@@ -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
- - control the Oomi avatar with inline tags
13
-
14
- ## Primary Operator Workflow
15
-
16
- If the user wants OpenClaw connected to Oomi:
17
-
18
- 1. Ensure `oomi-ai` is installed or updated:
19
- ```bash
20
- pnpm add -g oomi-ai@latest
21
- ```
22
- Fallback:
23
- ```bash
24
- npm install -g oomi-ai@latest
25
- ```
26
-
27
- 2. Pair the device:
28
- ```bash
29
- oomi openclaw pair --app-url https://www.oomi.ai --no-start
30
- ```
31
-
32
- 3. Install the plugin:
33
- ```bash
34
- openclaw plugins install oomi-ai@latest
35
- ```
36
-
37
- 4. Print config guidance:
38
- ```bash
39
- oomi openclaw plugin --show-secrets --backend-url https://api.oomi.ai
40
- ```
41
-
42
- 5. Apply the `channels.oomi.accounts.default` config and restart OpenClaw.
43
-
44
- 6. Start or repair the bridge:
45
- ```bash
46
- oomi openclaw bridge ensure --detach
47
- ```
48
- If stale:
49
- ```bash
50
- oomi openclaw bridge restart --detach
51
- ```
52
- On macOS, prefer supervised mode:
53
- ```bash
54
- oomi openclaw bridge service install
55
- ```
56
-
57
- ## Health Checks
58
-
59
- Use these when chat or voice is failing:
60
-
61
- ```bash
62
- oomi openclaw bridge ps
63
- oomi openclaw bridge service status
64
- oomi openclaw status
65
- tail -f ~/.openclaw/logs/oomi-bridge-live.log
66
- tail -f ~/.openclaw/logs/gateway.log
67
- tail -f ~/.openclaw/logs/gateway.err.log
68
- ```
69
-
70
- Interpret bridge states like this:
71
- - `starting`: booting or waiting for managed subscription
72
- - `connected`: ready for managed traffic
73
- - `reconnecting`: retry scheduled after transport failure
74
- - `degraded`: bridge caught a runtime fault but is still alive
75
- - `error`: startup or auth failure blocked operation
76
- - `stopped`: not running or intentionally shut down
77
-
78
- ## Common Failures
79
-
80
- ### Duplicate plugin id
81
- - Cause: multiple discoverable `oomi-ai` installs
82
- - Action: remove stale plugin copies and reinstall once
83
-
84
- ### `invalid handshake: first request must be connect`
85
- - Cause: gateway request ordering broke
86
- - Action: update `oomi-ai`, restart the bridge, confirm only one bridge worker exists
87
-
88
- ### STT works but the assistant does not reply
89
- - Cause: the voice turn reached Oomi, but the managed gateway or OpenClaw run failed later
90
- - Action: inspect `gateway.log`, `gateway.err.log`, and the session JSONL for that run
91
-
92
- ## Local Oomi API Tools
93
-
94
- These scripts interact with the local Oomi application when it is running.
95
-
96
- ### `get_data`
97
- Fetch the latest user activity data.
98
-
99
- ```bash
100
- python3 skills/oomi/scripts/get_data.py
101
- ```
102
-
103
- ### `set_goal`
104
- Set a new goal in the local Oomi app.
105
-
106
- ```bash
107
- python3 skills/oomi/scripts/send_goal.py --type "steps" --value 10000 --message "Let's hit 10k today!"
108
- ```
109
-
110
- ### `sync`
111
- Sync local context.
112
-
113
- ```bash
114
- python3 skills/oomi/scripts/sync.py
115
- ```
116
-
117
- ### `get_avatar_capabilities`
118
- Read the avatar command schema before emitting inline avatar tags.
119
-
120
- ```bash
121
- python3 skills/oomi/scripts/get_avatar_capabilities.py
122
- ```
123
-
124
- ### `install_agent_instructions`
125
- Install packaged Oomi operator instructions into an OpenClaw `AGENTS.md` file.
126
-
127
- ```bash
128
- python3 skills/oomi/scripts/install_agent_instructions.py
129
- ```
130
-
131
- ## Hidden Speech Payload
132
-
133
- Managed voice can carry a hidden TTS-only speech sidecar alongside the normal assistant message.
134
-
135
- Use this shape when a voice turn needs more natural delivery without changing visible chat text:
136
-
137
- ```json
138
- {
139
- "metadata": {
140
- "spoken": {
141
- "text": "Speech-optimized text for TTS only.",
142
- "language": "English",
143
- "segments": [
144
- {
145
- "text": "Hey! It's Nemu, but close enough.",
146
- "pace": "medium_fast",
147
- "pitch": "slightly_high",
148
- "energy": "bright",
149
- "volume": "normal",
150
- "pause_after_ms": 220
151
- },
152
- {
153
- "text": "Right now, I'm just waking up into this conversation with you.",
154
- "pace": "medium",
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 be one of the supported Qwen language values such as `English`
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
- Before emitting avatar commands, call `get_avatar_capabilities` and prefer canonical values.
185
- Use aliases only when explicitly needed.
186
-
187
- Supported inline tags include:
188
- - animations: `[anim:Waving]`, `[anim:Walking]`, `[anim:Idle]`, `[anim:Sitting Idle]`
189
- - expressions: `[face:happy]`, `[face:sad]`, `[face:surprised]`, `[face:focused]`, `[face:gentle]`, `[face:thinking]`
190
- - gestures: `[gesture:nod]`, `[gesture:think]`, `[gesture:shrug]`, `[gesture:wave]`, `[gesture:bow]`
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
- Before using avatar commands, call `get_avatar_capabilities` and prefer canonical 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/web:
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 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.
47
-
48
- ## Hidden Speech Payload
49
-
50
- For managed voice turns, keep visible assistant chat text natural and user-facing.
51
- Do not put spoken-style tags like `[happy]`, `[sad]`, or `[excited]` into visible chat text.
52
-
53
- When the runtime supports it, voice turns may include a hidden speech sidecar on the assistant message:
54
-
55
- ```json
56
- {
57
- "metadata": {
58
- "spoken": {
59
- "text": "Speech-optimized text for TTS only.",
60
- "instructions": "Speak with upbeat, warm excitement and slightly rising intonation.",
61
- "style": {
62
- "emotion": "excited",
63
- "energy": "medium_high"
64
- }
65
- }
66
- }
67
- }
68
- ```
69
-
70
- Rules:
71
- - visible `content` remains the source of truth for Oomi chat rendering
72
- - for managed voice replies, include `metadata.spoken` when delivery benefits from cleaner phrasing or explicit speaking guidance
73
- - `metadata.spoken.text` is for backend TTS only
74
- - `metadata.spoken.language` should be one of the supported Qwen language values such as `English`
75
- - `metadata.spoken.segments` can carry bounded per-segment prosody for pace, pitch, volume, and pause timing
76
- - `metadata.spoken.instructions` should be natural-language guidance, not raw bracket tags
77
- - `metadata.spoken.style` is optional metadata for debugging or future mapping
78
- - if no hidden speech sidecar exists, Oomi falls back to speaking the visible assistant text
79
- - if you omit `metadata.spoken`, the plugin now synthesizes a bounded hidden fallback from visible assistant text
80
- - visible chat text is never rewritten by the plugin
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