@mhome/app-facade-protocol 1.64.0 → 1.66.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 CHANGED
@@ -41,7 +41,7 @@ Composition does not imply a distributed transaction or automatic rollback.
41
41
  ## App result contract
42
42
 
43
43
  `control.responseDetail` selects information depth: `full` (default) returns
44
- `data`, while `essential` returns YAML in `text`. It is independent of action
44
+ `data`, while `essential` returns YAML in `data`. It is independent of action
45
45
  `mode` and is never copied into business input, prepared snapshots or execution
46
46
  fingerprints. `responseFormat` and business `outputFormat` are rejected.
47
47
 
@@ -49,14 +49,18 @@ Final responses use exactly one of these shapes:
49
49
 
50
50
  ```json
51
51
  {"status":"success","data":{"items":[]}}
52
- {"status":"success","text":"items: []\n"}
52
+ {"status":"success","data":"items: []\n"}
53
53
  {"status":"partial","data":{"moved":["a"],"notMoved":[{"deviceId":"b","reason":"offline"}]}}
54
54
  {"status":"error","error":{"code":"PRECONDITION_FAIL","message":"The object changed"}}
55
55
  {"status":"cancelled"}
56
56
  ```
57
57
 
58
- Success and partial carry exactly one of `data` or `text`. Error carries a
59
- `code`, `message`, and optional `details`; success, partial and cancellation may
58
+ Success may omit `data` for an acknowledgement; partial always carries `data`.
59
+ The request selects the representation: Full is the business value (which may itself
60
+ be a string); Essential is a YAML string. Do not infer response detail from its type.
61
+ Pure acknowledgements are identical in both modes: `{"status":"success"}`. Error carries a
62
+ `code`, `message`, and optional Full `details`. Essential errors keep code/message
63
+ and place their projected diagnostics in YAML `data`; success, partial and cancellation may
60
64
  carry structured `warnings`. Resource state belongs inside data: successfully
61
65
  reading a failed job is still a successful invocation. Partial is not complete
62
66
  success and must remain visible to the caller. Transport admission failures keep
@@ -218,3 +222,6 @@ Business operation permissions are declared once in [the authorization manifest]
218
222
  `/app/matter/device/list` is the management inventory, grouped by Fabric node. It is distinct from the Plugin's Integration enumeration `/matter/device/list`. Its `sourceDeviceId` values identify Plugin projections, not Twin entities. Nodes without projected devices remain visible; `membershipComplete`, `inventoryComplete`, per-node completeness and `errors` describe partial observations. Lists omit endpoints and attribute payloads.
219
223
 
220
224
  `/app/matter/fabric/node/detail` accepts 1–20 unique `matterNodeIds`, returning an ordered item result or error for each ID. The request uses string IDs without numeric coercion. See `schema/matter-management.v1.schema.json`. All `/app/matter/` operations execute through the Space's Hub irrespective of scope execution mode. Node removal is a manual UI/CLI capability, not a delegated Agent/MCP tool.
225
+
226
+ UI Integration metadata uses `/app/integration/presentation/get`; see
227
+ [the presentation contract](contract/integration-presentation-v1.md).
@@ -0,0 +1,27 @@
1
+ # Integration UI presentation
2
+
3
+ `/app/integration/presentation/get` is a read-only App Facade for UI consumers.
4
+ Input is `{integrationId}` for one root Integration. Tenant, Space and caller
5
+ come from authenticated context; Space read membership is required. Empty IDs,
6
+ unknown fields and Provider IDs are rejected; missing Integrations are not found.
7
+ This operation is not registered in Agent, MCP or CLI catalogs.
8
+
9
+ The Space execution authority performs the complete read. Integration names and
10
+ icons include the root and every Provider in its visible catalog, regardless of
11
+ installation. `typeNames` labels entity types; `entityStandalone` indicates
12
+ independent entity presentation; `groupSupported` indicates type-level group
13
+ support. Neither boolean map describes an instance's active state. `twinNames`
14
+ labels the root's applicable production Twin templates, not entity instances.
15
+ Developer draft overrides belong to developer tooling, not ordinary App display.
16
+ `capabilities` uses the shared CapabilityDescriptor, including full IDs and
17
+ visibility. No scripts, entity instances, live states or connection data are read.
18
+
19
+ Collections are always present and empty when the model has no corresponding
20
+ metadata. Optional empty names/icons are omitted. Upstream failures propagate;
21
+ existing metadata cache refresh policies remain in effect. No installation,
22
+ entity synchronization or business writes are performed.
23
+
24
+ UI sends `control: {mode: "direct", responseDetail: "full"}` and receives
25
+ `{status: "success", data: ...}`. Essential retains the same business fields in
26
+ YAML `data`; this interface has no separate field reduction. Mutating control
27
+ modes are not supported. SDK indexes the capability array by full ID for UI use.
@@ -0,0 +1,206 @@
1
+ {
2
+ "input": {
3
+ "valid": [
4
+ {
5
+ "integrationId": "basic.device"
6
+ }
7
+ ],
8
+ "invalid": [
9
+ {},
10
+ {
11
+ "integration": "basic.device"
12
+ },
13
+ {
14
+ "integrationId": ""
15
+ },
16
+ {
17
+ "integrationId": " "
18
+ },
19
+ {
20
+ "integrationId": "basic.device",
21
+ "scopeId": "other"
22
+ },
23
+ {
24
+ "integrationId": 7
25
+ }
26
+ ]
27
+ },
28
+ "model": {
29
+ "integrationId": "basic.device",
30
+ "displayName": "Devices",
31
+ "iconUrl": "https://example.invalid/device.png",
32
+ "entityNames": {
33
+ "basic.device.Device": "Device",
34
+ "basic.device.Component": "Component"
35
+ },
36
+ "standaloneEntityTypes": [
37
+ "basic.device.Device"
38
+ ],
39
+ "entityGroupEnabled": {
40
+ "basic.device.Device": true
41
+ },
42
+ "implIntegrations": [
43
+ {
44
+ "integration": "example.device",
45
+ "name": "Example Provider",
46
+ "iconUrl": "https://example.invalid/provider.png"
47
+ },
48
+ {
49
+ "integration": "other.device",
50
+ "name": "Other Provider",
51
+ "iconUrl": ""
52
+ }
53
+ ],
54
+ "capabilities": {
55
+ "command.onOff": {
56
+ "displayName": "Power",
57
+ "description": "Switch power.",
58
+ "visibility": "full",
59
+ "tag": "on/off"
60
+ }
61
+ }
62
+ },
63
+ "output": {
64
+ "valid": [
65
+ {
66
+ "integrationId": "basic.device",
67
+ "integrationNames": {
68
+ "basic.device": "Devices",
69
+ "example.device": "Example Provider",
70
+ "other.device": "Other Provider"
71
+ },
72
+ "integrationIconUrls": {
73
+ "basic.device": "https://example.invalid/device.png",
74
+ "example.device": "https://example.invalid/provider.png"
75
+ },
76
+ "typeNames": {
77
+ "basic.device.Device": "Device",
78
+ "basic.device.Component": "Component"
79
+ },
80
+ "twinNames": {
81
+ "basic.device.Light": "Light"
82
+ },
83
+ "entityStandalone": {
84
+ "basic.device.Device": true,
85
+ "basic.device.Component": false
86
+ },
87
+ "groupSupported": {
88
+ "basic.device.Device": true
89
+ },
90
+ "capabilities": [
91
+ {
92
+ "capabilityId": "basic.device.command.onOff",
93
+ "type": "COMMAND",
94
+ "displayName": "Power",
95
+ "description": "Switch power.",
96
+ "visibility": "full",
97
+ "tag": "on/off"
98
+ }
99
+ ]
100
+ }
101
+ ],
102
+ "invalid": [
103
+ {
104
+ "integrationId": "basic.device",
105
+ "integrationNames": {
106
+ "basic.device": "Devices",
107
+ "example.device": "Example Provider",
108
+ "other.device": "Other Provider"
109
+ },
110
+ "integrationIconUrls": {
111
+ "basic.device": "https://example.invalid/device.png",
112
+ "example.device": "https://example.invalid/provider.png"
113
+ },
114
+ "typeNames": {
115
+ "basic.device.Device": "Device",
116
+ "basic.device.Component": "Component"
117
+ },
118
+ "twinNames": {
119
+ "basic.device.Light": "Light"
120
+ },
121
+ "entityStandalone": {
122
+ "basic.device.Device": true,
123
+ "basic.device.Component": false
124
+ },
125
+ "groupSupported": {
126
+ "basic.device.Device": true
127
+ }
128
+ },
129
+ {
130
+ "integrationId": "basic.device",
131
+ "integrationNames": {
132
+ "basic.device": "Devices",
133
+ "example.device": "Example Provider",
134
+ "other.device": "Other Provider"
135
+ },
136
+ "integrationIconUrls": {
137
+ "basic.device": "https://example.invalid/device.png",
138
+ "example.device": "https://example.invalid/provider.png"
139
+ },
140
+ "typeNames": {
141
+ "basic.device.Device": "Device",
142
+ "basic.device.Component": "Component"
143
+ },
144
+ "twinNames": {
145
+ "basic.device.Light": "Light"
146
+ },
147
+ "entityStandalone": {
148
+ "basic.device.Device": true,
149
+ "basic.device.Component": false
150
+ },
151
+ "groupSupported": {
152
+ "basic.device.Device": true
153
+ },
154
+ "capabilities": [
155
+ {
156
+ "capabilityId": "basic.device.command.onOff",
157
+ "type": "COMMAND",
158
+ "displayName": "Power",
159
+ "description": "Switch power.",
160
+ "visibility": "full",
161
+ "tag": "on/off"
162
+ }
163
+ ],
164
+ "entityEnabled": {
165
+ "basic.device.Device": true
166
+ }
167
+ },
168
+ {
169
+ "integrationId": "basic.device",
170
+ "integrationNames": {
171
+ "basic.device": "Devices",
172
+ "example.device": "Example Provider",
173
+ "other.device": "Other Provider"
174
+ },
175
+ "integrationIconUrls": {
176
+ "basic.device": "https://example.invalid/device.png",
177
+ "example.device": "https://example.invalid/provider.png"
178
+ },
179
+ "typeNames": {
180
+ "basic.device.Device": "Device",
181
+ "basic.device.Component": "Component"
182
+ },
183
+ "twinNames": {
184
+ "basic.device.Light": "Light"
185
+ },
186
+ "entityStandalone": {
187
+ "basic.device.Device": true,
188
+ "basic.device.Component": false
189
+ },
190
+ "groupSupported": {
191
+ "basic.device.Device": "yes"
192
+ },
193
+ "capabilities": [
194
+ {
195
+ "capabilityId": "basic.device.command.onOff",
196
+ "type": "COMMAND",
197
+ "displayName": "Power",
198
+ "description": "Switch power.",
199
+ "visibility": "full",
200
+ "tag": "on/off"
201
+ }
202
+ ]
203
+ }
204
+ ]
205
+ }
206
+ }
@@ -2104,7 +2104,7 @@
2104
2104
  "llmUseCases": [
2105
2105
  {
2106
2106
  "useCase": "chat",
2107
- "displayName": "对话",
2107
+ "displayName": "\u5bf9\u8bdd",
2108
2108
  "description": null,
2109
2109
  "ownerType": "system",
2110
2110
  "ownerId": "agent",
@@ -2114,7 +2114,7 @@
2114
2114
  "modes": [
2115
2115
  {
2116
2116
  "mode": "auto",
2117
- "displayName": "自动",
2117
+ "displayName": "\u81ea\u52a8",
2118
2118
  "description": null,
2119
2119
  "requirements": {
2120
2120
  "modelType": "chat",
@@ -2139,7 +2139,7 @@
2139
2139
  "models": [
2140
2140
  {
2141
2141
  "id": "demo-chat",
2142
- "displayName": "示例对话模型",
2142
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2143
2143
  "modelType": "chat",
2144
2144
  "available": true,
2145
2145
  "deprecated": false,
@@ -2178,7 +2178,7 @@
2178
2178
  "providers": [
2179
2179
  {
2180
2180
  "provider": "local_example",
2181
- "displayName": "示例 Provider",
2181
+ "displayName": "\u793a\u4f8b Provider",
2182
2182
  "runtime": "local",
2183
2183
  "modelSource": "catalog",
2184
2184
  "catalogProvider": "example",
@@ -2219,7 +2219,7 @@
2219
2219
  "chat": [
2220
2220
  {
2221
2221
  "id": "demo-chat",
2222
- "displayName": "示例对话模型",
2222
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2223
2223
  "modelType": "chat",
2224
2224
  "provider": "local_example",
2225
2225
  "available": true,
@@ -2243,7 +2243,7 @@
2243
2243
  "models": [
2244
2244
  {
2245
2245
  "id": "demo-chat",
2246
- "displayName": "示例对话模型",
2246
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2247
2247
  "modelType": "chat",
2248
2248
  "provider": "local_example",
2249
2249
  "available": true,
@@ -2276,7 +2276,7 @@
2276
2276
  "providers": [
2277
2277
  {
2278
2278
  "provider": "local_example",
2279
- "displayName": "示例 Provider",
2279
+ "displayName": "\u793a\u4f8b Provider",
2280
2280
  "runtime": "local",
2281
2281
  "modelSource": "catalog",
2282
2282
  "catalogProvider": "example",
@@ -2317,7 +2317,7 @@
2317
2317
  "chat": [
2318
2318
  {
2319
2319
  "id": "demo-chat",
2320
- "displayName": "示例对话模型",
2320
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2321
2321
  "modelType": "chat",
2322
2322
  "provider": "local_example",
2323
2323
  "available": true,
@@ -2341,7 +2341,7 @@
2341
2341
  "models": [
2342
2342
  {
2343
2343
  "id": "demo-chat",
2344
- "displayName": "示例对话模型",
2344
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2345
2345
  "modelType": "chat",
2346
2346
  "provider": "local_example",
2347
2347
  "available": true,
@@ -2398,14 +2398,14 @@
2398
2398
  "llmUseCases": [
2399
2399
  {
2400
2400
  "useCase": "chat",
2401
- "displayName": "对话",
2401
+ "displayName": "\u5bf9\u8bdd",
2402
2402
  "description": null,
2403
2403
  "configurable": true,
2404
2404
  "active": true,
2405
2405
  "modes": [
2406
2406
  {
2407
2407
  "mode": "auto",
2408
- "displayName": "自动",
2408
+ "displayName": "\u81ea\u52a8",
2409
2409
  "description": null,
2410
2410
  "requirements": {
2411
2411
  "modelType": "chat",
@@ -2428,7 +2428,7 @@
2428
2428
  "models": [
2429
2429
  {
2430
2430
  "id": "demo-chat",
2431
- "displayName": "示例对话模型",
2431
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2432
2432
  "modelType": "chat",
2433
2433
  "available": true,
2434
2434
  "deprecated": false,
@@ -2461,7 +2461,7 @@
2461
2461
  "providers": [
2462
2462
  {
2463
2463
  "provider": "local_example",
2464
- "displayName": "示例 Provider",
2464
+ "displayName": "\u793a\u4f8b Provider",
2465
2465
  "runtime": "local",
2466
2466
  "useCases": [
2467
2467
  "chat"
@@ -2502,7 +2502,7 @@
2502
2502
  "models": [
2503
2503
  {
2504
2504
  "id": "demo-chat",
2505
- "displayName": "示例对话模型",
2505
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2506
2506
  "modelType": "chat",
2507
2507
  "available": true,
2508
2508
  "deprecated": false,
@@ -2533,7 +2533,7 @@
2533
2533
  "providers": [
2534
2534
  {
2535
2535
  "provider": "local_example",
2536
- "displayName": "示例 Provider",
2536
+ "displayName": "\u793a\u4f8b Provider",
2537
2537
  "runtime": "local",
2538
2538
  "modelSource": "catalog",
2539
2539
  "catalogProvider": "example",
@@ -2574,7 +2574,7 @@
2574
2574
  "chat": [
2575
2575
  {
2576
2576
  "id": "demo-chat",
2577
- "displayName": "示例对话模型",
2577
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2578
2578
  "modelType": "chat",
2579
2579
  "provider": "local_example",
2580
2580
  "available": true,
@@ -2598,7 +2598,7 @@
2598
2598
  "models": [
2599
2599
  {
2600
2600
  "id": "demo-chat",
2601
- "displayName": "示例对话模型",
2601
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2602
2602
  "modelType": "chat",
2603
2603
  "provider": "local_example",
2604
2604
  "available": true,
@@ -2628,7 +2628,7 @@
2628
2628
  "providers": [
2629
2629
  {
2630
2630
  "provider": "local_example",
2631
- "displayName": "示例 Provider",
2631
+ "displayName": "\u793a\u4f8b Provider",
2632
2632
  "runtime": "local",
2633
2633
  "modelSource": "catalog",
2634
2634
  "catalogProvider": "example",
@@ -2669,7 +2669,7 @@
2669
2669
  "chat": [
2670
2670
  {
2671
2671
  "id": "demo-chat",
2672
- "displayName": "示例对话模型",
2672
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2673
2673
  "modelType": "chat",
2674
2674
  "provider": "local_example",
2675
2675
  "available": true,
@@ -2693,7 +2693,7 @@
2693
2693
  "models": [
2694
2694
  {
2695
2695
  "id": "demo-chat",
2696
- "displayName": "示例对话模型",
2696
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2697
2697
  "modelType": "chat",
2698
2698
  "provider": "local_example",
2699
2699
  "available": true,
@@ -2731,7 +2731,7 @@
2731
2731
  "models": [
2732
2732
  {
2733
2733
  "id": "demo-chat",
2734
- "displayName": "示例对话模型",
2734
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2735
2735
  "modelType": "chat",
2736
2736
  "available": true,
2737
2737
  "deprecated": false,
@@ -2758,7 +2758,7 @@
2758
2758
  "providers": [
2759
2759
  {
2760
2760
  "provider": "local_example",
2761
- "displayName": "示例 Provider",
2761
+ "displayName": "\u793a\u4f8b Provider",
2762
2762
  "runtime": "local",
2763
2763
  "useCases": [
2764
2764
  "chat"
@@ -2826,7 +2826,7 @@
2826
2826
  "models": [
2827
2827
  {
2828
2828
  "id": "demo-chat",
2829
- "displayName": "示例对话模型",
2829
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2830
2830
  "modelType": "chat",
2831
2831
  "available": true,
2832
2832
  "deprecated": false,
@@ -2885,7 +2885,7 @@
2885
2885
  "models": [
2886
2886
  {
2887
2887
  "id": "demo-chat",
2888
- "displayName": "示例对话模型",
2888
+ "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2889
2889
  "modelType": "chat",
2890
2890
  "available": true,
2891
2891
  "deprecated": false,
@@ -2941,7 +2941,7 @@
2941
2941
  "llmUseCases": [
2942
2942
  {
2943
2943
  "useCase": "chat",
2944
- "displayName": "对话",
2944
+ "displayName": "\u5bf9\u8bdd",
2945
2945
  "description": null,
2946
2946
  "ownerType": "system",
2947
2947
  "ownerId": "agent",
@@ -2951,7 +2951,7 @@
2951
2951
  "modes": [
2952
2952
  {
2953
2953
  "mode": "auto",
2954
- "displayName": "自动",
2954
+ "displayName": "\u81ea\u52a8",
2955
2955
  "description": null,
2956
2956
  "requirements": {
2957
2957
  "modelType": "chat",
@@ -2994,14 +2994,14 @@
2994
2994
  "llmUseCases": [
2995
2995
  {
2996
2996
  "useCase": "chat",
2997
- "displayName": "对话",
2997
+ "displayName": "\u5bf9\u8bdd",
2998
2998
  "description": null,
2999
2999
  "configurable": true,
3000
3000
  "active": true,
3001
3001
  "modes": [
3002
3002
  {
3003
3003
  "mode": "auto",
3004
- "displayName": "自动",
3004
+ "displayName": "\u81ea\u52a8",
3005
3005
  "description": null,
3006
3006
  "requirements": {
3007
3007
  "modelType": "chat",
@@ -3058,22 +3058,22 @@
3058
3058
  "name": "agent-memory-text",
3059
3059
  "target": "/app/agent/memory/get",
3060
3060
  "data": {
3061
- "content": "客厅空调设定为 26°C 前先征求用户同意。"
3061
+ "content": "\u5ba2\u5385\u7a7a\u8c03\u8bbe\u5b9a\u4e3a 26\u00b0C \u524d\u5148\u5f81\u6c42\u7528\u6237\u540c\u610f\u3002"
3062
3062
  },
3063
3063
  "status": "success",
3064
3064
  "essential": {
3065
- "content": "客厅空调设定为 26°C 前先征求用户同意。"
3065
+ "content": "\u5ba2\u5385\u7a7a\u8c03\u8bbe\u5b9a\u4e3a 26\u00b0C \u524d\u5148\u5f81\u6c42\u7528\u6237\u540c\u610f\u3002"
3066
3066
  }
3067
3067
  },
3068
3068
  {
3069
3069
  "name": "agent-identity-text",
3070
3070
  "target": "/app/agent/identity/get",
3071
3071
  "data": {
3072
- "content": "使用中文,回答简洁。"
3072
+ "content": "\u4f7f\u7528\u4e2d\u6587\uff0c\u56de\u7b54\u7b80\u6d01\u3002"
3073
3073
  },
3074
3074
  "status": "success",
3075
3075
  "essential": {
3076
- "content": "使用中文,回答简洁。"
3076
+ "content": "\u4f7f\u7528\u4e2d\u6587\uff0c\u56de\u7b54\u7b80\u6d01\u3002"
3077
3077
  }
3078
3078
  },
3079
3079
  {
@@ -3176,9 +3176,7 @@
3176
3176
  "success": true
3177
3177
  },
3178
3178
  "status": "success",
3179
- "essential": {
3180
- "success": true
3181
- }
3179
+ "acknowledgement": true
3182
3180
  },
3183
3181
  {
3184
3182
  "name": "agent-identity-multiline",
@@ -3336,5 +3334,381 @@
3336
3334
  "layoutSize": "md",
3337
3335
  "cards": []
3338
3336
  }
3337
+ },
3338
+ {
3339
+ "name": "/app/agent/identity/save acknowledgement True",
3340
+ "target": "/app/agent/identity/save",
3341
+ "data": {
3342
+ "success": true
3343
+ },
3344
+ "status": "success",
3345
+ "acknowledgement": true
3346
+ },
3347
+ {
3348
+ "name": "/app/agent/identity/save acknowledgement False",
3349
+ "target": "/app/agent/identity/save",
3350
+ "data": {
3351
+ "success": false
3352
+ },
3353
+ "status": "error",
3354
+ "code": "OPERATION_FAILED"
3355
+ },
3356
+ {
3357
+ "name": "/app/agent/identity/save acknowledgement None",
3358
+ "target": "/app/agent/identity/save",
3359
+ "data": {},
3360
+ "status": "error",
3361
+ "code": "INVALID_RESPONSE"
3362
+ },
3363
+ {
3364
+ "name": "/app/agent/memory/save acknowledgement True",
3365
+ "target": "/app/agent/memory/save",
3366
+ "data": {
3367
+ "success": true
3368
+ },
3369
+ "status": "success",
3370
+ "acknowledgement": true
3371
+ },
3372
+ {
3373
+ "name": "/app/agent/memory/save acknowledgement False",
3374
+ "target": "/app/agent/memory/save",
3375
+ "data": {
3376
+ "success": false
3377
+ },
3378
+ "status": "error",
3379
+ "code": "OPERATION_FAILED"
3380
+ },
3381
+ {
3382
+ "name": "/app/agent/memory/save acknowledgement None",
3383
+ "target": "/app/agent/memory/save",
3384
+ "data": {},
3385
+ "status": "error",
3386
+ "code": "INVALID_RESPONSE"
3387
+ },
3388
+ {
3389
+ "name": "/app/agent/mode/save acknowledgement True",
3390
+ "target": "/app/agent/mode/save",
3391
+ "data": {
3392
+ "success": true
3393
+ },
3394
+ "status": "success",
3395
+ "acknowledgement": true
3396
+ },
3397
+ {
3398
+ "name": "/app/agent/mode/save acknowledgement False",
3399
+ "target": "/app/agent/mode/save",
3400
+ "data": {
3401
+ "success": false
3402
+ },
3403
+ "status": "error",
3404
+ "code": "OPERATION_FAILED"
3405
+ },
3406
+ {
3407
+ "name": "/app/agent/mode/save acknowledgement None",
3408
+ "target": "/app/agent/mode/save",
3409
+ "data": {},
3410
+ "status": "error",
3411
+ "code": "INVALID_RESPONSE"
3412
+ },
3413
+ {
3414
+ "name": "/app/agent/llm/mapping/save acknowledgement True",
3415
+ "target": "/app/agent/llm/mapping/save",
3416
+ "data": {
3417
+ "success": true
3418
+ },
3419
+ "status": "success",
3420
+ "acknowledgement": true
3421
+ },
3422
+ {
3423
+ "name": "/app/agent/llm/mapping/save acknowledgement False",
3424
+ "target": "/app/agent/llm/mapping/save",
3425
+ "data": {
3426
+ "success": false
3427
+ },
3428
+ "status": "error",
3429
+ "code": "OPERATION_FAILED"
3430
+ },
3431
+ {
3432
+ "name": "/app/agent/llm/mapping/save acknowledgement None",
3433
+ "target": "/app/agent/llm/mapping/save",
3434
+ "data": {},
3435
+ "status": "error",
3436
+ "code": "INVALID_RESPONSE"
3437
+ },
3438
+ {
3439
+ "name": "/app/agent/llm/provider/credential/save acknowledgement True",
3440
+ "target": "/app/agent/llm/provider/credential/save",
3441
+ "data": {
3442
+ "success": true
3443
+ },
3444
+ "status": "success",
3445
+ "acknowledgement": true
3446
+ },
3447
+ {
3448
+ "name": "/app/agent/llm/provider/credential/save acknowledgement False",
3449
+ "target": "/app/agent/llm/provider/credential/save",
3450
+ "data": {
3451
+ "success": false
3452
+ },
3453
+ "status": "error",
3454
+ "code": "OPERATION_FAILED"
3455
+ },
3456
+ {
3457
+ "name": "/app/agent/llm/provider/credential/save acknowledgement None",
3458
+ "target": "/app/agent/llm/provider/credential/save",
3459
+ "data": {},
3460
+ "status": "error",
3461
+ "code": "INVALID_RESPONSE"
3462
+ },
3463
+ {
3464
+ "name": "/app/agent/llm/provider/credential/delete acknowledgement True",
3465
+ "target": "/app/agent/llm/provider/credential/delete",
3466
+ "data": {
3467
+ "success": true
3468
+ },
3469
+ "status": "success",
3470
+ "acknowledgement": true
3471
+ },
3472
+ {
3473
+ "name": "/app/agent/llm/provider/credential/delete acknowledgement False",
3474
+ "target": "/app/agent/llm/provider/credential/delete",
3475
+ "data": {
3476
+ "success": false
3477
+ },
3478
+ "status": "error",
3479
+ "code": "OPERATION_FAILED"
3480
+ },
3481
+ {
3482
+ "name": "/app/agent/llm/provider/credential/delete acknowledgement None",
3483
+ "target": "/app/agent/llm/provider/credential/delete",
3484
+ "data": {},
3485
+ "status": "error",
3486
+ "code": "INVALID_RESPONSE"
3487
+ },
3488
+ {
3489
+ "name": "/app/automation/start acknowledgement True",
3490
+ "target": "/app/automation/start",
3491
+ "data": {
3492
+ "success": true
3493
+ },
3494
+ "status": "success",
3495
+ "acknowledgement": true
3496
+ },
3497
+ {
3498
+ "name": "/app/automation/start acknowledgement False",
3499
+ "target": "/app/automation/start",
3500
+ "data": {
3501
+ "success": false
3502
+ },
3503
+ "status": "error",
3504
+ "code": "OPERATION_FAILED"
3505
+ },
3506
+ {
3507
+ "name": "/app/automation/start acknowledgement None",
3508
+ "target": "/app/automation/start",
3509
+ "data": {},
3510
+ "status": "error",
3511
+ "code": "INVALID_RESPONSE"
3512
+ },
3513
+ {
3514
+ "name": "/app/automation/stop acknowledgement True",
3515
+ "target": "/app/automation/stop",
3516
+ "data": {
3517
+ "success": true
3518
+ },
3519
+ "status": "success",
3520
+ "acknowledgement": true
3521
+ },
3522
+ {
3523
+ "name": "/app/automation/stop acknowledgement False",
3524
+ "target": "/app/automation/stop",
3525
+ "data": {
3526
+ "success": false
3527
+ },
3528
+ "status": "error",
3529
+ "code": "OPERATION_FAILED"
3530
+ },
3531
+ {
3532
+ "name": "/app/automation/stop acknowledgement None",
3533
+ "target": "/app/automation/stop",
3534
+ "data": {},
3535
+ "status": "error",
3536
+ "code": "INVALID_RESPONSE"
3537
+ },
3538
+ {
3539
+ "name": "/app/group/delete acknowledgement True",
3540
+ "target": "/app/group/delete",
3541
+ "data": {
3542
+ "success": true
3543
+ },
3544
+ "status": "success",
3545
+ "acknowledgement": true
3546
+ },
3547
+ {
3548
+ "name": "/app/group/delete acknowledgement False",
3549
+ "target": "/app/group/delete",
3550
+ "data": {
3551
+ "success": false
3552
+ },
3553
+ "status": "error",
3554
+ "code": "OPERATION_FAILED"
3555
+ },
3556
+ {
3557
+ "name": "/app/group/delete acknowledgement None",
3558
+ "target": "/app/group/delete",
3559
+ "data": {},
3560
+ "status": "error",
3561
+ "code": "INVALID_RESPONSE"
3562
+ },
3563
+ {
3564
+ "name": "/app/widget/delete acknowledgement True",
3565
+ "target": "/app/widget/delete",
3566
+ "data": {
3567
+ "success": true
3568
+ },
3569
+ "status": "success",
3570
+ "acknowledgement": true
3571
+ },
3572
+ {
3573
+ "name": "/app/widget/delete acknowledgement False",
3574
+ "target": "/app/widget/delete",
3575
+ "data": {
3576
+ "success": false
3577
+ },
3578
+ "status": "error",
3579
+ "code": "OPERATION_FAILED"
3580
+ },
3581
+ {
3582
+ "name": "/app/widget/delete acknowledgement None",
3583
+ "target": "/app/widget/delete",
3584
+ "data": {},
3585
+ "status": "error",
3586
+ "code": "INVALID_RESPONSE"
3587
+ },
3588
+ {
3589
+ "name": "/app/widget/data/update acknowledgement True",
3590
+ "target": "/app/widget/data/update",
3591
+ "data": {
3592
+ "success": true
3593
+ },
3594
+ "status": "success",
3595
+ "acknowledgement": true
3596
+ },
3597
+ {
3598
+ "name": "/app/widget/data/update acknowledgement False",
3599
+ "target": "/app/widget/data/update",
3600
+ "data": {
3601
+ "success": false
3602
+ },
3603
+ "status": "error",
3604
+ "code": "OPERATION_FAILED"
3605
+ },
3606
+ {
3607
+ "name": "/app/widget/data/update acknowledgement None",
3608
+ "target": "/app/widget/data/update",
3609
+ "data": {},
3610
+ "status": "error",
3611
+ "code": "INVALID_RESPONSE"
3612
+ },
3613
+ {
3614
+ "name": "/app/widget/button/trigger acknowledgement True",
3615
+ "target": "/app/widget/button/trigger",
3616
+ "data": {
3617
+ "success": true
3618
+ },
3619
+ "status": "success",
3620
+ "acknowledgement": true
3621
+ },
3622
+ {
3623
+ "name": "/app/widget/button/trigger acknowledgement False",
3624
+ "target": "/app/widget/button/trigger",
3625
+ "data": {
3626
+ "success": false
3627
+ },
3628
+ "status": "error",
3629
+ "code": "OPERATION_FAILED"
3630
+ },
3631
+ {
3632
+ "name": "/app/widget/button/trigger acknowledgement None",
3633
+ "target": "/app/widget/button/trigger",
3634
+ "data": {},
3635
+ "status": "error",
3636
+ "code": "INVALID_RESPONSE"
3637
+ },
3638
+ {
3639
+ "name": "full string remains valid",
3640
+ "target": "/app/test/string",
3641
+ "data": "line one\nline two",
3642
+ "essential": "line one\nline two",
3643
+ "status": "success"
3644
+ },
3645
+ {
3646
+ "name": "/app/messaging/unlink preserves change result True",
3647
+ "target": "/app/messaging/unlink",
3648
+ "data": {
3649
+ "success": true
3650
+ },
3651
+ "essential": {
3652
+ "success": true
3653
+ },
3654
+ "status": "success"
3655
+ },
3656
+ {
3657
+ "name": "/app/messaging/unlink preserves change result False",
3658
+ "target": "/app/messaging/unlink",
3659
+ "data": {
3660
+ "success": false
3661
+ },
3662
+ "essential": {
3663
+ "success": false
3664
+ },
3665
+ "status": "success"
3666
+ },
3667
+ {
3668
+ "name": "/app/messaging/unbind preserves change result True",
3669
+ "target": "/app/messaging/unbind",
3670
+ "data": {
3671
+ "success": true
3672
+ },
3673
+ "essential": {
3674
+ "success": true
3675
+ },
3676
+ "status": "success"
3677
+ },
3678
+ {
3679
+ "name": "/app/messaging/unbind preserves change result False",
3680
+ "target": "/app/messaging/unbind",
3681
+ "data": {
3682
+ "success": false
3683
+ },
3684
+ "essential": {
3685
+ "success": false
3686
+ },
3687
+ "status": "success"
3688
+ },
3689
+ {
3690
+ "name": "feedback acknowledgement",
3691
+ "target": "/app/system/feedback/submit",
3692
+ "data": {
3693
+ "success": true
3694
+ },
3695
+ "status": "success",
3696
+ "acknowledgement": true
3697
+ },
3698
+ {
3699
+ "name": "feedback /app/agent/memory/save acknowledgement False",
3700
+ "target": "/app/system/feedback/submit",
3701
+ "data": {
3702
+ "success": false
3703
+ },
3704
+ "status": "error",
3705
+ "code": "OPERATION_FAILED"
3706
+ },
3707
+ {
3708
+ "name": "feedback /app/agent/memory/save acknowledgement None",
3709
+ "target": "/app/system/feedback/submit",
3710
+ "data": {},
3711
+ "status": "error",
3712
+ "code": "INVALID_RESPONSE"
3339
3713
  }
3340
3714
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.app-facade.v1",
3
- "contractVersion": "1.64.0",
3
+ "contractVersion": "1.66.0",
4
4
  "callSchema": "schema/facade-call.v1.schema.json",
5
5
  "routing": "manifest/routing.v1.json",
6
6
  "routingSchema": "schema/routing.v1.schema.json",
@@ -237,6 +237,13 @@
237
237
  "requestTargets": [
238
238
  "/app/entity/presentation/get"
239
239
  ]
240
+ },
241
+ "integrationPresentation": {
242
+ "schema": "schema/integration-presentation.v1.schema.json",
243
+ "contract": "contract/integration-presentation-v1.md",
244
+ "requestTargets": [
245
+ "/app/integration/presentation/get"
246
+ ]
240
247
  }
241
248
  },
242
249
  "authorization": "manifest/authorization.v1.json",
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractVersion": "1.64.0",
2
+ "contractVersion": "1.66.0",
3
3
  "operations": {
4
4
  "/app/agent/context/get": "spaceRead",
5
5
  "/app/agent/credit/usage": "spaceRead",
@@ -95,6 +95,7 @@
95
95
  "/app/entity/history/list": "spaceRead",
96
96
  "/app/entity/list": "spaceRead",
97
97
  "/app/entity/presentation/get": "spaceRead",
98
+ "/app/integration/presentation/get": "spaceRead",
98
99
  "/app/group/brief/list": "spaceRead",
99
100
  "/app/group/delete": "spaceWrite",
100
101
  "/app/group/detail/get": "spaceRead",
@@ -318,7 +319,6 @@
318
319
  "/integration/entity/getHistory": "spaceRead",
319
320
  "/integration/group/get": "spaceRead",
320
321
  "/integration/install": "spaceWrite",
321
- "/integration/meta/get": "spaceRead",
322
322
  "/integration/model/get": "spaceRead",
323
323
  "/integration/providerEnv/refresh": "spaceWrite",
324
324
  "/integration/uninstall": "spaceWrite",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.host-provision.targets.v1",
3
- "contractVersion": "1.64.0",
3
+ "contractVersion": "1.66.0",
4
4
  "contract": "contract/host-provisioning-v1.md",
5
5
  "localTargets": [
6
6
  "/local/host/provision/start",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.hub.targets.v1",
3
- "contractVersion": "1.64.0",
3
+ "contractVersion": "1.66.0",
4
4
  "appTargets": [
5
5
  "/app/hub/get",
6
6
  "/app/hub/remove",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.pod.targets.v1",
3
- "contractVersion": "1.64.0",
3
+ "contractVersion": "1.66.0",
4
4
  "contract": "contract/pod-commissioning-v1.md",
5
5
  "localTargets": [
6
6
  "/local/pod/discovery/start",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.app-facade.routing.v1",
3
- "contractVersion": "1.64.0",
3
+ "contractVersion": "1.66.0",
4
4
  "targetPrefix": "/app/",
5
5
  "default": {
6
6
  "execution": "scopeMode"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.messaging.targets.v1",
3
- "contractVersion": "1.64.0",
3
+ "contractVersion": "1.66.0",
4
4
  "requestTargets": [
5
5
  "/app/messaging/provider/list",
6
6
  "/app/messaging/provider-account/list",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mhome/app-facade-protocol",
3
- "version": "1.64.0",
3
+ "version": "1.66.0",
4
4
  "description": "Build-time protocol artifacts for mhome.app-facade",
5
5
  "license": "MIT",
6
6
  "repository": {
package/protocol.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "protocol": "mhome.app-facade",
3
- "contractVersion": "1.64.0",
3
+ "contractVersion": "1.66.0",
4
4
  "manifest": "manifest/app-facade.v1.json",
5
5
  "schemas": {
6
6
  "hostAuthorization": "schema/host-authorization.v1.schema.json",
7
7
  "hostAccess": "schema/host-access.v1.schema.json",
8
8
  "entityPresentation": "schema/entity-presentation.v1.schema.json",
9
+ "integrationPresentation": "schema/integration-presentation.v1.schema.json",
9
10
  "capabilityDescriptor": "schema/capability-descriptor.v1.schema.json",
10
11
  "cardSkinPackage": "schema/card-skin-package.v1.schema.json",
11
12
  "cardSkins": "schema/card-skins.v1.schema.json",
@@ -28,6 +29,7 @@
28
29
  },
29
30
  "fixtures": {
30
31
  "entityPresentation": "fixtures/entity-presentation.conformance.json",
32
+ "integrationPresentation": "fixtures/integration-presentation.conformance.json",
31
33
  "valid": "fixtures",
32
34
  "invalid": "fixtures/invalid",
33
35
  "hostAccess": "schema/host-access.v1.schema.json",
@@ -13,74 +13,33 @@
13
13
  "const": "success"
14
14
  },
15
15
  "data": true,
16
- "text": {
17
- "type": "string"
18
- },
19
16
  "warnings": {
20
17
  "type": "array",
21
18
  "items": {
22
19
  "$ref": "#/$defs/problem"
23
20
  }
24
21
  }
25
- },
26
- "oneOf": [
27
- {
28
- "required": [
29
- "data"
30
- ],
31
- "properties": {
32
- "data": true
33
- }
34
- },
35
- {
36
- "required": [
37
- "text"
38
- ],
39
- "properties": {
40
- "text": true
41
- }
42
- }
43
- ]
22
+ }
44
23
  },
45
24
  {
46
25
  "type": "object",
47
26
  "additionalProperties": false,
48
27
  "required": [
49
- "status"
28
+ "status",
29
+ "data"
50
30
  ],
51
31
  "properties": {
52
32
  "status": {
53
33
  "const": "partial"
54
34
  },
55
35
  "data": true,
56
- "text": {
57
- "type": "string"
58
- },
59
36
  "warnings": {
60
37
  "type": "array",
61
38
  "items": {
62
39
  "$ref": "#/$defs/problem"
63
40
  }
64
41
  }
65
- },
66
- "oneOf": [
67
- {
68
- "required": [
69
- "data"
70
- ],
71
- "properties": {
72
- "data": true
73
- }
74
- },
75
- {
76
- "required": [
77
- "text"
78
- ],
79
- "properties": {
80
- "text": true
81
- }
82
- }
83
- ]
42
+ }
84
43
  },
85
44
  {
86
45
  "type": "object",
@@ -95,6 +54,9 @@
95
54
  },
96
55
  "error": {
97
56
  "$ref": "#/$defs/problem"
57
+ },
58
+ "data": {
59
+ "type": "string"
98
60
  }
99
61
  }
100
62
  },
@@ -0,0 +1,81 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mhome.ai/schema/integration-presentation.v1.schema.json",
4
+ "$defs": {
5
+ "input": {
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "integrationId"
10
+ ],
11
+ "properties": {
12
+ "integrationId": {
13
+ "type": "string",
14
+ "pattern": "\\S"
15
+ }
16
+ }
17
+ },
18
+ "output": {
19
+ "type": "object",
20
+ "additionalProperties": false,
21
+ "required": [
22
+ "integrationId",
23
+ "integrationNames",
24
+ "integrationIconUrls",
25
+ "typeNames",
26
+ "twinNames",
27
+ "entityStandalone",
28
+ "groupSupported",
29
+ "capabilities"
30
+ ],
31
+ "properties": {
32
+ "integrationId": {
33
+ "type": "string",
34
+ "pattern": "\\S"
35
+ },
36
+ "integrationNames": {
37
+ "type": "object",
38
+ "additionalProperties": {
39
+ "type": "string"
40
+ }
41
+ },
42
+ "integrationIconUrls": {
43
+ "type": "object",
44
+ "additionalProperties": {
45
+ "type": "string"
46
+ }
47
+ },
48
+ "typeNames": {
49
+ "type": "object",
50
+ "additionalProperties": {
51
+ "type": "string"
52
+ }
53
+ },
54
+ "twinNames": {
55
+ "type": "object",
56
+ "additionalProperties": {
57
+ "type": "string"
58
+ }
59
+ },
60
+ "entityStandalone": {
61
+ "type": "object",
62
+ "additionalProperties": {
63
+ "type": "boolean"
64
+ }
65
+ },
66
+ "groupSupported": {
67
+ "type": "object",
68
+ "additionalProperties": {
69
+ "type": "boolean"
70
+ }
71
+ },
72
+ "capabilities": {
73
+ "type": "array",
74
+ "items": {
75
+ "$ref": "https://mhome.ai/schema/capability-descriptor.v1.schema.json"
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }