oomi-ai 0.2.16 → 0.2.18

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 (47) hide show
  1. package/README.md +238 -203
  2. package/agent_instructions.md +209 -184
  3. package/bin/oomi-ai.js +3989 -3460
  4. package/bin/sessionBridgeState.js +78 -78
  5. package/lib/channelPluginClient.js +119 -0
  6. package/lib/personaApiClient.js +221 -0
  7. package/lib/personaJobExecutor.js +115 -0
  8. package/lib/personaJobPoller.js +112 -0
  9. package/lib/personaRuntimeProcess.js +152 -0
  10. package/lib/scaffold.js +108 -0
  11. package/lib/template.js +45 -0
  12. package/openclaw.extension.js +602 -424
  13. package/openclaw.plugin.json +17 -17
  14. package/package.json +67 -65
  15. package/skills/oomi/SKILL.md +191 -170
  16. package/skills/oomi/agent_instructions.md +80 -78
  17. package/skills/oomi/config.json +2 -2
  18. package/skills/oomi/scripts/get_avatar_capabilities.py +40 -40
  19. package/skills/oomi/scripts/get_data.py +49 -49
  20. package/skills/oomi/scripts/install_agent_instructions.py +78 -78
  21. package/skills/oomi/scripts/send_goal.py +53 -53
  22. package/skills/oomi/scripts/sync.py +46 -46
  23. package/skills/oomi/setup.py +41 -41
  24. package/templates/persona-app/.env.example +8 -0
  25. package/templates/persona-app/README.md +35 -0
  26. package/templates/persona-app/eslint.config.js +28 -0
  27. package/templates/persona-app/index.html +18 -0
  28. package/templates/persona-app/oomi.runtime.json +13 -0
  29. package/templates/persona-app/package.json +42 -0
  30. package/templates/persona-app/persona/brief.md +14 -0
  31. package/templates/persona-app/persona.json +14 -0
  32. package/templates/persona-app/public/manifest.webmanifest +8 -0
  33. package/templates/persona-app/public/oomi.health.json +6 -0
  34. package/templates/persona-app/src/App.css +180 -0
  35. package/templates/persona-app/src/App.tsx +14 -0
  36. package/templates/persona-app/src/index.css +32 -0
  37. package/templates/persona-app/src/main.tsx +10 -0
  38. package/templates/persona-app/src/pages/HomePage.tsx +73 -0
  39. package/templates/persona-app/src/pages/ScenePage.tsx +18 -0
  40. package/templates/persona-app/src/persona/config.ts +6 -0
  41. package/templates/persona-app/src/persona/notes.ts +5 -0
  42. package/templates/persona-app/src/vite-env.d.ts +3 -0
  43. package/templates/persona-app/template.json +13 -0
  44. package/templates/persona-app/tsconfig.app.json +23 -0
  45. package/templates/persona-app/tsconfig.json +7 -0
  46. package/templates/persona-app/tsconfig.node.json +21 -0
  47. package/templates/persona-app/vite.config.ts +18 -0
package/README.md CHANGED
@@ -2,227 +2,262 @@
2
2
 
3
3
  OpenClaw channel plugin and bridge tooling for Oomi managed chat and voice.
4
4
 
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
42
- ```
43
-
44
- Fallback:
45
-
46
- ```bash
47
- npm install -g oomi-ai@latest
48
- ```
49
-
50
- Install the OpenClaw plugin:
51
-
52
- ```bash
53
- openclaw plugins install oomi-ai@latest
54
- ```
55
-
56
- Upgrade an existing machine:
57
-
58
- ```bash
59
- pnpm add -g oomi-ai@latest
60
- openclaw plugins install oomi-ai@latest
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
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:
5
+ ## Current Focus
87
6
 
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
- }
104
- ```
105
-
106
- Required fields:
107
- - `backendUrl`
108
- - `deviceToken`
109
-
110
- Optional fields:
111
- - `defaultSessionKey`
112
- - `requestTimeoutMs`
7
+ `0.2.18` adds the first live persona automation lane:
8
+ - WebSpatial-based persona scaffolding for generated Oomi apps
9
+ - device-authenticated persona runtime registration and job callbacks
10
+ - automatic bridge-side polling for queued `persona_job` control messages
11
+ - end-to-end local persona startup from a structured orchestration payload
113
12
 
13
+ This package is for two audiences:
14
+ - OpenClaw operators who need to connect a machine to Oomi and keep chat or voice healthy
15
+ - Developers evaluating the plugin on npm and deciding whether it matches their OpenClaw + Oomi setup
16
+
17
+ ## What This Package Ships
18
+
19
+ The npm package contains two Oomi integration surfaces:
20
+
21
+ 1. OpenClaw channel extension
22
+ - File: `openclaw.extension.js`
23
+ - Purpose: stable managed text transport through the Oomi backend channel API
24
+ - This is the preferred integration surface for normal chat
25
+
26
+ 2. Local bridge + CLI
27
+ - Files: `bin/oomi-ai.js`, `bin/sessionBridgeState.js`
28
+ - Purpose: pair a device, manage the OpenClaw bridge worker, and support managed gateway traffic needed by device-backed chat and voice
29
+ - This is the part that deals with broker sockets, local gateway sessions, challenge auth, and bridge health
30
+
31
+ In practical terms:
32
+ - If you only need a clean managed chat channel, the extension is the main reason to install this package
33
+ - If you need Oomi device-backed chat or voice on an OpenClaw machine, you also need the bridge tooling in this package
34
+
35
+ ## When To Install It
36
+
37
+ Install `oomi-ai` if all of the following are true:
38
+ - you use OpenClaw
39
+ - you want Oomi as a managed channel inside OpenClaw
40
+ - you want device-backed Oomi chat, Oomi voice, or both
41
+
42
+ Do not install it just to use the Oomi web app by itself.
43
+
44
+ ## Install And Upgrade
45
+
46
+ Global install:
47
+
48
+ ```bash
49
+ pnpm add -g oomi-ai@latest
50
+ ```
51
+
52
+ Fallback:
53
+
54
+ ```bash
55
+ npm install -g oomi-ai@latest
56
+ ```
57
+
58
+ Install the OpenClaw plugin:
59
+
60
+ ```bash
61
+ openclaw plugins install oomi-ai@latest
62
+ ```
63
+
64
+ Upgrade an existing machine:
65
+
66
+ ```bash
67
+ pnpm add -g oomi-ai@latest
68
+ openclaw plugins install oomi-ai@latest
69
+ ```
70
+
71
+ ## Operator Quick Start
72
+
73
+ The packaged operator instructions live in [agent_instructions.md](./agent_instructions.md).
74
+ That is the primary reference for:
75
+ - pairing a device
76
+ - installing the plugin
77
+ - configuring `channels.oomi.accounts.default`
78
+ - running or supervising the bridge
79
+ - checking whether the system is healthy
80
+ - troubleshooting chat and voice failures
81
+
82
+ Fast-path install flow:
83
+
84
+ ```bash
85
+ oomi openclaw pair --app-url https://www.oomi.ai --no-start
86
+ openclaw plugins install oomi-ai@latest
87
+ oomi openclaw plugin --show-secrets --backend-url https://api.oomi.ai
88
+ ```
89
+
90
+ Then apply the printed `channels.oomi.accounts.default` config and restart OpenClaw.
91
+
92
+ ## Configuration
93
+
94
+ OpenClaw channel config lives under:
95
+
96
+ ```json
97
+ {
98
+ "channels": {
99
+ "oomi": {
100
+ "defaultAccountId": "default",
101
+ "accounts": {
102
+ "default": {
103
+ "backendUrl": "https://api.oomi.ai",
104
+ "deviceToken": "...",
105
+ "defaultSessionKey": "agent:main:webchat:channel:oomi",
106
+ "requestTimeoutMs": 15000
107
+ }
108
+ }
109
+ }
110
+ }
111
+ }
112
+ ```
113
+
114
+ Required fields:
115
+ - `backendUrl`
116
+ - `deviceToken`
117
+
118
+ Optional fields:
119
+ - `defaultSessionKey`
120
+ - `requestTimeoutMs`
121
+
114
122
  ## Runtime Model
115
123
 
116
124
  There are two runtime contracts worth understanding.
117
-
118
- ### Managed Text Chat
119
-
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.
122
-
123
- ### Device-Backed Chat And Voice
124
-
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
132
-
133
- This is the part of the package most likely to matter when debugging voice turn failures.
134
-
125
+
126
+ ### Managed Text Chat
127
+
128
+ Managed text chat uses the OpenClaw channel extension and the Oomi backend channel API.
129
+ This path is the more stable contract and should be preferred when evaluating the plugin for normal chat.
130
+
131
+ ### Device-Backed Chat And Voice
132
+
133
+ Device-backed chat and voice use the local bridge.
134
+ That bridge:
135
+ - keeps a broker socket open to Oomi
136
+ - opens local gateway sessions on demand
137
+ - enforces `connect`-first request ordering
138
+ - preserves or synthesizes `idempotencyKey` for `chat.send`
139
+ - keeps voice-session faults from poisoning normal provider health where possible
140
+
141
+ This is the part of the package most likely to matter when debugging voice turn failures.
142
+
135
143
  For managed voice replies, the extension also preserves an explicit hidden `metadata.spoken` sidecar when upstream provides one.
136
- If upstream does not provide one, the extension now synthesizes a conservative hidden fallback from the visible assistant text so backend TTS can speak a cleaner version without changing user-visible chat.
137
-
138
- ## Bridge Health States
139
-
140
- The bridge status file is written locally and should roughly be interpreted as:
141
- - `starting`: process booting or waiting for managed subscription
142
- - `connected`: broker connected and managed subscription confirmed
143
- - `reconnecting`: broker or gateway transport dropped and reconnect is scheduled
144
- - `degraded`: bridge is still alive but hit a runtime fault that needs attention
145
- - `error`: startup or auth-level failure that prevents useful operation
146
- - `stopped`: bridge is not running or was intentionally stopped
147
-
148
- For voice support, a `voice_session_*` failure should be treated as narrower than a full provider outage.
149
-
150
- ## Troubleshooting
151
-
152
- ### `invalid handshake: first request must be connect`
153
-
154
- Meaning:
155
- - a gateway request was forwarded before the session had accepted `connect`
156
-
157
- What to check:
158
- - update to the latest `oomi-ai`
159
- - restart the bridge worker
160
- - confirm only one active bridge worker exists for the device
161
-
162
- ### `duplicate plugin id detected`
163
-
164
- Meaning:
165
- - OpenClaw can see more than one `oomi-ai` plugin source
166
-
167
- What to check:
168
- - ensure there is only one active install under OpenClaw plugin discovery paths
169
- - remove stale local extension copies before reinstalling
170
-
171
- ### Bridge keeps flipping between `reconnecting`, `degraded`, or `stopped`
172
-
173
- What to check:
174
- - `oomi openclaw bridge ps`
175
- - `oomi openclaw bridge service status`
176
- - `tail -f ~/.openclaw/logs/oomi-bridge-live.log`
177
- - `tail -f ~/.openclaw/logs/gateway.log`
178
-
179
- If the process is alive but runtime faults are being caught, expect `degraded` rather than an immediate hard stop.
180
-
181
- ### Voice STT works but the agent does not answer
182
-
183
- This usually means one of these:
184
- - the managed gateway/device side is not actually ready
185
- - the bridge or agent run failed after delivery
186
- - the OpenClaw run stopped with an upstream provider `network_error`
187
-
188
- In that situation, inspect:
189
- - `~/.openclaw/logs/gateway.log`
190
- - `~/.openclaw/logs/gateway.err.log`
191
- - the relevant session JSONL in `~/.openclaw/agents/main/sessions/`
192
-
193
- ## Developer Notes
144
+ If upstream does not provide one, the extension now synthesizes a bounded hidden fallback from the visible assistant text so backend TTS can speak a cleaner and more varied version without changing user-visible chat.
194
145
 
195
- If you are inspecting this package on npm, the main architectural points are:
196
- - the extension path is the stable managed text contract
197
- - the local bridge exists because Oomi also needs device-backed and voice-capable flows
198
- - the bridge has been hardened for:
199
- - strict `connect`-first forwarding
200
- - method-specific request shaping
201
- - `idempotencyKey` handling
202
- - bridge status that does not report `connected` before managed subscription is ready
203
- - runtime fault isolation so local session failures are less likely to crash the whole provider
204
- - hidden managed-voice speech metadata forwarding, with a synthesized fallback when upstream does not provide `metadata.spoken`
146
+ ## Persona Scaffolding
205
147
 
206
- If you are developing the plugin, test the packaged surface with:
148
+ Use the scaffold flow when OpenClaw needs to build a managed persona app that will live inside Oomi:
207
149
 
208
150
  ```bash
209
- cd packages/oomi-ai
210
- node --test test/*.test.mjs
211
- npm pack --dry-run
151
+ oomi personas scaffold market-analyst --name "Market Analyst" --description "Private app for reviewing my broker positions and risk." --out ~/.openclaw/personas/market-analyst
212
152
  ```
213
153
 
214
- ## Release Process
154
+ Use:
155
+ - `oomi personas create <id>` for repo-local manifest work
156
+ - `oomi personas scaffold <slug>` for a WebSpatial-based Oomi app shell with runtime metadata and health documents
157
+ - `oomi persona-jobs execute --message-file <job.json>` when OpenClaw receives a structured persona orchestration job from Oomi
215
158
 
216
- Before publishing:
159
+ Additional persona runtime commands:
217
160
 
218
161
  ```bash
219
- cd packages/oomi-ai
220
- node --test test/*.test.mjs
221
- npm pack --dry-run
162
+ oomi personas runtime-register market-analyst --local-port 4789
163
+ oomi personas heartbeat market-analyst --local-port 4789
164
+ oomi persona-jobs start pj_123
165
+ oomi persona-jobs succeed pj_123 --workspace-path ~/.openclaw/personas/market-analyst --local-port 4789
166
+ oomi persona-jobs fail pj_123 --code JOB_FAILED --message "Scaffold generation failed."
222
167
  ```
223
168
 
169
+ When the managed bridge is running, `oomi-ai` now also polls the backend control lane for queued `persona_job` messages and executes them automatically. That poll path is filtered to `metadata.type = persona_job`, so it does not consume normal queued chat traffic.
170
+
171
+ ## Bridge Health States
172
+
173
+ The bridge status file is written locally and should roughly be interpreted as:
174
+ - `starting`: process booting or waiting for managed subscription
175
+ - `connected`: broker connected and managed subscription confirmed
176
+ - `reconnecting`: broker or gateway transport dropped and reconnect is scheduled
177
+ - `degraded`: bridge is still alive but hit a runtime fault that needs attention
178
+ - `error`: startup or auth-level failure that prevents useful operation
179
+ - `stopped`: bridge is not running or was intentionally stopped
180
+
181
+ For voice support, a `voice_session_*` failure should be treated as narrower than a full provider outage.
182
+
183
+ ## Troubleshooting
184
+
185
+ ### `invalid handshake: first request must be connect`
186
+
187
+ Meaning:
188
+ - a gateway request was forwarded before the session had accepted `connect`
189
+
190
+ What to check:
191
+ - update to the latest `oomi-ai`
192
+ - restart the bridge worker
193
+ - confirm only one active bridge worker exists for the device
194
+
195
+ ### `duplicate plugin id detected`
196
+
197
+ Meaning:
198
+ - OpenClaw can see more than one `oomi-ai` plugin source
199
+
200
+ What to check:
201
+ - ensure there is only one active install under OpenClaw plugin discovery paths
202
+ - remove stale local extension copies before reinstalling
203
+
204
+ ### Bridge keeps flipping between `reconnecting`, `degraded`, or `stopped`
205
+
206
+ What to check:
207
+ - `oomi openclaw bridge ps`
208
+ - `oomi openclaw bridge service status`
209
+ - `tail -f ~/.openclaw/logs/oomi-bridge-live.log`
210
+ - `tail -f ~/.openclaw/logs/gateway.log`
211
+
212
+ If the process is alive but runtime faults are being caught, expect `degraded` rather than an immediate hard stop.
213
+
214
+ ### Voice STT works but the agent does not answer
215
+
216
+ This usually means one of these:
217
+ - the managed gateway/device side is not actually ready
218
+ - the bridge or agent run failed after delivery
219
+ - the OpenClaw run stopped with an upstream provider `network_error`
220
+
221
+ In that situation, inspect:
222
+ - `~/.openclaw/logs/gateway.log`
223
+ - `~/.openclaw/logs/gateway.err.log`
224
+ - the relevant session JSONL in `~/.openclaw/agents/main/sessions/`
225
+
226
+ ## Developer Notes
227
+
228
+ If you are inspecting this package on npm, the main architectural points are:
229
+ - the extension path is the stable managed text contract
230
+ - the local bridge exists because Oomi also needs device-backed and voice-capable flows
231
+ - the bridge has been hardened for:
232
+ - strict `connect`-first forwarding
233
+ - method-specific request shaping
234
+ - `idempotencyKey` handling
235
+ - bridge status that does not report `connected` before managed subscription is ready
236
+ - runtime fault isolation so local session failures are less likely to crash the whole provider
237
+ - hidden managed-voice speech metadata forwarding, with a synthesized fallback when upstream does not provide `metadata.spoken`
238
+
239
+ If you are developing the plugin, test the packaged surface with:
240
+
241
+ ```bash
242
+ cd packages/oomi-ai
243
+ node --test test/*.test.mjs
244
+ npm pack --dry-run
245
+ ```
246
+
247
+ ## Release Process
248
+
249
+ Before publishing:
250
+
251
+ ```bash
252
+ cd packages/oomi-ai
253
+ node --test test/*.test.mjs
254
+ npm pack --dry-run
255
+ ```
256
+
224
257
  Then publish the bumped version:
225
258
 
226
259
  ```bash
227
- npm publish --access public
260
+ pnpm check
261
+ pnpm publish --dry-run --no-git-checks --access public
262
+ pnpm publish --access public
228
263
  ```