oomi-ai 0.3.4 → 0.3.5

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 CHANGED
@@ -150,6 +150,7 @@ Optional fields:
150
150
  Component-composed persona apps are the default Oomi mini-app path. Use these commands when the user asks about or updates an existing Oomi persona app such as Fitness Today:
151
151
 
152
152
  ```bash
153
+ oomi fitness show --json
153
154
  oomi persona-apps list --json
154
155
  oomi persona-apps show fitness-today --json
155
156
  oomi persona-apps apply-action fitness-today --action fitness.complete_workout --payload-json '{"goalId":"easy-run","minutes":20}' --json
@@ -158,17 +159,21 @@ oomi persona-apps apply-action fitness-today --action fitness.complete_workout -
158
159
  Rules for agents:
159
160
 
160
161
  - Answer from returned `appState.bindings`, not from memory.
162
+ - For Fitness questions, prefer `oomi fitness show --json` because it returns the Fitness mini-app state and approved health context together.
161
163
  - Apply updates only through approved `persona-apps apply-action` actions.
162
164
  - If the persona app does not exist, tell the user to add it from the Oomi client first.
163
165
  - Do not create local persona UI projects.
164
166
 
165
- For the Fitness v0 slice:
167
+ For the Fitness slice:
166
168
 
167
169
  ```bash
170
+ oomi persona-apps apply-action fitness-today --action fitness.set_goal --payload-json '{"goalId":"move_more"}' --json
168
171
  oomi persona-apps apply-action fitness-today --action fitness.complete_goal --payload-json '{"goalId":"easy-run"}' --json
169
172
  oomi persona-apps apply-action fitness-today --action fitness.complete_workout --payload-json '{"goalId":"easy-run","minutes":20}' --json
170
173
  ```
171
174
 
175
+ Supported `fitness.set_goal` values are `move_more`, `sleep_better`, and `build_workout_habit`.
176
+
172
177
  ## Context Tools
173
178
 
174
179
  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:
@@ -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
+ - Fitness state can be inspected with one command that combines mini-app state and approved health context
15
16
  - approved user context, such as HealthKit data synced by the Oomi mobile app, can be read through Oomi backend context tools
16
17
  - the user never has to paste raw pair identifiers or gateway secrets manually when managed connect is available
17
18
 
@@ -248,8 +249,17 @@ When a user asks about an existing persona app:
248
249
  4. To update state, use a validated action: `oomi persona-apps apply-action <slug> --action <action-id> --payload-json '<json>' --json`.
249
250
  5. If `persona-apps list` returns no app for the user's request, tell the user they can add that persona from the Oomi client so the client can collect the right permissions and data sources.
250
251
 
251
- For the Fitness v0 slice:
252
+ For Fitness questions, prefer the combined read command first:
252
253
 
254
+ ```bash
255
+ oomi fitness show --json
256
+ ```
257
+
258
+ It returns the linked Fitness persona app plus the latest approved health context in one payload.
259
+
260
+ For the Fitness slice:
261
+
262
+ - Use `fitness.set_goal` with payload `{"goalId":"move_more"}`, `{"goalId":"sleep_better"}`, or `{"goalId":"build_workout_habit"}` to set the active focus.
253
263
  - Use `fitness.complete_goal` with payload `{"goalId":"easy-run"}` to mark a known goal complete.
254
264
  - Use `fitness.complete_workout` with payload like `{"goalId":"easy-run","minutes":20}` when the user says they finished a workout.
255
265
 
package/bin/oomi-ai.js CHANGED
@@ -233,6 +233,9 @@ Commands:
233
233
  persona-apps apply-action <slug>
234
234
  Apply an approved persona app action through the Oomi backend.
235
235
 
236
+ fitness show
237
+ Show the linked Fitness persona app plus approved health context.
238
+
236
239
  context health
237
240
  Show the latest account-linked health context available to this paired OpenClaw device.
238
241
  context health sync [--wait]
@@ -584,6 +587,34 @@ async function handleContextHealthCommand(flags = {}) {
584
587
  printStructuredResult(payload, isTruthyFlag(flags.json));
585
588
  }
586
589
 
590
+ async function handleFitnessShowCommand(flags = {}) {
591
+ const client = createCliPersonaApiClient(flags);
592
+ const listPayload = await client.listPersonaApps();
593
+ const personaApps = Array.isArray(listPayload?.personaApps) ? listPayload.personaApps : [];
594
+ const fitnessApp = personaApps.find((app) => app?.personaType === 'fitness') ||
595
+ personaApps.find((app) => app?.slug === 'fitness-today');
596
+
597
+ if (!fitnessApp?.slug) {
598
+ throw new Error('Fitness persona app is not linked. Ask the user to add Fitness from the Oomi client first.');
599
+ }
600
+
601
+ const appPayload = await client.getPersonaApp({ slug: fitnessApp.slug });
602
+ let healthPayload = null;
603
+ let healthContextError = null;
604
+ try {
605
+ healthPayload = await client.getHealthContext();
606
+ } catch (err) {
607
+ healthContextError = err?.message || String(err);
608
+ }
609
+
610
+ printStructuredResult({
611
+ ok: true,
612
+ personaApp: appPayload?.personaApp || null,
613
+ healthContext: healthPayload?.healthContext || null,
614
+ healthContextError,
615
+ }, isTruthyFlag(flags.json));
616
+ }
617
+
587
618
  async function handleContextHealthSyncCommand(flags = {}) {
588
619
  const client = createCliPersonaApiClient(flags);
589
620
  const payload = await client.requestHealthContextSync({
@@ -4372,6 +4403,11 @@ async function main() {
4372
4403
  return;
4373
4404
  }
4374
4405
 
4406
+ if (command === 'fitness' && subcommand === 'show') {
4407
+ await handleFitnessShowCommand(args.flags);
4408
+ return;
4409
+ }
4410
+
4375
4411
  if (command === 'context' && subcommand === 'health') {
4376
4412
  if (args.positionals[0] === 'sync') {
4377
4413
  await handleContextHealthSyncCommand(args.flags);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oomi-ai",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "description": "Managed Oomi channel, bridge, voice, and persona app API tooling for OpenClaw",
5
5
  "bin": {
6
6
  "oomi": "bin/oomi-ai.js"
@@ -19,11 +19,14 @@ The current files are the first shared contract for the vertical slice:
19
19
  OpenClaw agents should use the packaged CLI to inspect and update account-linked persona apps:
20
20
 
21
21
  ```bash
22
+ oomi fitness show --json
22
23
  oomi persona-apps list --json
23
24
  oomi persona-apps show fitness-today --json
24
25
  oomi persona-apps apply-action fitness-today --action fitness.complete_workout --payload-json '{"goalId":"easy-run","minutes":20}' --json
25
26
  ```
26
27
 
28
+ For Fitness, prefer `oomi fitness show --json` before answering because it returns the mini-app state and approved health context together.
29
+
27
30
  When answering data-backed health or fitness questions, agents should read approved backend context first:
28
31
 
29
32
  ```bash
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": "persona-app.v1",
3
- "registryVersion": "2026-04-24.1",
3
+ "registryVersion": "2026-04-25.1",
4
4
  "contextTools": [
5
5
  {
6
6
  "id": "health.context.read",
@@ -34,6 +34,21 @@
34
34
  "description": "Daily movement summary with progress, steps, and sleep context.",
35
35
  "targets": ["ios", "android", "web"]
36
36
  },
37
+ {
38
+ "type": "fitness.dataFreshnessCard",
39
+ "description": "Shows whether mobile health context is fresh enough for decisions and nudges.",
40
+ "targets": ["ios", "android", "web"]
41
+ },
42
+ {
43
+ "type": "fitness.dailyPlanCard",
44
+ "description": "Goal-aware daily plan generated from approved health context.",
45
+ "targets": ["ios", "android", "web"]
46
+ },
47
+ {
48
+ "type": "fitness.goalEditorCard",
49
+ "description": "Lets the user select one active fitness focus from approved Oomi goals.",
50
+ "targets": ["ios", "android", "web"]
51
+ },
37
52
  {
38
53
  "type": "fitness.goalChecklist",
39
54
  "description": "Checklist of suggested goals for today.",
@@ -72,6 +87,20 @@
72
87
  "minutes": { "type": "integer", "minimum": 1 }
73
88
  }
74
89
  }
90
+ },
91
+ {
92
+ "id": "fitness.set_goal",
93
+ "description": "Sets the user's active Fitness focus so Oomi can tune the mini-app and future nudges.",
94
+ "payloadSchema": {
95
+ "type": "object",
96
+ "required": ["goalId"],
97
+ "properties": {
98
+ "goalId": {
99
+ "type": "string",
100
+ "enum": ["move_more", "sleep_better", "build_workout_habit"]
101
+ }
102
+ }
103
+ }
75
104
  }
76
105
  ],
77
106
  "permissions": [
@@ -101,18 +101,25 @@ Interpret bridge states like this:
101
101
  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:
102
102
 
103
103
  ```bash
104
+ oomi fitness show --json
104
105
  oomi persona-apps list --json
105
106
  oomi persona-apps show fitness-today --json
106
107
  oomi persona-apps apply-action fitness-today --action fitness.complete_workout --payload-json '{"goalId":"easy-run","minutes":20}' --json
107
108
  ```
108
109
 
109
110
  Rules:
111
+ - prefer `oomi fitness show --json` for Fitness questions because it combines mini-app state and approved health context
110
112
  - answer from returned `appState.bindings`, not from memory
111
113
  - apply updates through approved `persona-apps apply-action` actions
112
114
  - if the persona app does not exist, ask the user to add it from the Oomi client first so permissions and hydration can run
113
115
  - do not create local persona UI projects from the OpenClaw machine
114
116
  - do not execute persona UI jobs or start local persona app runtimes
115
117
 
118
+ Supported Fitness actions include:
119
+ - `fitness.set_goal` with `{"goalId":"move_more"}`, `{"goalId":"sleep_better"}`, or `{"goalId":"build_workout_habit"}`
120
+ - `fitness.complete_goal`
121
+ - `fitness.complete_workout`
122
+
116
123
  ## Permissioned Context Tools
117
124
 
118
125
  Use context commands before answering personal data questions that should come from Oomi-approved permissions.
@@ -87,17 +87,24 @@ Oomi persona apps are component-composed client surfaces backed by approved temp
87
87
  Persona UI creation and rendering happen inside Oomi-managed systems. Use the Oomi API tools instead:
88
88
 
89
89
  ```bash
90
+ oomi fitness show --json
90
91
  oomi persona-apps list --json
91
92
  oomi persona-apps show fitness-today --json
92
93
  oomi persona-apps apply-action fitness-today --action fitness.complete_workout --payload-json '{"goalId":"easy-run","minutes":20}' --json
93
94
  ```
94
95
 
95
96
  Rules:
97
+ - for Fitness questions, prefer `oomi fitness show --json` first because it combines mini-app state and approved health context
96
98
  - answer from returned `appState.bindings`, not memory
97
99
  - apply updates only through approved `persona-apps apply-action` actions
98
100
  - if the persona app is missing, ask the user to add it from the Oomi client first so permissions and hydration can run
99
101
  - do not execute persona UI jobs or start local persona app runtimes
100
102
 
103
+ Supported Fitness actions include:
104
+ - `fitness.set_goal` with `{"goalId":"move_more"}`, `{"goalId":"sleep_better"}`, or `{"goalId":"build_workout_habit"}`
105
+ - `fitness.complete_goal`
106
+ - `fitness.complete_workout`
107
+
101
108
  ## Permissioned Context Tools
102
109
 
103
110
  Use Oomi context tools when the user asks about personal data that should come from mobile permissions instead of memory.