@mhome/app-facade-protocol 1.91.0 → 1.93.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
@@ -34,7 +34,7 @@ conversion belongs at the Facade implementation boundary.
34
34
 
35
35
  Agent Profile get/save use `content` for the complete document. LLM mode get/save
36
36
  use `llmMode`; summary and default-provider metadata use that same field.
37
- `control.mode` and `agentModelMode` are separate concepts. The existing
37
+ `control.mode` selects response detail. Each LLM use case has one current model. The existing
38
38
  `/app/agent/llm/summary` operation owns the combined LLM read used by UI and CLI.
39
39
  See the Agent cases in the shared [presentation fixtures](fixtures/presentation/cases.json).
40
40
 
@@ -11,7 +11,7 @@ follow the Space execution authority on both local Core and cloud.
11
11
  | --- | --- | --- |
12
12
  | `/app/device/detail/get` | `{ids}` | Existing ordered `items` with `device` definitions, capabilities, group membership, physical Twin enablement or Group application state, source metadata; no online or state fields |
13
13
  | `/app/device/state/get` | `{ids}` | Ordered `items` with `resource: {entityId, online?, onlineUpdatedAtSec?, latest}` |
14
- | `/app/widget/list` | `{}` | Summaries: id, name, description, type, tag; Data adds dataType/repeated. No list mode or full-definition catalog |
14
+ | `/app/widget/list` | `{}` | Summaries: id, displayName, description, type, tag; Data adds dataType/repeated. No list mode or full-definition catalog |
15
15
  | `/app/widget/detail/get` | `{ids}` | Existing ordered `items` with `widget` configuration; no value, next or nextTimestamp |
16
16
  | `/app/widget/value/get` | `{ids}` | Ordered `items` with `resource: {widgetId, revision, value, next?, nextTimestamp?}` |
17
17
  | `/app/automation/status` | `{ids}` | Ordered `items` with `resource: {automationId, enabled, runnable, running, blocked, lastRunAt}` |
@@ -114,9 +114,13 @@ pages use the shared definition, status and graph readers.
114
114
 
115
115
  Widget detail uses an explicit public definition DTO on Core and cloud, including
116
116
  revision and a boolean repeated flag. It excludes runtime value/next/nextTimestamp.
117
- Essential omits displayName/global/baseId/steps/stepUnits; editable constraints,
117
+ Essential omits global/baseId/steps/stepUnits; editable constraints,
118
118
  options and complete Circadian schedules remain. Full preserves the full definition DTO.
119
119
  History timestamps are epoch seconds; nextTimestamp and explicitly typed Timestamp
120
120
  values are epoch milliseconds in Full. Essential presents these dates in the Home
121
121
  IANA timezone, with UTC fallback for missing/invalid timezone configuration. Numeric
122
122
  values, Duration values and schedule wall-clock times are not inferred to be dates.
123
+
124
+ Widget resources use `displayName` as their only human-readable name. Display names
125
+ may repeat; identity and references use Widget IDs. Configuration patches may omit
126
+ `displayName` to preserve it. Essential and Full both retain this name.
@@ -0,0 +1,200 @@
1
+ # Storage capability, version 1
2
+
3
+ `mhome-storage-api` owns logical Folder and object contracts, usage,
4
+ path validation and structured errors. It has no Catalog, filesystem or network
5
+ implementation. Core API re-exports it and adds binding and Host TLS messages;
6
+ App Facade API re-exports the same contracts for `/app/object-storage/`.
7
+
8
+ The wire generation is `storage.v1`; package versions independently identify
9
+ published build artifacts. During development, providers and consumers are
10
+ updated together. Earlier development contracts are not negotiated or served.
11
+
12
+ ## Names and ownership
13
+
14
+ A Folder's immutable `id` is its exact case-sensitive UTF-8 path within one
15
+ (tenant, Space). Names are never normalized or silently trimmed. Use `home/<path>`,
16
+ `plugin/<unique-plugin-name>/<bound-instance>/<path>`, or `core/<module>/<path>`.
17
+ Segments contain 1–80 Unicode characters, with no edge whitespace, control
18
+ characters, backslash, empty segments, `.` or `..`. Paths contain at most 16
19
+ segments and 1024 UTF-8 bytes; no leading or trailing slash. These logical paths
20
+ are never joined to disk paths. Unicode spellings remain distinct exact IDs.
21
+
22
+ `folders/create` takes `folderId`, is idempotent, and creates missing parents
23
+ below the namespace root in one transaction. Namespace roots themselves are
24
+ virtual and cannot be created or deleted. `folders/get` and `folders/list` return
25
+ path IDs, system/deleting flags, timestamps, direct usage and subtree quota
26
+ snapshots. Paths have no display-name alias or rename endpoint. Storage does not
27
+ automatically evict data or infer consumer-folder mappings.
28
+
29
+ App/CLI/Agent users may create, delete and acquire data sessions only under
30
+ `home/`. Space-authorized diagnostics may list Plugin/system Folder usage.
31
+ Bound Plugins may create multiple Folders, read and acquire sessions, or delete
32
+ only inside `plugin/<name>/<instance>/`. Core derives the name from verified
33
+ binding metadata and the instance from authenticated context; `nodeType`, a
34
+ request path or a caller-supplied name is not ownership proof. Core internal
35
+ modules use `core/<module>/...`. The protected `artifact` Folder is created and
36
+ used only through Artifact APIs; it has no ordinary sessions or Storage settings.
37
+
38
+ ## Folder quota settings
39
+
40
+ `folders/set-limit` takes exactly `{ "folderId": "<path>", "maxBytes": "<bytes>" }`.
41
+ Both fields are required. `maxBytes` is a canonical positive decimal string in
42
+ 1..9223372036854775807, or explicit `null` to remove this Folder's own limit.
43
+ The result is the updated Folder. App Facade uses
44
+ `/app/object-storage/folders/set-limit`; authenticated Node requests use the same
45
+ target with Plugin context derived by Core. Space members can change any ordinary Folder
46
+ setting, including Plugin Folders, without acquiring content mutation permission.
47
+ Plugins can change only their own authenticated namespace. System `artifact` and
48
+ deleting Folders reject settings. There is no version check: last committed write wins.
49
+
50
+ Limits cover a Folder and all descendants across every physical repository.
51
+ Every limited ancestor applies even if a child has no own limit. `quota` contains
52
+ `maxBytes` (own setting), `usedBytes` (subtree committed bytes), `reservedBytes`
53
+ (subtree admitted/uncertain/cleanup writes), `remainingBytes` (minimum remaining
54
+ allowance across this Folder and limited ancestors, or null if none), and
55
+ `exceeded` (any applicable limit is below its charged usage). All byte fields use
56
+ decimal strings. Existing top-level `usedBytes`, `reservedBytes`, and `objectCount`
57
+ continue to describe only the Folder's direct objects.
58
+
59
+ Core checks and reserves the declared object length atomically against all
60
+ applicable limits before physical write preparation. Concurrent descendants cannot
61
+ spend the same allowance. Publication transfers reserved to used; confirmed
62
+ physical deletion/retirement releases the corresponding charge. Lost responses,
63
+ offline repositories, restarts and failed cleanup do not free unconfirmed bytes.
64
+ Immutable-object retries keep their original reservation and do not charge twice.
65
+ `QUOTA_EXCEEDED` is a typed refusal (HTTP 507), distinct from physical `VOLUME_FULL`.
66
+
67
+ Lowering below used plus reserved saves immediately. Existing objects and admitted
68
+ uploads remain; new admissions fail until enough charged bytes are removed or the
69
+ limit increases. Storage never deletes content in response to a setting change.
70
+ Null removes only this Folder's limit; ancestor limits, physical reserves and
71
+ staging requirements still apply. New Folders start with no own limit.
72
+
73
+ ## Deletion and lifetime
74
+
75
+ `folders/delete` takes `folderId` and `recursive` (false by default). False
76
+ requires an empty Folder with no descendants or active/cleanup writes. True
77
+ explicitly removes all its contents and descendants. Physical cleanup must
78
+ succeed before the Folder tree is removed; failure can leave earlier physical
79
+ deletions applied. Remaining objects and staged bytes remain indexed and counted.
80
+ A persistent deletion fence blocks new writes and descendant creation until
81
+ cleanup is retried and finishes. The response is `{ "deleted": true }`; an
82
+ already absent path returns false. `deleting` exposes incomplete cleanup.
83
+
84
+ The catalog retains a private creation incarnation for object ownership and
85
+ sessions, separate from the public path. Reusing a deleted path creates a new
86
+ incarnation; old sessions cannot read, delete or write into it. A fresh management
87
+ delete always addresses the current path, so callers inspect state after an
88
+ uncertain response before retrying. Scope/Core removal stops ordinary access and
89
+ waits for all physical repositories, including offline repositories, to be cleaned.
90
+
91
+ ## Placement and capacity
92
+
93
+ For SDK writes, Core prefers a healthy external repository on the authenticated
94
+ source Host, then another external repository, and finally its internal disk.
95
+ Within each external group, writable staging bytes descending and stable repository/
96
+ binding identities decide the order. An unknown source Host has no local preference.
97
+ Existing objects keep their recorded repository UUID; enabling a Plugin never moves
98
+ them. Discovery excludes unavailable or insufficient candidates. Once selected,
99
+ preparation or transfer failure fails this write: there is no Core byte relay,
100
+ cross-repository replay, persistent sender spool or automatic media retransmission.
101
+ Uncertain results remain pinned to that repository until publication or cleanup.
102
+ Core-internal Artifact consumers retain their existing engine write/recovery path.
103
+
104
+ All Folders share available capacity. Host physical reserves and staging space
105
+ still apply. A write validates full size and SHA-256; no staging space means
106
+ failure without deleting old data. Storage never infers business references.
107
+ Camera owns retention, pinned clips and shared segments, using the recording
108
+ Folder quota with no separate default byte budget. Temporary Artifact content
109
+ retains its transient store and idle TTL. Logically unlimited Artifact storage still needs real space.
110
+
111
+ Object keys are immutable: the same key, size and SHA-256 is an idempotent retry;
112
+ new content requires a new key. Management byte counts and timestamps are decimal
113
+ strings; object/physical receipts use JSON u64.
114
+
115
+ ## Folder SDK and internal transport
116
+
117
+ Business callers use `ensureFolder` (explicit, idempotent creation), `openFolder`
118
+ (existing only), Folder listing/deletion and overview. A Folder handle provides
119
+ put/get/stat/list/delete. The existing Node SDK owns the Plugin client, and the
120
+ App SDK owns the `home/` client. Core internal consumers call the engine directly.
121
+ Camera retains recording retention and shared-segment references.
122
+
123
+ Object HEAD/stat verifies the selected physical repository, not just its Catalog
124
+ receipt. Confirmed physical absence returns 404 (`NOT_FOUND` for GET); a missing
125
+ repository, transport failure or timeout remains unavailable, never absence.
126
+ Length/hash declaration mismatches remain integrity errors. Existence probes do
127
+ not remove receipts or release quota charges: only confirmed deletion does that.
128
+ SDK HEAD maps 404 to no object, and reads preserve the typed `NOT_FOUND` failure.
129
+
130
+ `/app/object-storage/session/acquire` is an internal transport operation, with
131
+ `folderId` and optional `expectedIncarnation`. It accepts no `permissions` or
132
+ `ttlSeconds`. An authorized namespace owner receives all object operations for
133
+ that Folder; the fixed 15-minute expiry is not a business setting. Its Core API
134
+ response includes `folderIncarnation`, HTTPS endpoint, token, Host identity and
135
+ expiry. SDKs keep these private and renew shortly before expiry. The incarnation
136
+ is an opaque transport fence, not another public Folder ID.
137
+
138
+ Each handle binds to its originating Space and owner. Renewals send the original
139
+ creation identity and never call Folder creation. A deleted/recreated path cannot
140
+ replace an existing handle. App login/Space changes retire handles and active
141
+ transfers; Plugin context changes reject the old binding. Reopen explicitly after
142
+ an authorization refusal. HTTP 401 `SESSION_EXPIRED` is raised before object
143
+ mutation and permits one retry after refresh. HTTP 403 remains terminal. Other
144
+ failures, including uncertain writes, are returned without automatic replay.
145
+ Retried uploads retain their original key, length and SHA-256. Native file tickets
146
+ are owned per transfer: renewal leaves an admitted read alive, and completion,
147
+ cancellation or SDK disposal releases its ticket.
148
+
149
+ Object data uses SDK-owned direct transfers. POST to the session's
150
+ `objects/<key>` URL carries a Core API `StorageObjectControl`: `prepare`
151
+ (`sizeBytes`, `sha256`, `contentType`, `localImport`), `complete`, `status`, or
152
+ `abort` (each with `uploadId`), or `read`. Prepare reserves quota once and returns
153
+ an already-published receipt or the exact repository transfer. A transfer contains
154
+ its URL, token, Host TLS identity, expiry and an optional local capability.
155
+ The SDK sends bytes to that repository and completes through Core. Only Core's
156
+ published receipt is success. Complete verifies physical metadata rather than
157
+ trusting the client. Aborting a published upload leaves its object intact.
158
+ Unfinished/cancelled writes remain charged until confirmed cleanup; existing
159
+ recovery may publish verified bytes after a lost response. Terminal journals have
160
+ a 24-hour cleanup window; the immutable object receipt remains accessible by key.
161
+
162
+ Read obtains the selected repository's grant and streams directly, including HTTP
163
+ Range. Session HEAD/list/delete remain Core metadata/management operations. Session
164
+ PUT only accepts a prepared internal-disk upload; external data cannot be relayed
165
+ through the Core Folder gateway. Old SDK byte routes are not served in parallel.
166
+
167
+ The Node SDK writes byte buffers without a temporary file and reuses pinned HTTPS
168
+ connections without sharing request authorization. A local capability is projected
169
+ only for a verified same-Host Plugin. Its private Unix socket accepts one authorized
170
+ object stream, or a read-only source file descriptor for import. Source pathnames
171
+ and repository directory access are never transferred. Import clones on supported
172
+ filesystems or allocates/copies locally, verifies the result, and preserves the
173
+ source. Inaccessible local namespaces may use HTTPS to the same selected repository
174
+ before a local request starts. App WebViews use the native pinned file bridge;
175
+ exact-object upload tickets permit PUT only. No offline quota delegation is added.
176
+
177
+ These logical sessions do not replace physical backend grants. Physical read,
178
+ stat, delete and prepared-write grants remain separate, including Artifact read
179
+ and removal-only cleanup authority.
180
+
181
+ ## Physical backend and reads
182
+
183
+ `storage.backend.v2` remains separate from the public `storage.v1` capability.
184
+ Describe reports capacity; grant authorizes stat/read/delete; prepare-write reserves
185
+ space for an immutable Blob before issuing a write grant. A lost reply can have
186
+ reserved bytes. Receipts are resolved before changing repositories. Issued grants survive temporary Core control disconnection until normal expiry;
187
+ explicit binding removal still revokes unused grants. TLS is pinned,
188
+ with redirects and proxy inheritance disabled. Core's internal `mhome-storage-disk`
189
+ source crate (`publish = false`) owns disk durability, repository identity,
190
+ reservations and idempotent unlink. Core and the Storage Plugin reuse this code;
191
+ it has no independent public package release.
192
+
193
+ Errors carry `code`, `detail` and `outcome` (`notApplied`, `partial`, `unknown`),
194
+ with optional `deletedObjects` for confirmed per-attempt deletions. Unknown
195
+ transport results are not proof of failure. Range reads do not hash the whole
196
+ file first. Full Artifact streams can check integrity incrementally, withholding
197
+ the last bytes until verification succeeds.
198
+
199
+ This version supports new databases only. Edit complete baselines; never convert
200
+ old data at startup. Preserve old databases/files for a separately authorized import.
@@ -194,7 +194,6 @@
194
194
  "thinking": null,
195
195
  "fastMode": null,
196
196
  "useCase": "chat",
197
- "agentModelMode": "auto",
198
197
  "provider": "cloud_example",
199
198
  "model": "chat-example",
200
199
  "source": "default",
@@ -219,26 +218,19 @@
219
218
  "executionUseCase": null,
220
219
  "configurable": true,
221
220
  "active": true,
222
- "modes": [
223
- {
224
- "mode": "auto",
225
- "displayName": "Auto",
226
- "description": null,
227
- "requirements": {
228
- "modelType": "llm",
229
- "requiredInputModalities": [
230
- "text"
231
- ],
232
- "optionalInputModalities": [],
233
- "requiredOutputModalities": [
234
- "text"
235
- ],
236
- "preferredFeatures": []
237
- }
238
- }
239
- ],
240
221
  "updatedAtMs": null,
241
- "lastSeenAtMs": null
222
+ "lastSeenAtMs": null,
223
+ "requirements": {
224
+ "modelType": "llm",
225
+ "requiredInputModalities": [
226
+ "text"
227
+ ],
228
+ "optionalInputModalities": [],
229
+ "requiredOutputModalities": [
230
+ "text"
231
+ ],
232
+ "preferredFeatures": []
233
+ }
242
234
  }
243
235
  ]
244
236
  }
@@ -738,5 +738,93 @@
738
738
  "scopeId": "space",
739
739
  "target": "/app/now/attention/list",
740
740
  "allowed": false
741
+ },
742
+ {
743
+ "name": "owner:/app/object-storage/folders/set-limit",
744
+ "principal": {
745
+ "kind": "user",
746
+ "userId": "owner"
747
+ },
748
+ "memberRole": "OWNER",
749
+ "tenantId": "tenant",
750
+ "scopeId": "space",
751
+ "target": "/app/object-storage/folders/set-limit",
752
+ "allowed": true
753
+ },
754
+ {
755
+ "name": "member:/app/object-storage/folders/set-limit",
756
+ "principal": {
757
+ "kind": "user",
758
+ "userId": "member"
759
+ },
760
+ "memberRole": "MEMBER",
761
+ "tenantId": "tenant",
762
+ "scopeId": "space",
763
+ "target": "/app/object-storage/folders/set-limit",
764
+ "allowed": true
765
+ },
766
+ {
767
+ "name": "removed:/app/object-storage/folders/set-limit",
768
+ "principal": {
769
+ "kind": "user",
770
+ "userId": "former"
771
+ },
772
+ "memberRole": null,
773
+ "tenantId": "tenant",
774
+ "scopeId": "space",
775
+ "target": "/app/object-storage/folders/set-limit",
776
+ "allowed": false
777
+ },
778
+ {
779
+ "name": "space:/app/object-storage/folders/set-limit",
780
+ "principal": {
781
+ "kind": "space",
782
+ "tenantId": "tenant",
783
+ "scopeId": "space"
784
+ },
785
+ "memberRole": null,
786
+ "tenantId": "tenant",
787
+ "scopeId": "space",
788
+ "target": "/app/object-storage/folders/set-limit",
789
+ "allowed": true
790
+ },
791
+ {
792
+ "name": "space-cannot-borrow-owner:/app/object-storage/folders/set-limit",
793
+ "principal": {
794
+ "kind": "space",
795
+ "tenantId": "tenant",
796
+ "scopeId": "space"
797
+ },
798
+ "memberRole": "OWNER",
799
+ "tenantId": "tenant",
800
+ "scopeId": "space",
801
+ "target": "/app/object-storage/folders/set-limit",
802
+ "allowed": true
803
+ },
804
+ {
805
+ "name": "foreign-space:/app/object-storage/folders/set-limit",
806
+ "principal": {
807
+ "kind": "space",
808
+ "tenantId": "tenant",
809
+ "scopeId": "other"
810
+ },
811
+ "memberRole": null,
812
+ "tenantId": "tenant",
813
+ "scopeId": "space",
814
+ "target": "/app/object-storage/folders/set-limit",
815
+ "allowed": false
816
+ },
817
+ {
818
+ "name": "foreign-tenant:/app/object-storage/folders/set-limit",
819
+ "principal": {
820
+ "kind": "space",
821
+ "tenantId": "other",
822
+ "scopeId": "space"
823
+ },
824
+ "memberRole": null,
825
+ "tenantId": "tenant",
826
+ "scopeId": "space",
827
+ "target": "/app/object-storage/folders/set-limit",
828
+ "allowed": false
741
829
  }
742
830
  ]
@@ -2017,7 +2017,6 @@
2017
2017
  "thinking": null,
2018
2018
  "fastMode": null,
2019
2019
  "useCase": "chat",
2020
- "agentModelMode": "auto",
2021
2020
  "provider": "local_example",
2022
2021
  "model": "demo-chat",
2023
2022
  "source": "override",
@@ -2042,26 +2041,19 @@
2042
2041
  "executionUseCase": "chat",
2043
2042
  "configurable": true,
2044
2043
  "active": true,
2045
- "modes": [
2046
- {
2047
- "mode": "auto",
2048
- "displayName": "自动",
2049
- "description": null,
2050
- "requirements": {
2051
- "modelType": "chat",
2052
- "requiredInputModalities": [
2053
- "text"
2054
- ],
2055
- "optionalInputModalities": [],
2056
- "requiredOutputModalities": [
2057
- "text"
2058
- ],
2059
- "preferredFeatures": []
2060
- }
2061
- }
2062
- ],
2063
2044
  "updatedAtMs": 1793059200000,
2064
- "lastSeenAtMs": 1793059200000
2045
+ "lastSeenAtMs": 1793059200000,
2046
+ "requirements": {
2047
+ "modelType": "chat",
2048
+ "requiredInputModalities": [
2049
+ "text"
2050
+ ],
2051
+ "optionalInputModalities": [],
2052
+ "requiredOutputModalities": [
2053
+ "text"
2054
+ ],
2055
+ "preferredFeatures": []
2056
+ }
2065
2057
  }
2066
2058
  ],
2067
2059
  "providerModels": [
@@ -2157,7 +2149,6 @@
2157
2149
  "effectiveMappings": [
2158
2150
  {
2159
2151
  "useCase": "chat",
2160
- "agentModelMode": "auto",
2161
2152
  "provider": "local_example",
2162
2153
  "model": "demo-chat",
2163
2154
  "source": "override",
@@ -2181,23 +2172,17 @@
2181
2172
  "displayName": "对话",
2182
2173
  "configurable": true,
2183
2174
  "active": true,
2184
- "modes": [
2185
- {
2186
- "mode": "auto",
2187
- "displayName": "自动",
2188
- "requirements": {
2189
- "modelType": "chat",
2190
- "requiredInputModalities": [
2191
- "text"
2192
- ],
2193
- "optionalInputModalities": [],
2194
- "requiredOutputModalities": [
2195
- "text"
2196
- ],
2197
- "preferredFeatures": []
2198
- }
2199
- }
2200
- ]
2175
+ "requirements": {
2176
+ "modelType": "chat",
2177
+ "requiredInputModalities": [
2178
+ "text"
2179
+ ],
2180
+ "optionalInputModalities": [],
2181
+ "requiredOutputModalities": [
2182
+ "text"
2183
+ ],
2184
+ "preferredFeatures": []
2185
+ }
2201
2186
  }
2202
2187
  ],
2203
2188
  "providerModels": [
@@ -2508,7 +2493,6 @@
2508
2493
  "thinking": null,
2509
2494
  "fastMode": null,
2510
2495
  "useCase": "chat",
2511
- "agentModelMode": "auto",
2512
2496
  "provider": "local_example",
2513
2497
  "model": "demo-chat",
2514
2498
  "source": "override",
@@ -2526,26 +2510,19 @@
2526
2510
  "executionUseCase": "chat",
2527
2511
  "configurable": true,
2528
2512
  "active": true,
2529
- "modes": [
2530
- {
2531
- "mode": "auto",
2532
- "displayName": "自动",
2533
- "description": null,
2534
- "requirements": {
2535
- "modelType": "chat",
2536
- "requiredInputModalities": [
2537
- "text"
2538
- ],
2539
- "optionalInputModalities": [],
2540
- "requiredOutputModalities": [
2541
- "text"
2542
- ],
2543
- "preferredFeatures": []
2544
- }
2545
- }
2546
- ],
2547
2513
  "updatedAtMs": 1793059200000,
2548
- "lastSeenAtMs": 1793059200000
2514
+ "lastSeenAtMs": 1793059200000,
2515
+ "requirements": {
2516
+ "modelType": "chat",
2517
+ "requiredInputModalities": [
2518
+ "text"
2519
+ ],
2520
+ "optionalInputModalities": [],
2521
+ "requiredOutputModalities": [
2522
+ "text"
2523
+ ],
2524
+ "preferredFeatures": []
2525
+ }
2549
2526
  }
2550
2527
  ]
2551
2528
  },
@@ -2554,7 +2531,6 @@
2554
2531
  "effectiveMappings": [
2555
2532
  {
2556
2533
  "useCase": "chat",
2557
- "agentModelMode": "auto",
2558
2534
  "provider": "local_example",
2559
2535
  "model": "demo-chat",
2560
2536
  "source": "override",
@@ -2572,23 +2548,17 @@
2572
2548
  "displayName": "对话",
2573
2549
  "configurable": true,
2574
2550
  "active": true,
2575
- "modes": [
2576
- {
2577
- "mode": "auto",
2578
- "displayName": "自动",
2579
- "requirements": {
2580
- "modelType": "chat",
2581
- "requiredInputModalities": [
2582
- "text"
2583
- ],
2584
- "optionalInputModalities": [],
2585
- "requiredOutputModalities": [
2586
- "text"
2587
- ],
2588
- "preferredFeatures": []
2589
- }
2590
- }
2591
- ]
2551
+ "requirements": {
2552
+ "modelType": "chat",
2553
+ "requiredInputModalities": [
2554
+ "text"
2555
+ ],
2556
+ "optionalInputModalities": [],
2557
+ "requiredOutputModalities": [
2558
+ "text"
2559
+ ],
2560
+ "preferredFeatures": []
2561
+ }
2592
2562
  }
2593
2563
  ]
2594
2564
  }
@@ -3752,9 +3722,8 @@
3752
3722
  "id": "w",
3753
3723
  "revision": 7,
3754
3724
  "type": "data",
3755
- "name": "Reminder",
3756
3725
  "description": "Alarm instant",
3757
- "source": "user",
3726
+ "source": "widget",
3758
3727
  "dataType": "Timestamp",
3759
3728
  "repeated": false,
3760
3729
  "displayName": "UI name",
@@ -3795,9 +3764,8 @@
3795
3764
  "id": "w",
3796
3765
  "revision": 7,
3797
3766
  "type": "data",
3798
- "name": "Reminder",
3799
3767
  "description": "Alarm instant",
3800
- "source": "user",
3768
+ "source": "widget",
3801
3769
  "dataType": "Timestamp",
3802
3770
  "repeated": false,
3803
3771
  "options": [
@@ -3809,7 +3777,8 @@
3809
3777
  "min": {
3810
3778
  "_type": "Timestamp",
3811
3779
  "value": "1970-01-01 00:00:00 +00:00 (UTC)"
3812
- }
3780
+ },
3781
+ "displayName": "UI name"
3813
3782
  }
3814
3783
  },
3815
3784
  {
@@ -3919,12 +3888,12 @@
3919
3888
  "widgets": [
3920
3889
  {
3921
3890
  "id": "value-d",
3922
- "name": "Level",
3923
3891
  "description": null,
3924
3892
  "tag": null,
3925
3893
  "type": "basic.widget.DataWidget",
3926
3894
  "dataType": "Number",
3927
- "repeated": false
3895
+ "repeated": false,
3896
+ "displayName": "Level"
3928
3897
  }
3929
3898
  ]
3930
3899
  },
@@ -3932,10 +3901,10 @@
3932
3901
  "widgets": [
3933
3902
  {
3934
3903
  "id": "value-d",
3935
- "name": "Level",
3936
3904
  "type": "basic.widget.DataWidget",
3937
3905
  "dataType": "Number",
3938
- "repeated": false
3906
+ "repeated": false,
3907
+ "displayName": "Level"
3939
3908
  }
3940
3909
  ]
3941
3910
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.app-facade.v1",
3
- "contractVersion": "1.91.0",
3
+ "contractVersion": "1.93.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",
@@ -303,6 +303,21 @@
303
303
  "/app/now/attention/list"
304
304
  ],
305
305
  "policy": "manifest/attention-policy.v1.json"
306
+ },
307
+ "storage": {
308
+ "contract": "storage.v1",
309
+ "schema": "schema/storage.v1.schema.json",
310
+ "owner": "scopeHub",
311
+ "managementPermission": "spaceMember",
312
+ "requestTargets": [
313
+ "/app/object-storage/overview",
314
+ "/app/object-storage/folders/list",
315
+ "/app/object-storage/folders/get",
316
+ "/app/object-storage/folders/create",
317
+ "/app/object-storage/folders/delete",
318
+ "/app/object-storage/folders/set-limit",
319
+ "/app/object-storage/session/acquire"
320
+ ]
306
321
  }
307
322
  },
308
323
  "authorization": "manifest/authorization.v1.json",
@@ -1,5 +1,5 @@
1
1
  {
2
- "contractVersion": "1.91.0",
2
+ "contractVersion": "1.93.0",
3
3
  "operations": {
4
4
  "/app/agent/context/get": "spaceRead",
5
5
  "/app/agent/credit/usage": "spaceRead",
@@ -402,7 +402,8 @@
402
402
  "/app/graph/relations/get": "spaceRead",
403
403
  "/app/device/view/get": "spaceRead",
404
404
  "/app/client/screenshot/report": "spaceRead",
405
- "/app/now/attention/list": "spaceRead"
405
+ "/app/now/attention/list": "spaceRead",
406
+ "/app/object-storage/folders/set-limit": "spaceWrite"
406
407
  },
407
408
  "nodePrefix": "/app/plugin/",
408
409
  "serviceOperations": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.host-provision.targets.v1",
3
- "contractVersion": "1.91.0",
3
+ "contractVersion": "1.93.0",
4
4
  "contract": "contract/host-provisioning-v1.md",
5
5
  "localTargets": [
6
6
  "/local/host/provision/start",