@mhome/app-facade-protocol 1.59.0 → 1.61.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 +39 -0
- package/fixtures/authorization/decisions.json +14 -14
- package/fixtures/presentation/cases.json +2279 -69
- package/manifest/app-facade.v1.json +1 -1
- package/manifest/authorization.v1.json +2 -8
- package/manifest/host-provision-targets.v1.json +1 -1
- package/manifest/hub-targets.v1.json +1 -1
- package/manifest/pod-targets.v1.json +1 -1
- package/manifest/routing.v1.json +1 -1
- package/manifest/targets.v1.json +1 -1
- package/package.json +1 -1
- package/protocol.json +1 -1
package/README.md
CHANGED
|
@@ -17,6 +17,27 @@ owns public targets, request/response/event schemas, and stable operation
|
|
|
17
17
|
identity. Core-to-Node routes and provider runtime models belong to
|
|
18
18
|
`mhome-core-api` instead.
|
|
19
19
|
|
|
20
|
+
## Business DTO ownership
|
|
21
|
+
|
|
22
|
+
A Facade owns the public business DTO for an operation. Native Agent tools, MCP,
|
|
23
|
+
CLI and UI SDK adapters forward that DTO; they do not rename its fields, regroup
|
|
24
|
+
its rows or add a client-selected Space ID. Full/essential selection is a Facade
|
|
25
|
+
presentation concern. The same operation and caller context have the same DTO
|
|
26
|
+
across these surfaces. Internal bridge/storage DTOs may use different names;
|
|
27
|
+
conversion belongs at the Facade implementation boundary.
|
|
28
|
+
|
|
29
|
+
Agent Profile get/save use `content` for the complete document. LLM mode get/save
|
|
30
|
+
use `llmMode`; summary and default-provider metadata use that same field.
|
|
31
|
+
`control.mode` and `agentModelMode` are separate concepts. The existing
|
|
32
|
+
`/app/agent/llm/summary` operation owns the combined LLM read used by UI and CLI.
|
|
33
|
+
See the Agent cases in the shared [presentation fixtures](fixtures/presentation/cases.json).
|
|
34
|
+
|
|
35
|
+
Client workflows may coordinate input, login, polling and local files. Native
|
|
36
|
+
Profile updates may run model-based merging. These workflows own explicit final
|
|
37
|
+
results and compose real Facade calls; they are not alternative DTOs for a single
|
|
38
|
+
Facade operation. A UI view model may derive display state after the SDK boundary.
|
|
39
|
+
Composition does not imply a distributed transaction or automatic rollback.
|
|
40
|
+
|
|
20
41
|
## App result contract
|
|
21
42
|
|
|
22
43
|
`control.responseDetail` selects information depth: `full` (default) returns
|
|
@@ -57,6 +78,24 @@ Device brief-list essential retains identity, room, capability IDs, Integration
|
|
|
57
78
|
availability, omitting `connectId`, `manufacturerId` and `manufacturerName`.
|
|
58
79
|
Selected Device detail, history, recent activity and mutation outcomes keep their
|
|
59
80
|
public business fields. Device bulk list remains a CLI-only surface.
|
|
81
|
+
Space preference updates retain only the submitted preference keys in essential,
|
|
82
|
+
with `updatedFields` unchanged. Location updates omit the previous name/address;
|
|
83
|
+
the current Location remains complete. Hub, Pod, Messaging identity/account reads
|
|
84
|
+
and compact mutation DTOs retain their business fields, including unknown states,
|
|
85
|
+
source errors, failed invitations, one-use commands and expiry.
|
|
86
|
+
|
|
87
|
+
Host list essential retains every row, observation error, component state, permission
|
|
88
|
+
and operation outcome. It omits the runtime root and duplicate per-file component
|
|
89
|
+
checks. Completed service installation results omit Catalog receipts and downloadable
|
|
90
|
+
assets/manifests from the plan, retaining selected components, versions, compatibility,
|
|
91
|
+
actions and warnings. Queued/running/failed remain resource states, never inferred success.
|
|
92
|
+
|
|
93
|
+
Card skin selection and release-list essential omit delivery URLs, entry files,
|
|
94
|
+
asset manifests and renderer configuration schemas. Selected release detail keeps
|
|
95
|
+
`configSchema` (including defaults) so callers can construct valid overrides.
|
|
96
|
+
Revisions, installation IDs, existing override config and supported patterns remain.
|
|
97
|
+
Empty mutation acknowledgements remain empty; they do not invent a new revision.
|
|
98
|
+
|
|
60
99
|
Targets without a dedicated projection retain their business fields in YAML;
|
|
61
100
|
essential does not promise a smaller field set for every domain. Targets own that selection.
|
|
62
101
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
|
-
"name": "owner:/app/device/list",
|
|
3
|
+
"name": "owner:/app/device/brief/list",
|
|
4
4
|
"principal": {
|
|
5
5
|
"kind": "user",
|
|
6
6
|
"userId": "owner"
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"memberRole": "OWNER",
|
|
9
9
|
"tenantId": "tenant",
|
|
10
10
|
"scopeId": "space",
|
|
11
|
-
"target": "/app/device/list",
|
|
11
|
+
"target": "/app/device/brief/list",
|
|
12
12
|
"allowed": true
|
|
13
13
|
},
|
|
14
14
|
{
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"allowed": false
|
|
85
85
|
},
|
|
86
86
|
{
|
|
87
|
-
"name": "member:/app/device/list",
|
|
87
|
+
"name": "member:/app/device/brief/list",
|
|
88
88
|
"principal": {
|
|
89
89
|
"kind": "user",
|
|
90
90
|
"userId": "member"
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"memberRole": "MEMBER",
|
|
93
93
|
"tenantId": "tenant",
|
|
94
94
|
"scopeId": "space",
|
|
95
|
-
"target": "/app/device/list",
|
|
95
|
+
"target": "/app/device/brief/list",
|
|
96
96
|
"allowed": true
|
|
97
97
|
},
|
|
98
98
|
{
|
|
@@ -168,7 +168,7 @@
|
|
|
168
168
|
"allowed": false
|
|
169
169
|
},
|
|
170
170
|
{
|
|
171
|
-
"name": "removed:/app/device/list",
|
|
171
|
+
"name": "removed:/app/device/brief/list",
|
|
172
172
|
"principal": {
|
|
173
173
|
"kind": "user",
|
|
174
174
|
"userId": "former"
|
|
@@ -176,7 +176,7 @@
|
|
|
176
176
|
"memberRole": null,
|
|
177
177
|
"tenantId": "tenant",
|
|
178
178
|
"scopeId": "space",
|
|
179
|
-
"target": "/app/device/list",
|
|
179
|
+
"target": "/app/device/brief/list",
|
|
180
180
|
"allowed": false
|
|
181
181
|
},
|
|
182
182
|
{
|
|
@@ -252,7 +252,7 @@
|
|
|
252
252
|
"allowed": false
|
|
253
253
|
},
|
|
254
254
|
{
|
|
255
|
-
"name": "space:/app/device/list",
|
|
255
|
+
"name": "space:/app/device/brief/list",
|
|
256
256
|
"principal": {
|
|
257
257
|
"kind": "space",
|
|
258
258
|
"tenantId": "tenant",
|
|
@@ -261,7 +261,7 @@
|
|
|
261
261
|
"memberRole": null,
|
|
262
262
|
"tenantId": "tenant",
|
|
263
263
|
"scopeId": "space",
|
|
264
|
-
"target": "/app/device/list",
|
|
264
|
+
"target": "/app/device/brief/list",
|
|
265
265
|
"allowed": true
|
|
266
266
|
},
|
|
267
267
|
{
|
|
@@ -343,7 +343,7 @@
|
|
|
343
343
|
"allowed": false
|
|
344
344
|
},
|
|
345
345
|
{
|
|
346
|
-
"name": "space-cannot-borrow-owner:/app/device/list",
|
|
346
|
+
"name": "space-cannot-borrow-owner:/app/device/brief/list",
|
|
347
347
|
"principal": {
|
|
348
348
|
"kind": "space",
|
|
349
349
|
"tenantId": "tenant",
|
|
@@ -352,7 +352,7 @@
|
|
|
352
352
|
"memberRole": "OWNER",
|
|
353
353
|
"tenantId": "tenant",
|
|
354
354
|
"scopeId": "space",
|
|
355
|
-
"target": "/app/device/list",
|
|
355
|
+
"target": "/app/device/brief/list",
|
|
356
356
|
"allowed": true
|
|
357
357
|
},
|
|
358
358
|
{
|
|
@@ -434,7 +434,7 @@
|
|
|
434
434
|
"allowed": false
|
|
435
435
|
},
|
|
436
436
|
{
|
|
437
|
-
"name": "foreign-space:/app/device/list",
|
|
437
|
+
"name": "foreign-space:/app/device/brief/list",
|
|
438
438
|
"principal": {
|
|
439
439
|
"kind": "space",
|
|
440
440
|
"tenantId": "tenant",
|
|
@@ -443,7 +443,7 @@
|
|
|
443
443
|
"memberRole": null,
|
|
444
444
|
"tenantId": "tenant",
|
|
445
445
|
"scopeId": "space",
|
|
446
|
-
"target": "/app/device/list",
|
|
446
|
+
"target": "/app/device/brief/list",
|
|
447
447
|
"allowed": false
|
|
448
448
|
},
|
|
449
449
|
{
|
|
@@ -525,7 +525,7 @@
|
|
|
525
525
|
"allowed": false
|
|
526
526
|
},
|
|
527
527
|
{
|
|
528
|
-
"name": "foreign-tenant:/app/device/list",
|
|
528
|
+
"name": "foreign-tenant:/app/device/brief/list",
|
|
529
529
|
"principal": {
|
|
530
530
|
"kind": "space",
|
|
531
531
|
"tenantId": "other",
|
|
@@ -534,7 +534,7 @@
|
|
|
534
534
|
"memberRole": null,
|
|
535
535
|
"tenantId": "tenant",
|
|
536
536
|
"scopeId": "space",
|
|
537
|
-
"target": "/app/device/list",
|
|
537
|
+
"target": "/app/device/brief/list",
|
|
538
538
|
"allowed": false
|
|
539
539
|
},
|
|
540
540
|
{
|