@condorinst/mobile-bridge 0.19.0 → 0.19.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/CHANGELOG.md CHANGED
@@ -7,6 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.19.1] — 2026-09-22
11
+
12
+ ### Changed
13
+
14
+ - **`limits.maxDevicesPerUser` now states the commercial rule without dressing
15
+ it up as a platform guarantee.** It was `null` with a note saying no cap
16
+ exists, which was accurate about the app and unhelpful about what a client
17
+ will actually see. It is now an object: `enforcedByApp: false`,
18
+ `currentProductLimit: 2`, and guidance saying explicitly not to hard-code
19
+ two.
20
+
21
+ The distinction is the whole point. The Canvas app enforces no cap — no code
22
+ path rejects a third device. A commercial rule currently limits a user to two
23
+ linked devices, and it can be raised with no change to this contract, to the
24
+ app, or to any version a client could check. A two-slot UI with the slots
25
+ hard-coded looks correct for as long as the rule holds and breaks silently on
26
+ the day it does not.
27
+
28
+ `docs/limits.md` and the `UserDevicePayload` TSDoc carry the same framing.
29
+
30
+
10
31
  ## [0.19.0] — 2026-09-22
11
32
 
12
33
  Documentation release: the package is now consumable by an AI agent building a
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "contractVersion": "0.19.0",
3
+ "contractVersion": "0.19.1",
4
4
  "description": "Machine-readable contract of the Condor Canvas JS<->Native bridge. It states what the TypeScript declarations in dist/index.d.ts cannot express: which keys and commands a sandboxed client can actually reach, which ones need human confirmation, where messages are dropped in silence, the hard limits, and which capability each native version carries. The TypeScript types remain canonical for payload shapes.",
5
5
  "audience": "Developers and AI agents building the client bundle that renders inside the Canvas Home.",
6
6
 
7
7
  "versions": {
8
8
  "note": "Four independent numbers coexist. Only nativeVersion tells you what the device can do.",
9
- "package": "0.19.0",
9
+ "package": "0.19.1",
10
10
  "shellVersion": "0.6.0",
11
11
  "clientProtocolVersion": "0.5.0",
12
12
  "nativeVersion": "0.16.0",
@@ -35,8 +35,12 @@
35
35
  "nativeVersionRelay": 2000
36
36
  },
37
37
  "presignedBundleUrlTtlSeconds": 86400,
38
- "maxDevicesPerUser": null,
39
- "maxDevicesPerUserNote": "Not enforced anywhere in the Canvas app. If a cap exists it is a backend/product rule. Do not assume one."
38
+ "maxDevicesPerUser": {
39
+ "enforcedByApp": false,
40
+ "currentProductLimit": 2,
41
+ "stability": "commercial rule, may change without a contract version bump",
42
+ "guidance": "Today a user can link at most two devices, so design for a short list rather than a virtualised one. Do NOT hard-code two: the cap is a commercial rule, not a platform invariant, and raising it requires no change to this contract or to the app. Render whatever userDevice delivers and read its length."
43
+ }
40
44
  },
41
45
 
42
46
  "storage": {
package/dist/index.d.cts CHANGED
@@ -233,7 +233,9 @@ interface PingPongPayload {
233
233
  * `toMap()` on the Dart side (device config, telemetry, user config), and
234
234
  * strict typing for them is deferred until a client needs it.
235
235
  *
236
- * There is no device cap in the app. Do not assume this list is bounded.
236
+ * The app enforces no device cap. A commercial rule currently limits a user to
237
+ * two linked devices, but that can change with no signal in this contract — read
238
+ * the length of the array rather than hard-coding it.
237
239
  */
238
240
  interface UserDevicePayload {
239
241
  lastUpdate: number;
package/dist/index.d.ts CHANGED
@@ -233,7 +233,9 @@ interface PingPongPayload {
233
233
  * `toMap()` on the Dart side (device config, telemetry, user config), and
234
234
  * strict typing for them is deferred until a client needs it.
235
235
  *
236
- * There is no device cap in the app. Do not assume this list is bounded.
236
+ * The app enforces no device cap. A commercial rule currently limits a user to
237
+ * two linked devices, but that can change with no signal in this contract — read
238
+ * the length of the array rather than hard-coding it.
237
239
  */
238
240
  interface UserDevicePayload {
239
241
  lastUpdate: number;
package/docs/limits.md CHANGED
@@ -104,8 +104,17 @@ Verified at `shell.template.html:28`.
104
104
 
105
105
  ## Devices
106
106
 
107
- There is **no device cap in the Canvas app**. A search for `maxDevices` or
108
- `deviceLimit` across the app returns nothing. If your product has a limit, it
109
- comes from the backend or from commercial terms — not from this platform. Do
110
- not hard-code one, and do not assume the roster you receive is complete or
111
- bounded.
107
+ Two things are true at once here, and conflating them is how this goes wrong.
108
+
109
+ **The platform enforces nothing.** A search for `maxDevices` or `deviceLimit`
110
+ across the Canvas app returns nothing. No code path rejects a third device.
111
+
112
+ **The current commercial rule caps a user at two linked devices.** That is a
113
+ product decision, not a platform invariant. It can be raised without any change
114
+ to this contract, to the app, or to a version number you could check.
115
+
116
+ So: design for a short list rather than a virtualised one — two cards will be
117
+ the common case — but **read the length of the roster you receive** and let the
118
+ layout grow. A two-slot UI with the slots hard-coded is the failure this section
119
+ exists to prevent: it will look correct for as long as the rule holds, and break
120
+ silently on the day it does not.
package/llms.txt CHANGED
@@ -7,7 +7,7 @@
7
7
  > pagination, permissions, system status and language.
8
8
 
9
9
  Every URL below is plain text over HTTPS, pinned to a released version, and
10
- needs no authentication. Replace `0.19.0` with the version you depend on; the
10
+ needs no authentication. Replace `0.19.1` with the version you depend on; the
11
11
  contract changes between minors while the package is below 1.0.0.
12
12
 
13
13
  The same files ship inside the npm tarball, so if you have run
@@ -16,27 +16,27 @@ The same files ship inside the npm tarball, so if you have run
16
16
 
17
17
  ## Start here
18
18
 
19
- - [AGENTS.md](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.0/AGENTS.md): The contract in one screen — hard rules, what is unreachable, and the validation loop. Read before writing code.
20
- - [Agent guide](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.0/docs/agent-guide.md): Step-by-step construction of a client Home, with the checks to run at each stage.
19
+ - [AGENTS.md](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.1/AGENTS.md): The contract in one screen — hard rules, what is unreachable, and the validation loop. Read before writing code.
20
+ - [Agent guide](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.1/docs/agent-guide.md): Step-by-step construction of a client Home, with the checks to run at each stage.
21
21
 
22
22
  ## Reference
23
23
 
24
- - [Bridge contract](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.0/docs/bridge-contract.md): Every observable key, every command, the three error shapes, and the capability matrix by native version.
25
- - [Machine-readable contract](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.0/contract/bridge-contract.json): The same contract as JSON. Also importable as `@condorinst/mobile-bridge/contract`.
26
- - [Limits](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.0/docs/limits.md): Every hard limit — payload size, rate limits, bundle size, timeouts — with what happens when you cross it.
27
- - [Troubleshooting](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.0/docs/troubleshooting.md): Why a command did nothing. Silence is the platform's dominant failure mode.
28
- - [TypeScript declarations](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.0/dist/index.d.ts): Authoritative payload shapes, with documentation on every member.
24
+ - [Bridge contract](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.1/docs/bridge-contract.md): Every observable key, every command, the three error shapes, and the capability matrix by native version.
25
+ - [Machine-readable contract](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.1/contract/bridge-contract.json): The same contract as JSON. Also importable as `@condorinst/mobile-bridge/contract`.
26
+ - [Limits](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.1/docs/limits.md): Every hard limit — payload size, rate limits, bundle size, timeouts — with what happens when you cross it.
27
+ - [Troubleshooting](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.1/docs/troubleshooting.md): Why a command did nothing. Silence is the platform's dominant failure mode.
28
+ - [TypeScript declarations](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.1/dist/index.d.ts): Authoritative payload shapes, with documentation on every member.
29
29
 
30
30
  ## Guides
31
31
 
32
- - [Client guide](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.0/docs/client-guide.md): Narrative walkthrough for a developer building the Home by hand.
33
- - [Pilot onboarding](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.0/docs/pilot-onboarding.md): Checklist from zero to a bundle delivered to Condor.
34
- - [README](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.0/README.md): Package overview, install, quickstart.
35
- - [CHANGELOG](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.0/CHANGELOG.md): When each capability was introduced. The most precise record of what a given native version supports.
32
+ - [Client guide](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.1/docs/client-guide.md): Narrative walkthrough for a developer building the Home by hand.
33
+ - [Pilot onboarding](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.1/docs/pilot-onboarding.md): Checklist from zero to a bundle delivered to Condor.
34
+ - [README](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.1/README.md): Package overview, install, quickstart.
35
+ - [CHANGELOG](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.1/CHANGELOG.md): When each capability was introduced. The most precise record of what a given native version supports.
36
36
 
37
37
  ## Examples
38
38
 
39
- - [Minimal home](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.0/examples/minimal-home/src/main.ts): A complete, working client in ~160 lines. Copy this as your starting point.
39
+ - [Minimal home](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.1/examples/minimal-home/src/main.ts): A complete, working client in ~160 lines. Copy this as your starting point.
40
40
 
41
41
  ## Optional
42
42
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@condorinst/mobile-bridge",
3
- "version": "0.19.0",
3
+ "version": "0.19.1",
4
4
  "description": "TypeScript SDK for the JS↔Native bridge of the Condor white-label mobile app.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "private": false,