@condorinst/mobile-bridge 0.19.0 → 0.19.2

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/AGENTS.md CHANGED
@@ -104,8 +104,9 @@ checking `nativeVersion`.
104
104
  depend on the bridge.
105
105
  - [ ] Every capability beyond the baseline is guarded by a `nativeVersion` check.
106
106
  - [ ] Nothing waits forever on an ack that may never come.
107
- - [ ] Tested in the browser with the mock (`npm run dev` in the example), where
108
- `nativeVersion` is `null` — your code must survive that.
107
+ - [ ] Tested in the browser with the mock (in the example: `npm run build`, then
108
+ open `dist/index.html`), where `nativeVersion` is `null` — your code must
109
+ survive that.
109
110
 
110
111
  ## Where to read more
111
112
 
package/CHANGELOG.md CHANGED
@@ -7,6 +7,48 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.19.2] — 2026-09-23
11
+
12
+ ### Fixed
13
+
14
+ - **`AGENTS.md` told you to run a script that does not exist.** The definition
15
+ of done asked for `npm run dev` in the example, but `examples/minimal-home`
16
+ only defines `build`, `bundle` and `typecheck`. It now describes the loop the
17
+ example itself documents: `npm run build`, then open `dist/index.html`, where
18
+ the SDK auto-enables mock mode.
19
+
20
+ ### Changed
21
+
22
+ - **The public repository no longer carries internal files.** The mirror step
23
+ used to publish everything it tracked except its own pipeline definition, so
24
+ the release runbook, the test suite and the lint/test configuration were all
25
+ public. It now excludes them by an explicit list, guarded so that renaming a
26
+ listed path fails the release instead of silently publishing it.
27
+ `tsconfig.json` and `tsup.config.ts` stay, because installing the package
28
+ straight from git builds it on `prepare` and cannot do so without them.
29
+ Nothing changes in the npm tarball, which never carried these files.
30
+
31
+ ## [0.19.1] — 2026-09-22
32
+
33
+ ### Changed
34
+
35
+ - **`limits.maxDevicesPerUser` now states the commercial rule without dressing
36
+ it up as a platform guarantee.** It was `null` with a note saying no cap
37
+ exists, which was accurate about the app and unhelpful about what a client
38
+ will actually see. It is now an object: `enforcedByApp: false`,
39
+ `currentProductLimit: 2`, and guidance saying explicitly not to hard-code
40
+ two.
41
+
42
+ The distinction is the whole point. The Canvas app enforces no cap — no code
43
+ path rejects a third device. A commercial rule currently limits a user to two
44
+ linked devices, and it can be raised with no change to this contract, to the
45
+ app, or to any version a client could check. A two-slot UI with the slots
46
+ hard-coded looks correct for as long as the rule holds and breaks silently on
47
+ the day it does not.
48
+
49
+ `docs/limits.md` and the `UserDevicePayload` TSDoc carry the same framing.
50
+
51
+
10
52
  ## [0.19.0] — 2026-09-22
11
53
 
12
54
  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.2",
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.2",
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": {
@@ -175,8 +179,8 @@
175
179
  "verifiedAgainst": {
176
180
  "monorepo": "condorinstprogdev/mobile_applications",
177
181
  "branch": "dev_canvas",
178
- "commit": "a6b19cd29704db241c29dd71b267f712610cb013",
179
- "verifiedOn": "2026-09-22",
182
+ "commit": "89fe1c792202ca9f066b84a63af44a6f2b993b52",
183
+ "verifiedOn": "2026-09-23",
180
184
  "sources": {
181
185
  "nativeVersion": "apps/canvas/lib/ui/pages/home/bridge/condor_bridge.dart:32",
182
186
  "jsToNativePayloadBytes": "apps/canvas/lib/ui/pages/home/bridge/condor_bridge.dart:88",
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.2` 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.2/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.2/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.2/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.2/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.2/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.2/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.2/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.2/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.2/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.2/README.md): Package overview, install, quickstart.
35
+ - [CHANGELOG](https://cdn.jsdelivr.net/npm/@condorinst/mobile-bridge@0.19.2/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.2/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.2",
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,