oomi-ai 0.2.50 → 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 +203 -507
- package/agent_instructions.md +244 -253
- package/bin/oomi-ai.js +4026 -5795
- 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 -58
- 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 -10
- 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/openclaw.plugin.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "oomi-ai",
|
|
3
|
-
"name": "Oomi Channel Plugin",
|
|
4
|
-
"description": "Managed Oomi channel integration for OpenClaw.",
|
|
5
|
-
"version": "0.
|
|
6
|
-
"author": "Oomi",
|
|
7
|
-
"license": "MIT",
|
|
8
|
-
"openclawVersion": ">=0.5.0",
|
|
9
|
-
"channels": [
|
|
10
|
-
"oomi"
|
|
11
|
-
],
|
|
12
|
-
"configSchema": {
|
|
13
|
-
"type": "object",
|
|
14
|
-
"additionalProperties": false,
|
|
15
|
-
"properties": {}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"id": "oomi-ai",
|
|
3
|
+
"name": "Oomi Channel Plugin",
|
|
4
|
+
"description": "Managed Oomi channel, bridge, voice, and persona app API integration for OpenClaw.",
|
|
5
|
+
"version": "0.3.0",
|
|
6
|
+
"author": "Oomi",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"openclawVersion": ">=0.5.0",
|
|
9
|
+
"channels": [
|
|
10
|
+
"oomi"
|
|
11
|
+
],
|
|
12
|
+
"configSchema": {
|
|
13
|
+
"type": "object",
|
|
14
|
+
"additionalProperties": false,
|
|
15
|
+
"properties": {}
|
|
16
|
+
}
|
|
17
|
+
}
|
package/package.json
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "oomi-ai",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Managed Oomi
|
|
5
|
-
"bin": {
|
|
6
|
-
"oomi": "bin/oomi-ai.js"
|
|
7
|
-
},
|
|
8
|
-
"type": "module",
|
|
9
|
-
"engines": {
|
|
10
|
-
"node": ">=18"
|
|
11
|
-
},
|
|
12
|
-
"openclaw": {
|
|
13
|
-
"extensions": [
|
|
14
|
-
"./openclaw.extension.js"
|
|
15
|
-
],
|
|
16
|
-
"channel": {
|
|
17
|
-
"id": "oomi",
|
|
18
|
-
"label": "Oomi",
|
|
19
|
-
"selectionLabel": "Oomi (Managed)",
|
|
20
|
-
"docsPath": "/channels/oomi",
|
|
21
|
-
"docsLabel": "oomi",
|
|
22
|
-
"blurb": "Managed channel transport for Oomi chat.",
|
|
23
|
-
"aliases": [
|
|
24
|
-
"oomi-ai"
|
|
25
|
-
]
|
|
26
|
-
},
|
|
27
|
-
"install": {
|
|
28
|
-
"npmSpec": "oomi-ai",
|
|
29
|
-
"defaultChoice": "npm"
|
|
30
|
-
}
|
|
31
|
-
},
|
|
1
|
+
{
|
|
2
|
+
"name": "oomi-ai",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Managed Oomi channel, bridge, voice, and persona app API tooling for OpenClaw",
|
|
5
|
+
"bin": {
|
|
6
|
+
"oomi": "bin/oomi-ai.js"
|
|
7
|
+
},
|
|
8
|
+
"type": "module",
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=18"
|
|
11
|
+
},
|
|
12
|
+
"openclaw": {
|
|
13
|
+
"extensions": [
|
|
14
|
+
"./openclaw.extension.js"
|
|
15
|
+
],
|
|
16
|
+
"channel": {
|
|
17
|
+
"id": "oomi",
|
|
18
|
+
"label": "Oomi",
|
|
19
|
+
"selectionLabel": "Oomi (Managed)",
|
|
20
|
+
"docsPath": "/channels/oomi",
|
|
21
|
+
"docsLabel": "oomi",
|
|
22
|
+
"blurb": "Managed channel transport for Oomi chat.",
|
|
23
|
+
"aliases": [
|
|
24
|
+
"oomi-ai"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
"install": {
|
|
28
|
+
"npmSpec": "oomi-ai",
|
|
29
|
+
"defaultChoice": "npm"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
32
|
"keywords": [
|
|
33
33
|
"oomi",
|
|
34
34
|
"openclaw",
|
|
@@ -37,38 +37,38 @@
|
|
|
37
37
|
"voice",
|
|
38
38
|
"agent",
|
|
39
39
|
"persona",
|
|
40
|
-
"
|
|
41
|
-
"xr",
|
|
42
|
-
"androidxr"
|
|
40
|
+
"api"
|
|
43
41
|
],
|
|
44
42
|
"homepage": "https://www.oomi.ai",
|
|
45
|
-
"repository": {
|
|
46
|
-
"type": "git",
|
|
47
|
-
"url": "git+https://github.com/crispcode-io/oomi.git",
|
|
48
|
-
"directory": "packages/oomi-ai"
|
|
49
|
-
},
|
|
50
|
-
"bugs": {
|
|
51
|
-
"url": "https://github.com/crispcode-io/oomi/issues"
|
|
52
|
-
},
|
|
53
|
-
"scripts": {
|
|
54
|
-
"check": "node --check bin/oomi-ai.js",
|
|
55
|
-
"test": "node --test test/*.test.mjs"
|
|
56
|
-
},
|
|
57
|
-
"dependencies": {
|
|
58
|
-
"ws": "^8.19.0"
|
|
59
|
-
},
|
|
60
|
-
"license": "MIT",
|
|
61
|
-
"files": [
|
|
62
|
-
"bin/oomi-ai.js",
|
|
63
|
-
"bin/sessionBridgeState.js",
|
|
64
|
-
"lib",
|
|
65
|
-
"
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "git+https://github.com/crispcode-io/oomi.git",
|
|
46
|
+
"directory": "packages/oomi-ai"
|
|
47
|
+
},
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/crispcode-io/oomi/issues"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"check": "node --check bin/oomi-ai.js",
|
|
53
|
+
"test": "node --test test/*.test.mjs"
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"ws": "^8.19.0"
|
|
57
|
+
},
|
|
58
|
+
"license": "MIT",
|
|
59
|
+
"files": [
|
|
60
|
+
"bin/oomi-ai.js",
|
|
61
|
+
"bin/sessionBridgeState.js",
|
|
62
|
+
"lib/openclawPaths.js",
|
|
63
|
+
"lib/openclawProfile.js",
|
|
64
|
+
"lib/personaApiClient.js",
|
|
65
|
+
"lib/spokenMetadata.js",
|
|
66
|
+
"openclaw.plugin.json",
|
|
66
67
|
"openclaw.extension.js",
|
|
67
68
|
"agent_instructions.md",
|
|
68
69
|
"README.md",
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"templates/persona-app/vendor/webspatial/react-sdk/dist"
|
|
70
|
+
"persona-app",
|
|
71
|
+
"skills/oomi/SKILL.md",
|
|
72
|
+
"skills/oomi/agent_instructions.md"
|
|
73
73
|
]
|
|
74
74
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Persona App Definitions
|
|
2
|
+
|
|
3
|
+
Persona apps are composed from approved templates, components, data bindings, actions, and permissions.
|
|
4
|
+
|
|
5
|
+
The agent should inspect and update account-linked persona app state through approved Oomi API actions. It should not generate arbitrary client code for any client target.
|
|
6
|
+
|
|
7
|
+
Client renderers are target-specific:
|
|
8
|
+
|
|
9
|
+
- iOS renders approved definitions with native SwiftUI components.
|
|
10
|
+
- Android should render the same definitions with native components.
|
|
11
|
+
- Web should render the same definitions with React components.
|
|
12
|
+
- Spatial clients can render the same definitions directly or through a target-specific projection.
|
|
13
|
+
|
|
14
|
+
The current files are the first shared contract for the vertical slice:
|
|
15
|
+
|
|
16
|
+
- `schema/persona-app.v1.schema.json`
|
|
17
|
+
- `registry/v1.json`
|
|
18
|
+
|
|
19
|
+
OpenClaw agents should use the packaged CLI to inspect and update account-linked persona apps:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
oomi persona-apps list --json
|
|
23
|
+
oomi persona-apps show fitness-today --json
|
|
24
|
+
oomi persona-apps apply-action fitness-today --action fitness.complete_workout --payload-json '{"goalId":"easy-run","minutes":20}' --json
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
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.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "persona-app.v1",
|
|
3
|
+
"registryVersion": "2026-04-23.1",
|
|
4
|
+
"sharedComponents": [
|
|
5
|
+
{
|
|
6
|
+
"type": "shared.personaHero",
|
|
7
|
+
"description": "Domain hero with title, subtitle, and a primary metric.",
|
|
8
|
+
"targets": ["ios", "android", "web", "webspatial"]
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"type": "shared.oomiNote",
|
|
12
|
+
"description": "A primary-persona note with optional actions.",
|
|
13
|
+
"targets": ["ios", "android", "web", "webspatial"]
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"personaPacks": [
|
|
17
|
+
{
|
|
18
|
+
"personaType": "fitness",
|
|
19
|
+
"displayName": "Fitness",
|
|
20
|
+
"components": [
|
|
21
|
+
{
|
|
22
|
+
"type": "fitness.todaySummary",
|
|
23
|
+
"description": "Daily movement summary with progress, steps, and sleep context.",
|
|
24
|
+
"targets": ["ios", "android", "web"]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"type": "fitness.goalChecklist",
|
|
28
|
+
"description": "Checklist of suggested goals for today.",
|
|
29
|
+
"targets": ["ios", "android", "web"]
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"actions": [
|
|
33
|
+
{
|
|
34
|
+
"id": "fitness.complete_goal",
|
|
35
|
+
"description": "Marks one fitness goal complete.",
|
|
36
|
+
"payloadSchema": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"required": ["goalId"],
|
|
39
|
+
"properties": {
|
|
40
|
+
"goalId": { "type": "string" }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "fitness.complete_workout",
|
|
46
|
+
"description": "Records a completed workout and updates today's movement state.",
|
|
47
|
+
"payloadSchema": {
|
|
48
|
+
"type": "object",
|
|
49
|
+
"properties": {
|
|
50
|
+
"goalId": { "type": "string" },
|
|
51
|
+
"minutes": { "type": "integer", "minimum": 1 }
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"permissions": [
|
|
57
|
+
"fitness.state.read",
|
|
58
|
+
"fitness.state.write"
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://oomi.ai/schemas/persona-app.v1.schema.json",
|
|
4
|
+
"title": "Oomi Persona App Definition",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schemaVersion", "title", "summary", "tabs"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schemaVersion": {
|
|
9
|
+
"const": "persona-app.v1"
|
|
10
|
+
},
|
|
11
|
+
"title": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"minLength": 1
|
|
14
|
+
},
|
|
15
|
+
"summary": {
|
|
16
|
+
"type": "string"
|
|
17
|
+
},
|
|
18
|
+
"theme": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"additionalProperties": true
|
|
21
|
+
},
|
|
22
|
+
"tabs": {
|
|
23
|
+
"type": "array",
|
|
24
|
+
"minItems": 1,
|
|
25
|
+
"items": {
|
|
26
|
+
"type": "object",
|
|
27
|
+
"required": ["id", "title", "components"],
|
|
28
|
+
"properties": {
|
|
29
|
+
"id": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"pattern": "^[a-z][a-z0-9_-]*$"
|
|
32
|
+
},
|
|
33
|
+
"title": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"minLength": 1
|
|
36
|
+
},
|
|
37
|
+
"components": {
|
|
38
|
+
"type": "array",
|
|
39
|
+
"items": {
|
|
40
|
+
"type": "object",
|
|
41
|
+
"required": ["id", "type"],
|
|
42
|
+
"properties": {
|
|
43
|
+
"id": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"pattern": "^[a-z][a-z0-9_-]*$"
|
|
46
|
+
},
|
|
47
|
+
"type": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"pattern": "^[a-z][a-z0-9_-]*(\\.[a-z][a-z0-9_-]*)+$"
|
|
50
|
+
},
|
|
51
|
+
"title": {
|
|
52
|
+
"type": "string"
|
|
53
|
+
},
|
|
54
|
+
"dataKey": {
|
|
55
|
+
"type": "string"
|
|
56
|
+
},
|
|
57
|
+
"props": {
|
|
58
|
+
"type": "object",
|
|
59
|
+
"additionalProperties": true
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"additionalProperties": false
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"additionalProperties": false
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"actions": {
|
|
70
|
+
"type": "array",
|
|
71
|
+
"items": {
|
|
72
|
+
"type": "object",
|
|
73
|
+
"required": ["id", "label"],
|
|
74
|
+
"properties": {
|
|
75
|
+
"id": {
|
|
76
|
+
"type": "string"
|
|
77
|
+
},
|
|
78
|
+
"label": {
|
|
79
|
+
"type": "string"
|
|
80
|
+
},
|
|
81
|
+
"requiresConfirmation": {
|
|
82
|
+
"type": "boolean"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"additionalProperties": false
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"additionalProperties": false
|
|
90
|
+
}
|