@mhome/app-facade-protocol 1.90.1 → 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 +1 -1
- package/contract/now-attention-v1.md +17 -4
- package/contract/resource-read-v1.md +35 -5
- package/contract/storage-v1.md +200 -0
- package/fixtures/agent-llm.conformance.json +12 -20
- package/fixtures/attention/device-observations.json +335 -0
- package/fixtures/authorization/decisions.json +88 -0
- package/fixtures/entity-presentation.conformance.json +1 -1
- package/fixtures/group.conformance.json +1 -1
- package/fixtures/presentation/cases.json +58 -89
- package/manifest/app-facade.v1.json +16 -1
- package/manifest/authorization.v1.json +3 -2
- 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 +2 -1
- package/schema/agent-llm.v1.schema.json +4 -41
- package/schema/storage.v1.schema.json +548 -0
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`
|
|
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
|
|
|
@@ -44,10 +44,23 @@ Standard device facts currently cover `state.water` (`wet` / `dry`) and
|
|
|
44
44
|
`state.smoke` (`detected` / `clear`). Other readings, including unknown/testing,
|
|
45
45
|
do not create an incident and do not resolve an existing incident. The small
|
|
46
46
|
retained device projection preserves the episode across restarts and Space
|
|
47
|
-
execution-mode migration. Its revision is owned by Attention, independent of
|
|
48
|
-
|
|
49
|
-
Twin
|
|
50
|
-
|
|
47
|
+
execution-mode migration. Its CAS revision is owned by Attention, independent of rebuildable Twin cache
|
|
48
|
+
counters. Source ingestion persists a bounded set of ordered facts before
|
|
49
|
+
replacing the Twin cache: latest report, latest detection and latest explicit
|
|
50
|
+
clear. Their sequence comes from the existing durable `nowAttention` increment
|
|
51
|
+
namespace. A delayed detection survives a newer unknown, but cannot supersede a
|
|
52
|
+
newer explicit clear. A delayed clear cannot remove a newer detection. Unknown
|
|
53
|
+
changes verification only. The incident ID remains stable until another clear
|
|
54
|
+
boundary is observed. Delayed notification delivery does not replay source facts.
|
|
55
|
+
|
|
56
|
+
List reconciliation only bootstraps an absent source record from canonical Twin
|
|
57
|
+
state, including retained-history recovery; a live source record wins a racing
|
|
58
|
+
bootstrap. Afterwards the durable source facts own lifecycle state. Device
|
|
59
|
+
metadata and retained episodes cover cold/missing caches. The portable Attention
|
|
60
|
+
payload contains `entityId`, `capabilityId`, and nullable `latest`, `detected`,
|
|
61
|
+
`cleared` observations (`sequence`, `timestamp`, `value`). Imports preserve the
|
|
62
|
+
source sequence floor as well as the separate CAS revision. This keeps source
|
|
63
|
+
ordering valid after a restart, a cache rebuild and execution-mode migration.
|
|
51
64
|
|
|
52
65
|
All timestamps are epoch milliseconds. `sourceUpdatedAt` is the underlying
|
|
53
66
|
state-change timestamp, not a heartbeat or proof of current connectivity.
|
|
@@ -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,
|
|
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}` |
|
|
@@ -56,17 +56,43 @@ observation and graph reads preserve their bounded business fields in Essential.
|
|
|
56
56
|
|
|
57
57
|
## UI-only reads
|
|
58
58
|
|
|
59
|
-
- `/app/device/view/get`, `{deviceId}`: `{deviceId, primaryViewId, views, widgets}`.
|
|
59
|
+
- `/app/device/view/get`, `{deviceId}`: `{deviceId, primaryViewId, views, widgets, twin}`.
|
|
60
60
|
Reads the unique hidden Device render definition, preserving exact Widget/Twin
|
|
61
61
|
bindings. Disabled devices can have empty definitions. Multiple anchors fail rather
|
|
62
|
-
than choosing an arbitrary visible Card. Widgets contain configuration, never values.
|
|
62
|
+
than choosing an arbitrary visible Card. Widgets contain configuration, never values. The optional `twin` metadata is
|
|
63
|
+
returned even when a known device has no render anchor.
|
|
63
64
|
- `/app/device/history/series/get`, `{deviceId, capabilityIds?: []}`:
|
|
64
65
|
`{deviceId, series}` with per-capability decoded `states`, `events`, `logs`. Empty
|
|
65
66
|
capability selection reads all series. This preserves chart structure; the shared
|
|
66
67
|
Device history Facade remains a bounded, merged business timeline.
|
|
67
68
|
- `/app/dashboard/canvas/content/get`, `{canvasId}`: Canvas metadata plus Cards' static
|
|
68
69
|
titles, view bindings, layouts, settings, metadata and selected Widget definitions.
|
|
69
|
-
|
|
70
|
+
Each entity Card includes the same `twin` metadata, loaded once per entity in the
|
|
71
|
+
batch. No observations, history, related automations or suggestions are loaded.
|
|
72
|
+
|
|
73
|
+
`twin` contains `entityId`, `entityType`, `integration`, `capabilities`,
|
|
74
|
+
`blueprintIds`, `attributes`, `available`, and optional `problem`. Attributes use canonical data capability IDs as
|
|
75
|
+
keys and preserve typed JSON values, including units, false, zero and empty arrays.
|
|
76
|
+
Only immutable entity-only data is cached here; mutable or parameterized data is
|
|
77
|
+
invoked explicitly when needed. These reads never fetch providers. A missing key
|
|
78
|
+
means no cached value is available, not a null/empty result. Group `available` is
|
|
79
|
+
true only for a ready definition whose runtime revision matches its Twin projection.
|
|
80
|
+
Applying/failed/mismatched projections return empty `attributes` and a `problem`,
|
|
81
|
+
while retaining identity and capability/Blueprint IDs for rendering. Clients disable
|
|
82
|
+
actions while unavailable, including retained Widget controls. This availability is
|
|
83
|
+
projection usability, not device reachability or on/off state. Retained observations
|
|
84
|
+
and history are not deleted by projection failure.
|
|
85
|
+
|
|
86
|
+
Ordinary source synchronization preserves immutable caches for unchanged entity
|
|
87
|
+
identity/connection/capabilities. Schema publication does not expire them. Explicit
|
|
88
|
+
device refresh rereads attributes and reconciles related Groups. These are write-side
|
|
89
|
+
operations; definition reads remain cache-only.
|
|
90
|
+
|
|
91
|
+
`/twin/entityUpdate` pushes `{scopeId, entityIds}` after cached metadata changes.
|
|
92
|
+
Open views refresh their definition batches; other Spaces and unrelated entities
|
|
93
|
+
are ignored. A new definition owns its capability membership: old observations
|
|
94
|
+
for removed capabilities must not be merged back into the current view. History
|
|
95
|
+
remains available through its separate read.
|
|
70
96
|
|
|
71
97
|
The frontend batches selected observations after reading definitions. Automation Cards
|
|
72
98
|
also read selected Automation definitions for their name and type. Canvas IDs are
|
|
@@ -88,9 +114,13 @@ pages use the shared definition, status and graph readers.
|
|
|
88
114
|
|
|
89
115
|
Widget detail uses an explicit public definition DTO on Core and cloud, including
|
|
90
116
|
revision and a boolean repeated flag. It excludes runtime value/next/nextTimestamp.
|
|
91
|
-
Essential omits
|
|
117
|
+
Essential omits global/baseId/steps/stepUnits; editable constraints,
|
|
92
118
|
options and complete Circadian schedules remain. Full preserves the full definition DTO.
|
|
93
119
|
History timestamps are epoch seconds; nextTimestamp and explicitly typed Timestamp
|
|
94
120
|
values are epoch milliseconds in Full. Essential presents these dates in the Home
|
|
95
121
|
IANA timezone, with UTC fallback for missing/invalid timezone configuration. Numeric
|
|
96
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
|
}
|