oomi-ai 0.3.0 → 0.3.1
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 +22 -1
- package/agent_instructions.md +20 -0
- package/bin/oomi-ai.js +14 -0
- package/lib/personaApiClient.js +9 -0
- package/package.json +1 -1
- package/persona-app/README.md +6 -0
- package/persona-app/registry/v1.json +25 -3
- package/skills/oomi/SKILL.md +17 -0
- package/skills/oomi/agent_instructions.md +18 -0
package/README.md
CHANGED
|
@@ -28,7 +28,12 @@ The current model is:
|
|
|
28
28
|
- Files: `persona-app/*`, `lib/personaApiClient.js`, `bin/oomi-ai.js`
|
|
29
29
|
- Purpose: inspect account-linked component-composed persona apps and apply approved backend actions.
|
|
30
30
|
|
|
31
|
-
4.
|
|
31
|
+
4. Permissioned context tools
|
|
32
|
+
|
|
33
|
+
- Files: `lib/personaApiClient.js`, `bin/oomi-ai.js`
|
|
34
|
+
- Purpose: read user-approved Oomi backend context, such as HealthKit summaries synced by the mobile app.
|
|
35
|
+
|
|
36
|
+
5. Agent/operator instructions
|
|
32
37
|
|
|
33
38
|
- Files: `agent_instructions.md`, `skills/oomi/*`
|
|
34
39
|
- Purpose: tell OpenClaw agents how to connect, repair, and use Oomi without local UI code generation.
|
|
@@ -164,6 +169,22 @@ oomi persona-apps apply-action fitness-today --action fitness.complete_goal --pa
|
|
|
164
169
|
oomi persona-apps apply-action fitness-today --action fitness.complete_workout --payload-json '{"goalId":"easy-run","minutes":20}' --json
|
|
165
170
|
```
|
|
166
171
|
|
|
172
|
+
## Context Tools
|
|
173
|
+
|
|
174
|
+
Use context tools when the user asks a data-backed question that should come from Oomi-approved mobile permissions, not model memory. For health and fitness questions, read the latest backend HealthKit context first:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
oomi context health --json
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Rules for agents:
|
|
181
|
+
|
|
182
|
+
- Answer from `healthContext.summary` and `healthContext.derived`.
|
|
183
|
+
- Respect `healthContext.agentGuidance.canAnswerFromContext`.
|
|
184
|
+
- If context is `missing`, `needs_sync`, `permission_denied`, `disabled_by_user`, or `unavailable`, tell the user what repair action is needed instead of guessing.
|
|
185
|
+
- If context is `stale`, mention freshness when timing matters.
|
|
186
|
+
- Do not ask the phone for HealthKit directly; the Oomi mobile app syncs HealthKit to the backend.
|
|
187
|
+
|
|
167
188
|
## Voice Contract
|
|
168
189
|
|
|
169
190
|
Managed voice uses the same Oomi plugin and bridge layer as managed chat.
|
package/agent_instructions.md
CHANGED
|
@@ -12,6 +12,7 @@ Get OpenClaw into a state where:
|
|
|
12
12
|
- Oomi device-backed voice can start cleanly
|
|
13
13
|
- the bridge is supervised or restartable
|
|
14
14
|
- component-composed persona apps can be inspected and updated through Oomi API tools
|
|
15
|
+
- approved user context, such as HealthKit data synced by the Oomi mobile app, can be read through Oomi backend context tools
|
|
15
16
|
- the user never has to paste raw pair identifiers or gateway secrets manually when managed connect is available
|
|
16
17
|
|
|
17
18
|
## Standard Connect Flow
|
|
@@ -260,3 +261,22 @@ Strict rules:
|
|
|
260
261
|
- Do not install app framework dependencies for persona UI work.
|
|
261
262
|
- Do not present local URLs as persona app URLs.
|
|
262
263
|
- If a persona app needs to be created, tell the user to add it from the Oomi client first so permissions and hydration run correctly.
|
|
264
|
+
|
|
265
|
+
## Permissioned Context Tools
|
|
266
|
+
|
|
267
|
+
Use Oomi context tools when the user asks about personal data that should come from mobile permissions instead of model memory.
|
|
268
|
+
|
|
269
|
+
For health, fitness, sleep, workout, cardio, or movement questions:
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
oomi context health --json
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Rules:
|
|
276
|
+
|
|
277
|
+
- Answer only from `healthContext.summary` and `healthContext.derived`.
|
|
278
|
+
- Respect `healthContext.agentGuidance.canAnswerFromContext`.
|
|
279
|
+
- If `canAnswerFromContext` is false, tell the user the relevant `healthContext.repair.label` or `healthContext.repair.reason`.
|
|
280
|
+
- If `healthContext.status` is `stale`, mention that the latest HealthKit sync may be out of date when timing matters.
|
|
281
|
+
- Do not infer unavailable health fields.
|
|
282
|
+
- Do not request HealthKit directly from the phone; the Oomi mobile app owns permission prompts and syncs approved data to the backend.
|
package/bin/oomi-ai.js
CHANGED
|
@@ -227,6 +227,9 @@ Commands:
|
|
|
227
227
|
persona-apps apply-action <slug>
|
|
228
228
|
Apply an approved persona app action through the Oomi backend.
|
|
229
229
|
|
|
230
|
+
context health
|
|
231
|
+
Show the latest account-linked health context available to this paired OpenClaw device.
|
|
232
|
+
|
|
230
233
|
Common flags:
|
|
231
234
|
--agents-file PATH Override AGENTS.md path
|
|
232
235
|
--workspace PATH Override OpenClaw workspace root
|
|
@@ -566,6 +569,12 @@ async function handlePersonaAppApplyActionCommand(slug, flags = {}) {
|
|
|
566
569
|
printStructuredResult(result, isTruthyFlag(flags.json));
|
|
567
570
|
}
|
|
568
571
|
|
|
572
|
+
async function handleContextHealthCommand(flags = {}) {
|
|
573
|
+
const client = createCliPersonaApiClient(flags);
|
|
574
|
+
const payload = await client.getHealthContext();
|
|
575
|
+
printStructuredResult(payload, isTruthyFlag(flags.json));
|
|
576
|
+
}
|
|
577
|
+
|
|
569
578
|
async function refreshBridgeForUpdate(flags = {}, options = {}) {
|
|
570
579
|
const logger = options.logger || null;
|
|
571
580
|
if (process.platform === 'darwin') {
|
|
@@ -4181,6 +4190,11 @@ async function main() {
|
|
|
4181
4190
|
return;
|
|
4182
4191
|
}
|
|
4183
4192
|
|
|
4193
|
+
if (command === 'context' && subcommand === 'health') {
|
|
4194
|
+
await handleContextHealthCommand(args.flags);
|
|
4195
|
+
return;
|
|
4196
|
+
}
|
|
4197
|
+
|
|
4184
4198
|
console.error(`Unknown command: ${command} ${subcommand || ''}`.trim());
|
|
4185
4199
|
usage();
|
|
4186
4200
|
process.exit(1);
|
package/lib/personaApiClient.js
CHANGED
|
@@ -139,5 +139,14 @@ export function createPersonaApiClient({
|
|
|
139
139
|
},
|
|
140
140
|
});
|
|
141
141
|
},
|
|
142
|
+
|
|
143
|
+
getHealthContext() {
|
|
144
|
+
return getJson({
|
|
145
|
+
fetchImpl,
|
|
146
|
+
backendUrl: resolvedBackendUrl,
|
|
147
|
+
deviceToken: resolvedDeviceToken,
|
|
148
|
+
path: '/v1/context/health',
|
|
149
|
+
});
|
|
150
|
+
},
|
|
142
151
|
};
|
|
143
152
|
}
|
package/package.json
CHANGED
package/persona-app/README.md
CHANGED
|
@@ -24,4 +24,10 @@ oomi persona-apps show fitness-today --json
|
|
|
24
24
|
oomi persona-apps apply-action fitness-today --action fitness.complete_workout --payload-json '{"goalId":"easy-run","minutes":20}' --json
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
+
When answering data-backed health or fitness questions, agents should read approved backend context first:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
oomi context health --json
|
|
31
|
+
```
|
|
32
|
+
|
|
27
33
|
If a persona app is missing, ask the user to add it from the Oomi client first so platform-specific permissions and hydration can run.
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "persona-app.v1",
|
|
3
|
-
"registryVersion": "2026-04-
|
|
3
|
+
"registryVersion": "2026-04-24.1",
|
|
4
|
+
"contextTools": [
|
|
5
|
+
{
|
|
6
|
+
"id": "health.context.read",
|
|
7
|
+
"command": "oomi context health --json",
|
|
8
|
+
"endpoint": "/v1/context/health",
|
|
9
|
+
"description": "Reads the latest account-linked health context synced by Oomi mobile clients.",
|
|
10
|
+
"permissions": ["healthkit.read", "health_connect.read"],
|
|
11
|
+
"readOnly": true,
|
|
12
|
+
"targets": ["ios", "android", "web"]
|
|
13
|
+
}
|
|
14
|
+
],
|
|
4
15
|
"sharedComponents": [
|
|
5
16
|
{
|
|
6
17
|
"type": "shared.personaHero",
|
|
@@ -27,6 +38,16 @@
|
|
|
27
38
|
"type": "fitness.goalChecklist",
|
|
28
39
|
"description": "Checklist of suggested goals for today.",
|
|
29
40
|
"targets": ["ios", "android", "web"]
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"type": "fitness.metricGrid",
|
|
44
|
+
"description": "Grid of approved HealthKit or Health Connect activity, sleep, cardio, and body metrics.",
|
|
45
|
+
"targets": ["ios", "android", "web"]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"type": "fitness.workoutList",
|
|
49
|
+
"description": "Recent workouts synced from the user's approved mobile health source.",
|
|
50
|
+
"targets": ["ios", "android", "web"]
|
|
30
51
|
}
|
|
31
52
|
],
|
|
32
53
|
"actions": [
|
|
@@ -55,9 +76,10 @@
|
|
|
55
76
|
],
|
|
56
77
|
"permissions": [
|
|
57
78
|
"fitness.state.read",
|
|
58
|
-
"fitness.state.write"
|
|
79
|
+
"fitness.state.write",
|
|
80
|
+
"healthkit.read",
|
|
81
|
+
"health_connect.read"
|
|
59
82
|
]
|
|
60
83
|
}
|
|
61
84
|
]
|
|
62
85
|
}
|
|
63
|
-
|
package/skills/oomi/SKILL.md
CHANGED
|
@@ -10,6 +10,7 @@ Use this skill when you need to:
|
|
|
10
10
|
- repair the Oomi plugin or bridge on a machine
|
|
11
11
|
- inspect managed chat or voice health
|
|
12
12
|
- inspect or update component-composed Oomi persona app state
|
|
13
|
+
- read approved Oomi backend context such as HealthKit summaries synced by the mobile app
|
|
13
14
|
- control the Oomi avatar with inline tags
|
|
14
15
|
|
|
15
16
|
## Primary Operator Workflow
|
|
@@ -112,6 +113,22 @@ Rules:
|
|
|
112
113
|
- do not create local persona UI projects from the OpenClaw machine
|
|
113
114
|
- do not execute persona UI jobs or start local persona app runtimes
|
|
114
115
|
|
|
116
|
+
## Permissioned Context Tools
|
|
117
|
+
|
|
118
|
+
Use context commands before answering personal data questions that should come from Oomi-approved permissions.
|
|
119
|
+
|
|
120
|
+
For health, fitness, sleep, workout, cardio, or movement questions:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
oomi context health --json
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Rules:
|
|
127
|
+
- answer only from `healthContext.summary` and `healthContext.derived`
|
|
128
|
+
- respect `healthContext.agentGuidance.canAnswerFromContext`
|
|
129
|
+
- if context is missing, stale, denied, disabled, or unavailable, follow `healthContext.repair`
|
|
130
|
+
- do not ask HealthKit directly; the Oomi mobile app syncs approved HealthKit data to the backend
|
|
131
|
+
|
|
115
132
|
## Hidden Speech Payload
|
|
116
133
|
|
|
117
134
|
Managed voice can carry a hidden TTS-only speech sidecar alongside the normal assistant message.
|
|
@@ -97,3 +97,21 @@ Rules:
|
|
|
97
97
|
- apply updates only through approved `persona-apps apply-action` actions
|
|
98
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
99
|
- do not execute persona UI jobs or start local persona app runtimes
|
|
100
|
+
|
|
101
|
+
## Permissioned Context Tools
|
|
102
|
+
|
|
103
|
+
Use Oomi context tools when the user asks about personal data that should come from mobile permissions instead of memory.
|
|
104
|
+
|
|
105
|
+
For health, fitness, sleep, workout, cardio, or movement questions:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
oomi context health --json
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Rules:
|
|
112
|
+
- answer only from `healthContext.summary` and `healthContext.derived`
|
|
113
|
+
- respect `healthContext.agentGuidance.canAnswerFromContext`
|
|
114
|
+
- if `canAnswerFromContext` is false, tell the user the relevant `healthContext.repair.label` or `healthContext.repair.reason`
|
|
115
|
+
- if `healthContext.status` is `stale`, mention that the latest HealthKit sync may be out of date when timing matters
|
|
116
|
+
- do not infer unavailable health fields
|
|
117
|
+
- do not request HealthKit directly from the phone; the Oomi mobile app owns permission prompts and syncs approved data to the backend
|