@mhome/app-facade-protocol 1.57.0 → 1.60.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 CHANGED
@@ -53,8 +53,30 @@ and MCP public results use essential; internal workflow reads use full. The CLI
53
53
  uses `--response-detail full|essential`, and the bundled external Skill requests
54
54
  essential. Dashboard essential projection keeps card identity, title, type,
55
55
  layouts and view choices, excluding renderer configuration and resource payloads.
56
- Other targets currently retain their business fields in YAML; essential does not
57
- promise a smaller field set for every domain. Targets own that selection.
56
+ Device brief-list essential retains identity, room, capability IDs, Integration and
57
+ availability, omitting `connectId`, `manufacturerId` and `manufacturerName`.
58
+ Selected Device detail, history, recent activity and mutation outcomes keep their
59
+ public business fields. Device bulk list remains a CLI-only surface.
60
+ Space preference updates retain only the submitted preference keys in essential,
61
+ with `updatedFields` unchanged. Location updates omit the previous name/address;
62
+ the current Location remains complete. Hub, Pod, Messaging identity/account reads
63
+ and compact mutation DTOs retain their business fields, including unknown states,
64
+ source errors, failed invitations, one-use commands and expiry.
65
+
66
+ Host list essential retains every row, observation error, component state, permission
67
+ and operation outcome. It omits the runtime root and duplicate per-file component
68
+ checks. Completed service installation results omit Catalog receipts and downloadable
69
+ assets/manifests from the plan, retaining selected components, versions, compatibility,
70
+ actions and warnings. Queued/running/failed remain resource states, never inferred success.
71
+
72
+ Card skin selection and release-list essential omit delivery URLs, entry files,
73
+ asset manifests and renderer configuration schemas. Selected release detail keeps
74
+ `configSchema` (including defaults) so callers can construct valid overrides.
75
+ Revisions, installation IDs, existing override config and supported patterns remain.
76
+ Empty mutation acknowledgements remain empty; they do not invent a new revision.
77
+
78
+ Targets without a dedicated projection retain their business fields in YAML;
79
+ essential does not promise a smaller field set for every domain. Targets own that selection.
58
80
 
59
81
  The [response schema](schema/facade-response.v1.schema.json) and shared
60
82
  [presentation fixtures](fixtures/presentation/cases.json) define the wire
@@ -0,0 +1,51 @@
1
+ # Pod directory
2
+
3
+ `/app/pod/list` is a Space-mode-routed, direct, read-only Facade call with empty
4
+ input. It requires a personal User and read access to the current Space. It combines
5
+ all completed personal Pod registrations owned by that User with registered
6
+ Space-owned Pods in that Space. Another User's personal Pods and other Spaces'
7
+ Pods are excluded. Offline registrations remain; incomplete commissioning attempts
8
+ and nearby discovery candidates are not registrations.
9
+
10
+ A local Space composes this result in Core, reading its own Space inventory and
11
+ obtaining personal registrations through the authenticated private cloud control
12
+ bridge. A cloud Space composes it in cloud. LLM placement does not change this
13
+ owner. Cloud entrypoints forward local-Space business to Core; only an unavailable
14
+ Hub transport permits the explicit read-only registration fallback below.
15
+
16
+ The result contains `pods`, `scopeId`, `observedAtMs`, and `sourceErrors`.
17
+ Every row contains `registrationId`, `clientMode` (`user` or `space`), `registered`
18
+ (true), and `connection` with `scopeId`, `state` (`connected`, `disconnected`, or
19
+ `unknown`), and `source` (`hub`, `cloud`, or `unavailable`). Space rows also contain
20
+ `scopeId` and `appClientId`. Personal rows contain the saved `name`, `deviceId`,
21
+ `model`, `platform`, `firmwareVersion`, `issuedAt`, and `activatedAt`.
22
+ No tokens, enrollment grants, credential IDs or private keys are returned.
23
+
24
+ Connection is an observation in the indicated Space, not global power state.
25
+ Personal registration IDs are keyed by User and device public-key fingerprint;
26
+ personal connection IDs do not carry that fingerprint. The directory does not
27
+ join them by name or hardware ID. Personal connection state is therefore unknown.
28
+ Space registration IDs are their authenticated appClientId and can be correlated.
29
+ When a local Hub cannot be queried, the cloud's persisted Space registrations
30
+ remain visible with unknown connection state and `sourceErrors.space`. The cache
31
+ may omit registrations not yet synchronized; it must not imply a complete live
32
+ snapshot. Cloud presence lookup failures likewise retain saved Space records
33
+ as unknown, with an explicit source error. A successful empty presence lookup
34
+ can establish disconnection. Registration read failures fail the call instead
35
+ of fabricating an empty inventory; authorization and request failures remain errors.
36
+
37
+ `/app/pod/space/list` is an internal composition target, not a separate Agent,
38
+ MCP or CLI operation. Scope-mode routing reads the Hub for a local Space or cloud
39
+ inventory for a cloud Space. It returns only Space-owned Pod registrations.
40
+ UI, Agent, MCP and CLI all use `/app/pod/list`; UI groups by clientMode.
41
+
42
+ `/app/pod/rename` is a direct, idempotent write with exactly `registrationId` and
43
+ `name` (trimmed, 1–64 characters). The authenticated User is the owner; request
44
+ input cannot select a User. It updates only that personal registration's display
45
+ name and returns `{registrationId,name}`. It works while the Pod is offline and
46
+ does not change credentials, ownership, networking or the Pod's local settings.
47
+ It has no prepare/commit or HITL requirement. Space Pod rename is not provided.
48
+ The CLI is `meow pod rename <registrationId> <name>`; Agent/MCP use `pod_rename`.
49
+
50
+ Personal login approve/redeem and Space commissioning retain their existing
51
+ protocols. Factory reset is available only on the Pod itself, not remotely.
@@ -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
  {