@mhome/app-facade-protocol 1.127.1 → 1.128.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
@@ -39,15 +39,18 @@ conversion belongs at the Facade implementation boundary.
39
39
 
40
40
  Agent Profile get/save use `content` for the complete document. LLM mode get/save
41
41
  use `llmMode`; summary and default-provider metadata use that same field.
42
- `control.mode` selects response detail. Each LLM use case has one current model. The existing
42
+ `control.responseDetail` selects response detail. Each LLM use case has one current model. The existing
43
43
  `/app/agent/llm/summary` operation owns the combined LLM read used by UI and CLI.
44
44
  See the Agent cases in the shared [presentation fixtures](fixtures/presentation/cases.json).
45
45
 
46
- Client workflows may coordinate input, login, polling and local files. Native
47
- Profile updates may run model-based merging. These workflows own explicit final
48
- results and compose real Facade calls; they are not alternative DTOs for a single
49
- Facade operation. A UI view model may derive display state after the SDK boundary.
50
- Composition does not imply a distributed transaction or automatic rollback.
46
+ Business aggregation, multi-write orchestration and overall outcome settlement belong
47
+ behind a Facade. Clients may make independent reads needed by the caller and adapt
48
+ arguments, local files and terminal/UI input. They may drive defined prepare/commit,
49
+ interactive-session and asynchronous-operation protocols; the backend owns business
50
+ steps, transitions and final DTOs. Do not implement product business composites or
51
+ alternative DTOs in CLI, SDK or surface adapters. A UI view model may derive display
52
+ state after the SDK boundary. Backend composition does not imply a distributed
53
+ transaction or automatic rollback.
51
54
 
52
55
  ## Full values and Essential presentation
53
56
 
@@ -49,7 +49,42 @@ login and Hub authorization retain their independently owned wire DTOs.
49
49
 
50
50
  Legacy `/scope/list`, `/scope/get`, `/scope/preference/get`, `/scope/agent/get`,
51
51
  and `/scope/location/list` readers are retired, without fallback aliases. Native
52
- UI membership refresh uses `/app/presentation/space/list`; the CLI uses
53
- `/app/space/list` for identity-only listing and selection checks, and presentation
54
- listing for its full management view. Neither lightweight flow expands per-Space
55
- context. `/focus` remains connection control, not a business Facade.
52
+ UI membership refresh uses `/app/presentation/space/list`. CLI `space list` forwards
53
+ `/app/space/list` and its canonical `{spaces}` DTO with `spaceId`, `name`, `mode`,
54
+ `llmMode` and `lifecycleState`. It never expands per-Space context or adds local
55
+ active-Space state and Hub routes. Read selected details, members and preferences
56
+ through their own Facades. CLI selection uses `/app/client/space/focus`; it returns
57
+ `{focusedSpaceId}` and leaves membership validation/persistence to the receiving
58
+ Client and authoritative executor. `/focus` has no compatibility alias.
59
+
60
+ Space commands pass the caller's Full/Essential choice to the Facade. Prepare
61
+ previews remain fixed control objects. Whole-Space deletion drives the existing
62
+ asynchronous protocol using structured Full control reads, then returns the
63
+ unchanged `/app/space/delete/status` DTO in the requested detail. It does not
64
+ rewrite `action` or hide operation fields. A successful status read may describe
65
+ `DELETE_FAILED`; waiting for that failed operation still exits unsuccessfully.
66
+
67
+ ## Space mutation outcomes
68
+
69
+ The backend settles member invite/remove outcomes before presentation. A request
70
+ with no failed items succeeds, including already-pending/already-member invitations
71
+ and removal of absent memberships. Fulfilled and failed items together return
72
+ `partial`; failure of every requested item returns `error` with the complete
73
+ per-item result in diagnostics. Full and Essential retain the same outcome.
74
+ Location writes with `NotCreated`, `NotUpdated` or `NotDeleted` return `error`,
75
+ with the original write result in diagnostics. Prepared previews describe planned
76
+ work and never prove effects. Reading a failed deletion operation remains a
77
+ successful read; accepting deletion never means erasure has completed.
78
+
79
+ `/app/space/member/update` accepts `{removeEmails?: string[], inviteEmails?: string[]}`
80
+ with at least one requested change. UI member editing and the human-operated CLI
81
+ share this business composite. The backend normalizes/resolves all inputs and
82
+ rejects an OWNER removal before any write. It then removes memberships and sends
83
+ invitations under one Space mutation lock; it does not promise rollback. The same
84
+ email cannot be removed and invited together. Its complete result is
85
+ `{action, spaceId, removal, invitation, problems}`; removal/invitation preserve
86
+ those individual operations' DTOs. If invitation execution becomes unconfirmed,
87
+ `invitation` is null and `problems` explains that membership must be inspected
88
+ before retrying. The backend settles the overall outcome. It supports direct and
89
+ prepared modes; previews perform no writes. This operation does not extend the
90
+ native Agent, MCP or external Skill boundary for member removal.
@@ -1147,8 +1147,8 @@
1147
1147
  "spaceId": "space-demo",
1148
1148
  "name": "Home",
1149
1149
  "mode": "local",
1150
- "agentMode": "cloud",
1151
- "lifecycleState": "ACTIVE"
1150
+ "lifecycleState": "ACTIVE",
1151
+ "llmMode": "cloud"
1152
1152
  }
1153
1153
  ]
1154
1154
  },
@@ -1159,8 +1159,8 @@
1159
1159
  "spaceId": "space-demo",
1160
1160
  "name": "Home",
1161
1161
  "mode": "local",
1162
- "agentMode": "cloud",
1163
- "lifecycleState": "ACTIVE"
1162
+ "lifecycleState": "ACTIVE",
1163
+ "llmMode": "cloud"
1164
1164
  }
1165
1165
  ]
1166
1166
  }
@@ -1173,8 +1173,8 @@
1173
1173
  "spaceId": "space-demo",
1174
1174
  "name": "Home",
1175
1175
  "mode": "local",
1176
- "agentMode": "cloud",
1177
- "lifecycleState": "ACTIVE"
1176
+ "lifecycleState": "ACTIVE",
1177
+ "llmMode": "cloud"
1178
1178
  },
1179
1179
  "locations": [
1180
1180
  {
@@ -1196,8 +1196,8 @@
1196
1196
  "spaceId": "space-demo",
1197
1197
  "name": "Home",
1198
1198
  "mode": "local",
1199
- "agentMode": "cloud",
1200
- "lifecycleState": "ACTIVE"
1199
+ "lifecycleState": "ACTIVE",
1200
+ "llmMode": "cloud"
1201
1201
  },
1202
1202
  "locations": [
1203
1203
  {
@@ -1239,7 +1239,7 @@
1239
1239
  "invalid@example.com"
1240
1240
  ]
1241
1241
  },
1242
- "status": "success",
1242
+ "status": "partial",
1243
1243
  "essential": {
1244
1244
  "action": "Invited",
1245
1245
  "spaceId": "space-demo",
@@ -2171,7 +2171,7 @@
2171
2171
  "llmUseCases": [
2172
2172
  {
2173
2173
  "useCase": "chat",
2174
- "displayName": "\u5bf9\u8bdd",
2174
+ "displayName": "对话",
2175
2175
  "description": null,
2176
2176
  "ownerType": "system",
2177
2177
  "ownerId": "agent",
@@ -2199,7 +2199,7 @@
2199
2199
  "models": [
2200
2200
  {
2201
2201
  "id": "demo-chat",
2202
- "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2202
+ "displayName": "示例对话模型",
2203
2203
  "modelType": "chat",
2204
2204
  "available": true,
2205
2205
  "deprecated": false,
@@ -2235,7 +2235,7 @@
2235
2235
  "providers": [
2236
2236
  {
2237
2237
  "provider": "local_example",
2238
- "displayName": "\u793a\u4f8b Provider",
2238
+ "displayName": "示例 Provider",
2239
2239
  "runtime": "local",
2240
2240
  "modelSource": "catalog",
2241
2241
  "catalogProvider": "example",
@@ -2306,7 +2306,7 @@
2306
2306
  "llmUseCases": [
2307
2307
  {
2308
2308
  "useCase": "chat",
2309
- "displayName": "\u5bf9\u8bdd",
2309
+ "displayName": "对话",
2310
2310
  "configurable": true,
2311
2311
  "active": true,
2312
2312
  "requirements": {
@@ -2328,7 +2328,7 @@
2328
2328
  "models": [
2329
2329
  {
2330
2330
  "id": "demo-chat",
2331
- "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2331
+ "displayName": "示例对话模型",
2332
2332
  "modelType": "chat",
2333
2333
  "available": true,
2334
2334
  "deprecated": false,
@@ -2359,7 +2359,7 @@
2359
2359
  "providers": [
2360
2360
  {
2361
2361
  "provider": "local_example",
2362
- "displayName": "\u793a\u4f8b Provider",
2362
+ "displayName": "示例 Provider",
2363
2363
  "runtime": "local",
2364
2364
  "useCases": [
2365
2365
  "chat"
@@ -2400,7 +2400,7 @@
2400
2400
  "models": [
2401
2401
  {
2402
2402
  "id": "demo-chat",
2403
- "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2403
+ "displayName": "示例对话模型",
2404
2404
  "modelType": "chat",
2405
2405
  "available": true,
2406
2406
  "deprecated": false,
@@ -2428,7 +2428,7 @@
2428
2428
  "providers": [
2429
2429
  {
2430
2430
  "provider": "local_example",
2431
- "displayName": "\u793a\u4f8b Provider",
2431
+ "displayName": "示例 Provider",
2432
2432
  "runtime": "local",
2433
2433
  "modelSource": "catalog",
2434
2434
  "catalogProvider": "example",
@@ -2461,7 +2461,7 @@
2461
2461
  "models": [
2462
2462
  {
2463
2463
  "id": "demo-chat",
2464
- "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2464
+ "displayName": "示例对话模型",
2465
2465
  "modelType": "chat",
2466
2466
  "available": true,
2467
2467
  "deprecated": false,
@@ -2486,7 +2486,7 @@
2486
2486
  "providers": [
2487
2487
  {
2488
2488
  "provider": "local_example",
2489
- "displayName": "\u793a\u4f8b Provider",
2489
+ "displayName": "示例 Provider",
2490
2490
  "runtime": "local",
2491
2491
  "useCases": [
2492
2492
  "chat"
@@ -2531,7 +2531,7 @@
2531
2531
  "models": [
2532
2532
  {
2533
2533
  "id": "demo-chat",
2534
- "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2534
+ "displayName": "示例对话模型",
2535
2535
  "modelType": "chat",
2536
2536
  "available": true,
2537
2537
  "deprecated": false,
@@ -2589,7 +2589,7 @@
2589
2589
  "models": [
2590
2590
  {
2591
2591
  "id": "demo-chat",
2592
- "displayName": "\u793a\u4f8b\u5bf9\u8bdd\u6a21\u578b",
2592
+ "displayName": "示例对话模型",
2593
2593
  "modelType": "chat",
2594
2594
  "available": true,
2595
2595
  "deprecated": false,
@@ -2640,7 +2640,7 @@
2640
2640
  "llmUseCases": [
2641
2641
  {
2642
2642
  "useCase": "chat",
2643
- "displayName": "\u5bf9\u8bdd",
2643
+ "displayName": "对话",
2644
2644
  "description": null,
2645
2645
  "ownerType": "system",
2646
2646
  "ownerId": "agent",
@@ -2682,7 +2682,7 @@
2682
2682
  "llmUseCases": [
2683
2683
  {
2684
2684
  "useCase": "chat",
2685
- "displayName": "\u5bf9\u8bdd",
2685
+ "displayName": "对话",
2686
2686
  "configurable": true,
2687
2687
  "active": true,
2688
2688
  "requirements": {
@@ -2738,22 +2738,22 @@
2738
2738
  "name": "agent-memory-text",
2739
2739
  "target": "/app/agent/memory/get",
2740
2740
  "data": {
2741
- "content": "\u5ba2\u5385\u7a7a\u8c03\u8bbe\u5b9a\u4e3a 26\u00b0C \u524d\u5148\u5f81\u6c42\u7528\u6237\u540c\u610f\u3002"
2741
+ "content": "客厅空调设定为 26°C 前先征求用户同意。"
2742
2742
  },
2743
2743
  "status": "success",
2744
2744
  "essential": {
2745
- "content": "\u5ba2\u5385\u7a7a\u8c03\u8bbe\u5b9a\u4e3a 26\u00b0C \u524d\u5148\u5f81\u6c42\u7528\u6237\u540c\u610f\u3002"
2745
+ "content": "客厅空调设定为 26°C 前先征求用户同意。"
2746
2746
  }
2747
2747
  },
2748
2748
  {
2749
2749
  "name": "agent-identity-text",
2750
2750
  "target": "/app/agent/identity/get",
2751
2751
  "data": {
2752
- "content": "\u4f7f\u7528\u4e2d\u6587\uff0c\u56de\u7b54\u7b80\u6d01\u3002"
2752
+ "content": "使用中文,回答简洁。"
2753
2753
  },
2754
2754
  "status": "success",
2755
2755
  "essential": {
2756
- "content": "\u4f7f\u7528\u4e2d\u6587\uff0c\u56de\u7b54\u7b80\u6d01\u3002"
2756
+ "content": "使用中文,回答简洁。"
2757
2757
  }
2758
2758
  },
2759
2759
  {
@@ -4537,5 +4537,508 @@
4537
4537
  "createdAt": "2024-11-03 14:30:00.123 +08:00 (Asia/Shanghai)"
4538
4538
  }
4539
4539
  }
4540
+ },
4541
+ {
4542
+ "name": "space-invite-all-failed",
4543
+ "target": "/app/space/member/invite",
4544
+ "data": {
4545
+ "action": "Unchanged",
4546
+ "spaceId": "space-demo",
4547
+ "requested": [
4548
+ "a@example.com"
4549
+ ],
4550
+ "invited": [],
4551
+ "alreadyPending": [],
4552
+ "alreadyMembers": [],
4553
+ "failed": [
4554
+ "a@example.com"
4555
+ ]
4556
+ },
4557
+ "status": "error",
4558
+ "code": "OPERATION_FAILED",
4559
+ "essential": {
4560
+ "status": "error",
4561
+ "error": {
4562
+ "code": "OPERATION_FAILED",
4563
+ "message": "No requested Space member operation succeeded",
4564
+ "details": {
4565
+ "action": "Unchanged",
4566
+ "spaceId": "space-demo",
4567
+ "requested": [
4568
+ "a@example.com"
4569
+ ],
4570
+ "invited": [],
4571
+ "alreadyPending": [],
4572
+ "alreadyMembers": [],
4573
+ "failed": [
4574
+ "a@example.com"
4575
+ ]
4576
+ }
4577
+ }
4578
+ }
4579
+ },
4580
+ {
4581
+ "name": "space-invite-alreadyPending",
4582
+ "target": "/app/space/member/invite",
4583
+ "data": {
4584
+ "action": "Unchanged",
4585
+ "spaceId": "space-demo",
4586
+ "requested": [
4587
+ "a@example.com"
4588
+ ],
4589
+ "invited": [],
4590
+ "alreadyPending": [
4591
+ "a@example.com"
4592
+ ],
4593
+ "alreadyMembers": [],
4594
+ "failed": []
4595
+ },
4596
+ "status": "success",
4597
+ "essential": {
4598
+ "action": "Unchanged",
4599
+ "spaceId": "space-demo",
4600
+ "requested": [
4601
+ "a@example.com"
4602
+ ],
4603
+ "invited": [],
4604
+ "alreadyPending": [
4605
+ "a@example.com"
4606
+ ],
4607
+ "alreadyMembers": [],
4608
+ "failed": []
4609
+ }
4610
+ },
4611
+ {
4612
+ "name": "space-invite-alreadyMembers",
4613
+ "target": "/app/space/member/invite",
4614
+ "data": {
4615
+ "action": "Unchanged",
4616
+ "spaceId": "space-demo",
4617
+ "requested": [
4618
+ "a@example.com"
4619
+ ],
4620
+ "invited": [],
4621
+ "alreadyPending": [],
4622
+ "alreadyMembers": [
4623
+ "a@example.com"
4624
+ ],
4625
+ "failed": []
4626
+ },
4627
+ "status": "success",
4628
+ "essential": {
4629
+ "action": "Unchanged",
4630
+ "spaceId": "space-demo",
4631
+ "requested": [
4632
+ "a@example.com"
4633
+ ],
4634
+ "invited": [],
4635
+ "alreadyPending": [],
4636
+ "alreadyMembers": [
4637
+ "a@example.com"
4638
+ ],
4639
+ "failed": []
4640
+ }
4641
+ },
4642
+ {
4643
+ "name": "space-remove-success",
4644
+ "target": "/app/space/member/remove",
4645
+ "data": {
4646
+ "action": "Removed",
4647
+ "spaceId": "space-demo",
4648
+ "requested": [
4649
+ "a@example.com"
4650
+ ],
4651
+ "removed": [],
4652
+ "notMembership": [
4653
+ "a@example.com"
4654
+ ],
4655
+ "failed": []
4656
+ },
4657
+ "status": "success",
4658
+ "essential": {
4659
+ "action": "Removed",
4660
+ "spaceId": "space-demo",
4661
+ "requested": [
4662
+ "a@example.com"
4663
+ ],
4664
+ "removed": [],
4665
+ "notMembership": [
4666
+ "a@example.com"
4667
+ ],
4668
+ "failed": []
4669
+ }
4670
+ },
4671
+ {
4672
+ "name": "space-remove-partial",
4673
+ "target": "/app/space/member/remove",
4674
+ "data": {
4675
+ "action": "Removed",
4676
+ "spaceId": "space-demo",
4677
+ "requested": [
4678
+ "a@example.com",
4679
+ "b@example.com"
4680
+ ],
4681
+ "removed": [
4682
+ "a@example.com"
4683
+ ],
4684
+ "notMembership": [],
4685
+ "failed": [
4686
+ "b@example.com"
4687
+ ]
4688
+ },
4689
+ "status": "partial",
4690
+ "essential": {
4691
+ "action": "Removed",
4692
+ "spaceId": "space-demo",
4693
+ "requested": [
4694
+ "a@example.com",
4695
+ "b@example.com"
4696
+ ],
4697
+ "removed": [
4698
+ "a@example.com"
4699
+ ],
4700
+ "notMembership": [],
4701
+ "failed": [
4702
+ "b@example.com"
4703
+ ]
4704
+ }
4705
+ },
4706
+ {
4707
+ "name": "space-remove-error",
4708
+ "target": "/app/space/member/remove",
4709
+ "data": {
4710
+ "action": "Removed",
4711
+ "spaceId": "space-demo",
4712
+ "requested": [
4713
+ "a@example.com"
4714
+ ],
4715
+ "removed": [],
4716
+ "notMembership": [],
4717
+ "failed": [
4718
+ "a@example.com"
4719
+ ]
4720
+ },
4721
+ "status": "error",
4722
+ "code": "OPERATION_FAILED",
4723
+ "essential": {
4724
+ "status": "error",
4725
+ "error": {
4726
+ "code": "OPERATION_FAILED",
4727
+ "message": "No requested Space member operation succeeded",
4728
+ "details": {
4729
+ "action": "Removed",
4730
+ "spaceId": "space-demo",
4731
+ "requested": [
4732
+ "a@example.com"
4733
+ ],
4734
+ "removed": [],
4735
+ "notMembership": [],
4736
+ "failed": [
4737
+ "a@example.com"
4738
+ ]
4739
+ }
4740
+ }
4741
+ }
4742
+ },
4743
+ {
4744
+ "name": "space-location-create-failed",
4745
+ "target": "/app/space/location/create",
4746
+ "data": {
4747
+ "action": "NotCreated",
4748
+ "spaceId": "space-demo",
4749
+ "locationId": "office",
4750
+ "name": "Office"
4751
+ },
4752
+ "status": "error",
4753
+ "code": "OPERATION_FAILED",
4754
+ "essential": {
4755
+ "status": "error",
4756
+ "error": {
4757
+ "code": "OPERATION_FAILED",
4758
+ "message": "The Space Location write did not succeed",
4759
+ "details": {
4760
+ "action": "NotCreated",
4761
+ "spaceId": "space-demo",
4762
+ "locationId": "office",
4763
+ "name": "Office"
4764
+ }
4765
+ }
4766
+ }
4767
+ },
4768
+ {
4769
+ "name": "space-location-update-failed",
4770
+ "target": "/app/space/location/update",
4771
+ "data": {
4772
+ "action": "NotUpdated",
4773
+ "spaceId": "space-demo",
4774
+ "locationId": "office",
4775
+ "name": "Office"
4776
+ },
4777
+ "status": "error",
4778
+ "code": "OPERATION_FAILED",
4779
+ "essential": {
4780
+ "status": "error",
4781
+ "error": {
4782
+ "code": "OPERATION_FAILED",
4783
+ "message": "The Space Location write did not succeed",
4784
+ "details": {
4785
+ "action": "NotUpdated",
4786
+ "spaceId": "space-demo",
4787
+ "locationId": "office",
4788
+ "name": "Office"
4789
+ }
4790
+ }
4791
+ }
4792
+ },
4793
+ {
4794
+ "name": "space-location-delete-failed",
4795
+ "target": "/app/space/location/delete",
4796
+ "data": {
4797
+ "action": "NotDeleted",
4798
+ "spaceId": "space-demo",
4799
+ "locationId": "office",
4800
+ "name": "Office",
4801
+ "deleted": false
4802
+ },
4803
+ "status": "error",
4804
+ "code": "OPERATION_FAILED",
4805
+ "essential": {
4806
+ "status": "error",
4807
+ "error": {
4808
+ "code": "OPERATION_FAILED",
4809
+ "message": "The Space Location write did not succeed",
4810
+ "details": {
4811
+ "action": "NotDeleted",
4812
+ "spaceId": "space-demo",
4813
+ "locationId": "office",
4814
+ "name": "Office",
4815
+ "deleted": false
4816
+ }
4817
+ }
4818
+ }
4819
+ },
4820
+ {
4821
+ "name": "space-delete-failed-operation-read",
4822
+ "target": "/app/space/delete/status",
4823
+ "data": {
4824
+ "accepted": true,
4825
+ "operationId": "operation-demo",
4826
+ "spaceId": "space-demo",
4827
+ "state": "DELETE_FAILED",
4828
+ "message": "Hub did not confirm erasure",
4829
+ "deleted": false
4830
+ },
4831
+ "status": "success",
4832
+ "essential": {
4833
+ "accepted": true,
4834
+ "operationId": "operation-demo",
4835
+ "spaceId": "space-demo",
4836
+ "state": "DELETE_FAILED",
4837
+ "message": "Hub did not confirm erasure",
4838
+ "deleted": false
4839
+ }
4840
+ },
4841
+ {
4842
+ "name": "space-member-changes-success",
4843
+ "target": "/app/space/member/update",
4844
+ "data": {
4845
+ "action": "Updated",
4846
+ "spaceId": "space-demo",
4847
+ "removal": {
4848
+ "action": "Removed",
4849
+ "spaceId": "space-demo",
4850
+ "requested": [
4851
+ "old@example.com"
4852
+ ],
4853
+ "removed": [
4854
+ "old@example.com"
4855
+ ],
4856
+ "notMembership": [],
4857
+ "failed": []
4858
+ },
4859
+ "invitation": {
4860
+ "action": "Invited",
4861
+ "spaceId": "space-demo",
4862
+ "requested": [
4863
+ "new@example.com"
4864
+ ],
4865
+ "invited": [
4866
+ "new@example.com"
4867
+ ],
4868
+ "alreadyPending": [],
4869
+ "alreadyMembers": [],
4870
+ "failed": []
4871
+ },
4872
+ "problems": []
4873
+ },
4874
+ "status": "success",
4875
+ "essential": {
4876
+ "action": "Updated",
4877
+ "spaceId": "space-demo",
4878
+ "removal": {
4879
+ "action": "Removed",
4880
+ "spaceId": "space-demo",
4881
+ "requested": [
4882
+ "old@example.com"
4883
+ ],
4884
+ "removed": [
4885
+ "old@example.com"
4886
+ ],
4887
+ "notMembership": [],
4888
+ "failed": []
4889
+ },
4890
+ "invitation": {
4891
+ "action": "Invited",
4892
+ "spaceId": "space-demo",
4893
+ "requested": [
4894
+ "new@example.com"
4895
+ ],
4896
+ "invited": [
4897
+ "new@example.com"
4898
+ ],
4899
+ "alreadyPending": [],
4900
+ "alreadyMembers": [],
4901
+ "failed": []
4902
+ },
4903
+ "problems": []
4904
+ }
4905
+ },
4906
+ {
4907
+ "name": "space-member-changes-partial",
4908
+ "target": "/app/space/member/update",
4909
+ "data": {
4910
+ "action": "Updated",
4911
+ "spaceId": "space-demo",
4912
+ "removal": {
4913
+ "action": "Removed",
4914
+ "spaceId": "space-demo",
4915
+ "requested": [
4916
+ "old@example.com"
4917
+ ],
4918
+ "removed": [
4919
+ "old@example.com"
4920
+ ],
4921
+ "notMembership": [],
4922
+ "failed": []
4923
+ },
4924
+ "invitation": {
4925
+ "action": "Invited",
4926
+ "spaceId": "space-demo",
4927
+ "requested": [
4928
+ "new@example.com"
4929
+ ],
4930
+ "invited": [],
4931
+ "alreadyPending": [],
4932
+ "alreadyMembers": [],
4933
+ "failed": [
4934
+ "new@example.com"
4935
+ ]
4936
+ },
4937
+ "problems": []
4938
+ },
4939
+ "status": "partial",
4940
+ "essential": {
4941
+ "action": "Updated",
4942
+ "spaceId": "space-demo",
4943
+ "removal": {
4944
+ "action": "Removed",
4945
+ "spaceId": "space-demo",
4946
+ "requested": [
4947
+ "old@example.com"
4948
+ ],
4949
+ "removed": [
4950
+ "old@example.com"
4951
+ ],
4952
+ "notMembership": [],
4953
+ "failed": []
4954
+ },
4955
+ "invitation": {
4956
+ "action": "Invited",
4957
+ "spaceId": "space-demo",
4958
+ "requested": [
4959
+ "new@example.com"
4960
+ ],
4961
+ "invited": [],
4962
+ "alreadyPending": [],
4963
+ "alreadyMembers": [],
4964
+ "failed": [
4965
+ "new@example.com"
4966
+ ]
4967
+ },
4968
+ "problems": []
4969
+ }
4970
+ },
4971
+ {
4972
+ "name": "space-member-changes-error",
4973
+ "target": "/app/space/member/update",
4974
+ "data": {
4975
+ "action": "Updated",
4976
+ "spaceId": "space-demo",
4977
+ "removal": {
4978
+ "action": "Removed",
4979
+ "spaceId": "space-demo",
4980
+ "requested": [
4981
+ "old@example.com"
4982
+ ],
4983
+ "removed": [],
4984
+ "notMembership": [],
4985
+ "failed": [
4986
+ "old@example.com"
4987
+ ]
4988
+ },
4989
+ "invitation": {
4990
+ "action": "Invited",
4991
+ "spaceId": "space-demo",
4992
+ "requested": [
4993
+ "new@example.com"
4994
+ ],
4995
+ "invited": [],
4996
+ "alreadyPending": [],
4997
+ "alreadyMembers": [],
4998
+ "failed": [
4999
+ "new@example.com"
5000
+ ]
5001
+ },
5002
+ "problems": []
5003
+ },
5004
+ "status": "error",
5005
+ "essential": {
5006
+ "status": "error",
5007
+ "error": {
5008
+ "code": "OPERATION_FAILED",
5009
+ "message": "Space member changes did not complete",
5010
+ "details": {
5011
+ "action": "Updated",
5012
+ "spaceId": "space-demo",
5013
+ "removal": {
5014
+ "action": "Removed",
5015
+ "spaceId": "space-demo",
5016
+ "requested": [
5017
+ "old@example.com"
5018
+ ],
5019
+ "removed": [],
5020
+ "notMembership": [],
5021
+ "failed": [
5022
+ "old@example.com"
5023
+ ]
5024
+ },
5025
+ "invitation": {
5026
+ "action": "Invited",
5027
+ "spaceId": "space-demo",
5028
+ "requested": [
5029
+ "new@example.com"
5030
+ ],
5031
+ "invited": [],
5032
+ "alreadyPending": [],
5033
+ "alreadyMembers": [],
5034
+ "failed": [
5035
+ "new@example.com"
5036
+ ]
5037
+ },
5038
+ "problems": []
5039
+ }
5040
+ }
5041
+ },
5042
+ "code": "OPERATION_FAILED"
4540
5043
  }
4541
5044
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.app-facade.v1",
3
- "contractVersion": "1.127.1",
3
+ "contractVersion": "1.128.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",
@@ -334,6 +334,13 @@
334
334
  "/app/presentation/space/location/list"
335
335
  ]
336
336
  },
337
+ "spaceMemberChanges": {
338
+ "contract": "contract/space-presentation-v1.md",
339
+ "schema": "schema/space-member-changes.v1.schema.json",
340
+ "requestTargets": [
341
+ "/app/space/member/update"
342
+ ]
343
+ },
337
344
  "spaceManagement": {
338
345
  "contract": "contract/space-presentation-v1.md",
339
346
  "requestTargets": [
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractVersion": "1.127.1",
2
+ "contractVersion": "1.128.0",
3
3
  "operations": {
4
4
  "/app/agent/context/get": "spaceRead",
5
5
  "/app/agent/credit/usage": "spaceRead",
@@ -118,7 +118,6 @@
118
118
  "/app/host/permissions/get": "userRead",
119
119
  "/app/host/service/install": "userWrite",
120
120
  "/app/host/service/restart": "userWrite",
121
- "/app/hub/cache/clear": "spaceManage",
122
121
  "/app/hub/get": "spaceRead",
123
122
  "/app/hub/remove": "spaceManage",
124
123
  "/app/hub/restart": "spaceManage",
@@ -280,6 +279,7 @@
280
279
  "/app/space/member/invite": "spaceManage",
281
280
  "/app/space/member/list": "spaceManage",
282
281
  "/app/space/member/remove": "spaceManage",
282
+ "/app/space/member/update": "spaceManage",
283
283
  "/app/space/preference/get": "spaceRead",
284
284
  "/app/space/preference/update": "userWrite",
285
285
  "/app/space/rename": "spaceManage",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.host-provision.targets.v1",
3
- "contractVersion": "1.127.1",
3
+ "contractVersion": "1.128.0",
4
4
  "contract": "contract/host-provisioning-v1.md",
5
5
  "localTargets": [
6
6
  "/local/host/provision/start",
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "manifest": "mhome.hub.targets.v1",
3
- "contractVersion": "1.127.1",
3
+ "contractVersion": "1.128.0",
4
4
  "appTargets": [
5
5
  "/app/hub/get",
6
- "/app/hub/remove",
7
- "/app/hub/cache/clear"
6
+ "/app/hub/remove"
8
7
  ],
9
8
  "localTargets": [
10
9
  "/local/hub/get",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.pod.targets.v1",
3
- "contractVersion": "1.127.1",
3
+ "contractVersion": "1.128.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.127.1",
3
+ "contractVersion": "1.128.0",
4
4
  "targetPrefix": "/app/",
5
5
  "default": {
6
6
  "execution": "spaceMode"
@@ -16,7 +16,6 @@
16
16
  "cloudTargets": [
17
17
  "/app/agent/context/get",
18
18
  "/app/agent/credit/usage",
19
- "/app/hub/cache/clear",
20
19
  "/app/hub/get",
21
20
  "/app/hub/remove",
22
21
  "/app/plugin/catalog/list",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.messaging.targets.v1",
3
- "contractVersion": "1.127.1",
3
+ "contractVersion": "1.128.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.127.1",
3
+ "version": "1.128.0",
4
4
  "description": "Build-time protocol artifacts for mhome.app-facade",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
package/protocol.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "protocol": "mhome.app-facade",
3
- "contractVersion": "1.127.1",
3
+ "contractVersion": "1.128.0",
4
4
  "manifest": "manifest/app-facade.v1.json",
5
5
  "schemas": {
6
6
  "storage": "schema/storage.v1.schema.json",
@@ -12,6 +12,7 @@
12
12
  "hostAuthorization": "schema/host-authorization.v1.schema.json",
13
13
  "hostAccess": "schema/host-access.v1.schema.json",
14
14
  "agentLlm": "schema/agent-llm.v1.schema.json",
15
+ "spaceMemberChanges": "schema/space-member-changes.v1.schema.json",
15
16
  "entityPresentation": "schema/entity-presentation.v1.schema.json",
16
17
  "integrationPresentation": "schema/integration-presentation.v1.schema.json",
17
18
  "capabilityDescriptor": "schema/capability-descriptor.v1.schema.json",
@@ -0,0 +1,190 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://schemas.meowlink.app/space-member-changes.v1.json",
4
+ "title": "Space member changes",
5
+ "definitions": {
6
+ "input": {
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "removeEmails": {
11
+ "type": "array",
12
+ "items": {
13
+ "type": "string"
14
+ }
15
+ },
16
+ "inviteEmails": {
17
+ "type": "array",
18
+ "items": {
19
+ "type": "string"
20
+ }
21
+ }
22
+ },
23
+ "anyOf": [
24
+ {
25
+ "required": [
26
+ "removeEmails"
27
+ ],
28
+ "properties": {
29
+ "removeEmails": {
30
+ "minItems": 1
31
+ }
32
+ }
33
+ },
34
+ {
35
+ "required": [
36
+ "inviteEmails"
37
+ ],
38
+ "properties": {
39
+ "inviteEmails": {
40
+ "minItems": 1
41
+ }
42
+ }
43
+ }
44
+ ]
45
+ },
46
+ "output": {
47
+ "type": "object",
48
+ "required": [
49
+ "action",
50
+ "spaceId",
51
+ "removal",
52
+ "invitation",
53
+ "problems"
54
+ ],
55
+ "properties": {
56
+ "action": {
57
+ "enum": [
58
+ "Updated",
59
+ "DryRun"
60
+ ]
61
+ },
62
+ "spaceId": {
63
+ "type": "string"
64
+ },
65
+ "removal": {
66
+ "type": "object",
67
+ "required": [
68
+ "action",
69
+ "spaceId",
70
+ "requested",
71
+ "removed",
72
+ "notMembership",
73
+ "failed"
74
+ ],
75
+ "properties": {
76
+ "action": {
77
+ "type": "string"
78
+ },
79
+ "spaceId": {
80
+ "type": "string"
81
+ },
82
+ "requested": {
83
+ "type": "array",
84
+ "items": {
85
+ "type": "string"
86
+ }
87
+ },
88
+ "removed": {
89
+ "type": "array",
90
+ "items": {
91
+ "type": "string"
92
+ }
93
+ },
94
+ "notMembership": {
95
+ "type": "array",
96
+ "items": {
97
+ "type": "string"
98
+ }
99
+ },
100
+ "failed": {
101
+ "type": "array",
102
+ "items": {
103
+ "type": "string"
104
+ }
105
+ }
106
+ }
107
+ },
108
+ "invitation": {
109
+ "anyOf": [
110
+ {
111
+ "type": "object",
112
+ "required": [
113
+ "action",
114
+ "spaceId",
115
+ "requested",
116
+ "invited",
117
+ "alreadyPending",
118
+ "alreadyMembers",
119
+ "failed"
120
+ ],
121
+ "properties": {
122
+ "action": {
123
+ "type": "string"
124
+ },
125
+ "spaceId": {
126
+ "type": "string"
127
+ },
128
+ "requested": {
129
+ "type": "array",
130
+ "items": {
131
+ "type": "string"
132
+ }
133
+ },
134
+ "invited": {
135
+ "type": "array",
136
+ "items": {
137
+ "type": "string"
138
+ }
139
+ },
140
+ "alreadyPending": {
141
+ "type": "array",
142
+ "items": {
143
+ "type": "string"
144
+ }
145
+ },
146
+ "alreadyMembers": {
147
+ "type": "array",
148
+ "items": {
149
+ "type": "string"
150
+ }
151
+ },
152
+ "failed": {
153
+ "type": "array",
154
+ "items": {
155
+ "type": "string"
156
+ }
157
+ }
158
+ }
159
+ },
160
+ {
161
+ "type": "null"
162
+ }
163
+ ]
164
+ },
165
+ "problems": {
166
+ "type": "array",
167
+ "items": {
168
+ "type": "object",
169
+ "required": [
170
+ "step",
171
+ "code",
172
+ "message"
173
+ ],
174
+ "properties": {
175
+ "step": {
176
+ "type": "string"
177
+ },
178
+ "code": {
179
+ "type": "string"
180
+ },
181
+ "message": {
182
+ "type": "string"
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }