@bikefinder/sdk 0.1.3 → 0.1.4

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.
@@ -1260,6 +1260,99 @@ export declare const observationValueSchema: {
1260
1260
  readonly required: readonly ["qualifiedModules", "reason", "cooldownRemainingMs"];
1261
1261
  readonly additionalProperties: false;
1262
1262
  };
1263
+ readonly ChargingAllocationMember: {
1264
+ readonly type: "object";
1265
+ readonly properties: {
1266
+ readonly slot: {
1267
+ readonly type: "integer";
1268
+ readonly minimum: 0;
1269
+ readonly maximum: 7;
1270
+ };
1271
+ readonly target: {
1272
+ readonly anyOf: readonly [{
1273
+ readonly $ref: "#/$defs/ModuleSubject";
1274
+ }, {
1275
+ readonly type: "null";
1276
+ }];
1277
+ };
1278
+ readonly requestedInputMa: {
1279
+ readonly anyOf: readonly [{
1280
+ readonly type: "integer";
1281
+ readonly minimum: 0;
1282
+ readonly maximum: 800;
1283
+ }, {
1284
+ readonly type: "null";
1285
+ }];
1286
+ };
1287
+ readonly configuredInputMa: {
1288
+ readonly anyOf: readonly [{
1289
+ readonly type: "integer";
1290
+ readonly minimum: 0;
1291
+ readonly maximum: 800;
1292
+ }, {
1293
+ readonly type: "null";
1294
+ }];
1295
+ };
1296
+ readonly outputAcknowledged: {
1297
+ readonly type: "boolean";
1298
+ };
1299
+ readonly stopUncertain: {
1300
+ readonly type: "boolean";
1301
+ };
1302
+ readonly faultCode: {
1303
+ readonly type: "integer";
1304
+ readonly minimum: 0;
1305
+ readonly maximum: 255;
1306
+ };
1307
+ readonly faultAttempts: {
1308
+ readonly type: "integer";
1309
+ readonly minimum: 0;
1310
+ readonly maximum: 255;
1311
+ };
1312
+ readonly faultGate: {
1313
+ readonly type: "string";
1314
+ readonly enum: readonly ["clear", "cooldown", "latched", "recheck"];
1315
+ };
1316
+ readonly cooldownRemainingMs: {
1317
+ readonly anyOf: readonly [{
1318
+ readonly type: "integer";
1319
+ readonly minimum: 0;
1320
+ readonly maximum: 9007199254740991;
1321
+ }, {
1322
+ readonly type: "null";
1323
+ }];
1324
+ };
1325
+ };
1326
+ readonly required: readonly ["slot", "target", "requestedInputMa", "configuredInputMa", "outputAcknowledged", "stopUncertain", "faultCode", "faultAttempts", "faultGate", "cooldownRemainingMs"];
1327
+ readonly additionalProperties: false;
1328
+ };
1329
+ readonly ChargingPowerReservation: {
1330
+ readonly type: "object";
1331
+ readonly properties: {
1332
+ readonly moduleId: {
1333
+ readonly type: "string";
1334
+ readonly minLength: 16;
1335
+ readonly maxLength: 16;
1336
+ readonly pattern: "^[0-9a-f]*$";
1337
+ };
1338
+ readonly inputMa: {
1339
+ readonly anyOf: readonly [{
1340
+ readonly type: "integer";
1341
+ readonly minimum: 0;
1342
+ readonly maximum: 800;
1343
+ }, {
1344
+ readonly type: "null";
1345
+ }];
1346
+ };
1347
+ readonly remainingMs: {
1348
+ readonly type: "integer";
1349
+ readonly minimum: 0;
1350
+ readonly maximum: 9007199254740991;
1351
+ };
1352
+ };
1353
+ readonly required: readonly ["moduleId", "inputMa", "remainingMs"];
1354
+ readonly additionalProperties: false;
1355
+ };
1263
1356
  };
1264
1357
  readonly properties: {
1265
1358
  readonly "agnss.completed": {
@@ -1691,11 +1784,53 @@ export declare const observationValueSchema: {
1691
1784
  readonly type: "null";
1692
1785
  }];
1693
1786
  };
1787
+ readonly guard: {
1788
+ readonly anyOf: readonly [{
1789
+ readonly type: "object";
1790
+ readonly properties: {
1791
+ readonly authorized: {
1792
+ readonly type: "boolean";
1793
+ };
1794
+ readonly outputEnabled: {
1795
+ readonly type: "boolean";
1796
+ };
1797
+ readonly remainingMs: {
1798
+ readonly type: "integer";
1799
+ readonly minimum: 0;
1800
+ readonly maximum: 4294967295000;
1801
+ };
1802
+ readonly inhibitReasons: {
1803
+ readonly type: "integer";
1804
+ readonly minimum: 0;
1805
+ readonly maximum: 4294967295;
1806
+ };
1807
+ readonly policyRevision: {
1808
+ readonly type: "integer";
1809
+ readonly minimum: 0;
1810
+ readonly maximum: 4294967295;
1811
+ };
1812
+ readonly authorizedSample: {
1813
+ readonly type: "integer";
1814
+ readonly minimum: 0;
1815
+ readonly maximum: 4294967295;
1816
+ };
1817
+ readonly bootGeneration: {
1818
+ readonly type: "integer";
1819
+ readonly minimum: 0;
1820
+ readonly maximum: 4294967295;
1821
+ };
1822
+ };
1823
+ readonly required: readonly ["authorized", "outputEnabled", "remainingMs", "inhibitReasons", "policyRevision", "authorizedSample", "bootGeneration"];
1824
+ readonly additionalProperties: false;
1825
+ }, {
1826
+ readonly type: "null";
1827
+ }];
1828
+ };
1694
1829
  };
1695
- readonly required: readonly ["state", "fault", "inputValidated", "voltageRegulationActive"];
1830
+ readonly required: readonly ["state", "fault", "inputValidated", "voltageRegulationActive", "guard"];
1696
1831
  readonly additionalProperties: false;
1697
1832
  readonly title: "Battery module charger status";
1698
- readonly description: "State/fault are one hardware status. Optional supply fields require evidence from the same validated transaction; never fill them from older cache entries.";
1833
+ readonly description: "State/fault and optional local MSP charging guard are one coherent hardware snapshot. Guard reports permission, actual output, remaining authorization at capture, local inhibit reasons and safety-policy/boot generations. Null on legacy modules. Supply/guard fields must never borrow older cache entries.";
1699
1834
  readonly "x-bf": {
1700
1835
  readonly definitionId: 8;
1701
1836
  readonly role: "state";
@@ -1703,7 +1838,7 @@ export declare const observationValueSchema: {
1703
1838
  readonly producer: "device";
1704
1839
  readonly presentation: {
1705
1840
  readonly displayName: "Battery module charger status";
1706
- readonly description: "State/fault are one hardware status. Optional supply fields require evidence from the same validated transaction; never fill them from older cache entries.";
1841
+ readonly description: "State/fault and optional local MSP charging guard are one coherent hardware snapshot. Guard reports permission, actual output, remaining authorization at capture, local inhibit reasons and safety-policy/boot generations. Null on legacy modules. Supply/guard fields must never borrow older cache entries.";
1707
1842
  readonly hiddenByDefault: false;
1708
1843
  readonly formatter: "status";
1709
1844
  };
@@ -5494,6 +5629,283 @@ export declare const observationValueSchema: {
5494
5629
  };
5495
5630
  };
5496
5631
  };
5632
+ readonly "battery.protocolIdentity": {
5633
+ readonly type: "object";
5634
+ readonly properties: {
5635
+ readonly moduleId: {
5636
+ readonly type: "string";
5637
+ readonly minLength: 16;
5638
+ readonly maxLength: 16;
5639
+ readonly pattern: "^[0-9a-f]*$";
5640
+ };
5641
+ readonly bootGeneration: {
5642
+ readonly type: "integer";
5643
+ readonly minimum: 0;
5644
+ readonly maximum: 4294967295;
5645
+ };
5646
+ readonly capabilities: {
5647
+ readonly type: "string";
5648
+ readonly minLength: 16;
5649
+ readonly maxLength: 16;
5650
+ readonly pattern: "^[0-9a-f]*$";
5651
+ };
5652
+ readonly hardwareRevision: {
5653
+ readonly anyOf: readonly [{
5654
+ readonly type: "integer";
5655
+ readonly minimum: 0;
5656
+ readonly maximum: 65535;
5657
+ }, {
5658
+ readonly type: "null";
5659
+ }];
5660
+ };
5661
+ readonly resetReason: {
5662
+ readonly anyOf: readonly [{
5663
+ readonly type: "integer";
5664
+ readonly minimum: 0;
5665
+ readonly maximum: 65535;
5666
+ }, {
5667
+ readonly type: "null";
5668
+ }];
5669
+ };
5670
+ };
5671
+ readonly required: readonly ["moduleId", "bootGeneration", "capabilities", "hardwareRevision", "resetReason"];
5672
+ readonly additionalProperties: false;
5673
+ readonly title: "battery.protocolIdentity";
5674
+ readonly description: "Accepted HELLO identity and metadata for this raw route. Optional unavailable metadata is null. Relay headers are not module identity evidence.";
5675
+ readonly "x-bf": {
5676
+ readonly definitionId: 161;
5677
+ readonly role: "state";
5678
+ readonly subject: "batteryRoute";
5679
+ readonly producer: "device";
5680
+ readonly presentation: {
5681
+ readonly displayName: "battery.protocolIdentity";
5682
+ readonly description: "Accepted HELLO identity and metadata for this raw route. Optional unavailable metadata is null. Relay headers are not module identity evidence.";
5683
+ readonly hiddenByDefault: true;
5684
+ readonly formatter: "fields";
5685
+ readonly fields: readonly [{
5686
+ readonly path: "moduleId";
5687
+ }, {
5688
+ readonly path: "bootGeneration";
5689
+ }, {
5690
+ readonly path: "capabilities";
5691
+ }, {
5692
+ readonly path: "hardwareRevision";
5693
+ }, {
5694
+ readonly path: "resetReason";
5695
+ }];
5696
+ };
5697
+ };
5698
+ };
5699
+ readonly "battery.protocolExchange": {
5700
+ readonly type: "object";
5701
+ readonly properties: {
5702
+ readonly operation: {
5703
+ readonly type: "integer";
5704
+ readonly minimum: 0;
5705
+ readonly maximum: 65535;
5706
+ };
5707
+ readonly elapsedMs: {
5708
+ readonly type: "integer";
5709
+ readonly minimum: 0;
5710
+ readonly maximum: 4294967295;
5711
+ };
5712
+ readonly transportError: {
5713
+ readonly type: "integer";
5714
+ readonly minimum: -2147483648;
5715
+ readonly maximum: 2147483647;
5716
+ };
5717
+ readonly status: {
5718
+ readonly anyOf: readonly [{
5719
+ readonly type: "integer";
5720
+ readonly minimum: 0;
5721
+ readonly maximum: 65535;
5722
+ }, {
5723
+ readonly type: "null";
5724
+ }];
5725
+ };
5726
+ readonly bootGeneration: {
5727
+ readonly anyOf: readonly [{
5728
+ readonly type: "integer";
5729
+ readonly minimum: 0;
5730
+ readonly maximum: 4294967295;
5731
+ }, {
5732
+ readonly type: "null";
5733
+ }];
5734
+ };
5735
+ };
5736
+ readonly required: readonly ["operation", "elapsedMs", "transportError", "status", "bootGeneration"];
5737
+ readonly additionalProperties: false;
5738
+ readonly title: "battery.protocolExchange";
5739
+ readonly description: "Last protocol envelope exchange. Transport/framing/correlation errors are distinct from the matched MSP result. No request or response payload bytes are retained. Operation-body validity is checked separately by the typed consumer.";
5740
+ readonly "x-bf": {
5741
+ readonly definitionId: 162;
5742
+ readonly role: "state";
5743
+ readonly subject: "batteryRoute";
5744
+ readonly producer: "device";
5745
+ readonly presentation: {
5746
+ readonly displayName: "battery.protocolExchange";
5747
+ readonly description: "Last protocol envelope exchange. Transport/framing/correlation errors are distinct from the matched MSP result. No request or response payload bytes are retained. Operation-body validity is checked separately by the typed consumer.";
5748
+ readonly hiddenByDefault: true;
5749
+ readonly formatter: "fields";
5750
+ readonly fields: readonly [{
5751
+ readonly path: "operation";
5752
+ }, {
5753
+ readonly path: "elapsedMs";
5754
+ readonly format: "duration";
5755
+ }, {
5756
+ readonly path: "transportError";
5757
+ }, {
5758
+ readonly path: "status";
5759
+ }, {
5760
+ readonly path: "bootGeneration";
5761
+ }];
5762
+ };
5763
+ };
5764
+ };
5765
+ readonly "battery.updateHealth": {
5766
+ readonly type: "object";
5767
+ readonly properties: {
5768
+ readonly requestId: {
5769
+ readonly type: "integer";
5770
+ readonly minimum: 0;
5771
+ readonly maximum: 4294967295;
5772
+ };
5773
+ readonly slot: {
5774
+ readonly type: "integer";
5775
+ readonly minimum: 0;
5776
+ readonly maximum: 31;
5777
+ };
5778
+ readonly target: {
5779
+ readonly $ref: "#/$defs/ModuleSubject";
5780
+ };
5781
+ readonly imageInstalled: {
5782
+ readonly type: "boolean";
5783
+ };
5784
+ readonly state: {
5785
+ readonly type: "string";
5786
+ readonly enum: readonly ["operational", "failed", "unsupported"];
5787
+ };
5788
+ readonly error: {
5789
+ readonly type: "integer";
5790
+ readonly minimum: -2147483648;
5791
+ readonly maximum: 2147483647;
5792
+ };
5793
+ readonly bootGeneration: {
5794
+ readonly anyOf: readonly [{
5795
+ readonly type: "integer";
5796
+ readonly minimum: 0;
5797
+ readonly maximum: 4294967295;
5798
+ }, {
5799
+ readonly type: "null";
5800
+ }];
5801
+ };
5802
+ };
5803
+ readonly required: readonly ["requestId", "slot", "target", "imageInstalled", "state", "error", "bootGeneration"];
5804
+ readonly additionalProperties: false;
5805
+ readonly title: "battery.updateHealth";
5806
+ readonly description: "Operational verification after a completed MSP installation and LTE restart. Installation completion does not imply operational health. A failed health check never rearms image installation or consumes another flash attempt.";
5807
+ readonly "x-bf": {
5808
+ readonly definitionId: 163;
5809
+ readonly role: "state";
5810
+ readonly subject: "device";
5811
+ readonly producer: "device";
5812
+ readonly presentation: {
5813
+ readonly displayName: "battery.updateHealth";
5814
+ readonly description: "Operational verification after a completed MSP installation and LTE restart. Installation completion does not imply operational health. A failed health check never rearms image installation or consumes another flash attempt.";
5815
+ readonly hiddenByDefault: true;
5816
+ readonly formatter: "fields";
5817
+ readonly fields: readonly [{
5818
+ readonly path: "requestId";
5819
+ }, {
5820
+ readonly path: "slot";
5821
+ }, {
5822
+ readonly path: "imageInstalled";
5823
+ }, {
5824
+ readonly path: "state";
5825
+ }, {
5826
+ readonly path: "error";
5827
+ }, {
5828
+ readonly path: "bootGeneration";
5829
+ }];
5830
+ };
5831
+ };
5832
+ };
5833
+ readonly "battery.charging.allocations": {
5834
+ readonly type: "object";
5835
+ readonly properties: {
5836
+ readonly inventoryConfirmed: {
5837
+ readonly type: "boolean";
5838
+ };
5839
+ readonly held: {
5840
+ readonly type: "boolean";
5841
+ };
5842
+ readonly inputBudgetMa: {
5843
+ readonly type: "integer";
5844
+ readonly minimum: 0;
5845
+ readonly maximum: 65535;
5846
+ };
5847
+ readonly maximumChargers: {
5848
+ readonly type: "integer";
5849
+ readonly minimum: 0;
5850
+ readonly maximum: 8;
5851
+ };
5852
+ readonly reason: {
5853
+ readonly type: "string";
5854
+ readonly enum: readonly ["none", "disabled", "detached", "unknownInput", "notReady", "communication", "stale", "thermal", "cable", "full", "overcurrent", "maintenance", "chargerFault", "allocationBudget"];
5855
+ };
5856
+ readonly modules: {
5857
+ readonly type: "array";
5858
+ readonly items: {
5859
+ readonly $ref: "#/$defs/ChargingAllocationMember";
5860
+ };
5861
+ readonly minItems: 0;
5862
+ readonly maxItems: 8;
5863
+ };
5864
+ readonly reservations: {
5865
+ readonly anyOf: readonly [{
5866
+ readonly type: "array";
5867
+ readonly items: {
5868
+ readonly $ref: "#/$defs/ChargingPowerReservation";
5869
+ };
5870
+ readonly minItems: 0;
5871
+ readonly maxItems: 8;
5872
+ }, {
5873
+ readonly type: "null";
5874
+ }];
5875
+ };
5876
+ };
5877
+ readonly required: readonly ["inventoryConfirmed", "held", "inputBudgetMa", "maximumChargers", "reason", "modules", "reservations"];
5878
+ readonly additionalProperties: false;
5879
+ readonly title: "Charging allocation decisions";
5880
+ readonly description: "LTE allocation intent and acknowledged output, not proof of actual current flow. Reports stopped fault gates and physical-identity power reservations, including unreachable modules and lost acknowledgements. Remaining durations freeze at capture; use observation age. A null reservation list is unavailable, not empty. Reads perform no UART I/O and never retire or renew a reservation.";
5881
+ readonly "x-bf": {
5882
+ readonly definitionId: 164;
5883
+ readonly role: "state";
5884
+ readonly subject: "device";
5885
+ readonly producer: "device";
5886
+ readonly presentation: {
5887
+ readonly displayName: "Charging allocation decisions";
5888
+ readonly hiddenByDefault: true;
5889
+ readonly description: "LTE allocation intent and acknowledged output, not proof of actual current flow. Reports stopped fault gates and physical-identity power reservations, including unreachable modules and lost acknowledgements. Remaining durations freeze at capture; use observation age. A null reservation list is unavailable, not empty. Reads perform no UART I/O and never retire or renew a reservation.";
5890
+ readonly formatter: "fields";
5891
+ readonly fields: readonly [{
5892
+ readonly path: "held";
5893
+ }, {
5894
+ readonly path: "reason";
5895
+ }, {
5896
+ readonly path: "inputBudgetMa";
5897
+ }, {
5898
+ readonly path: "maximumChargers";
5899
+ }, {
5900
+ readonly path: "modules";
5901
+ readonly format: "count";
5902
+ }, {
5903
+ readonly path: "reservations";
5904
+ readonly format: "count";
5905
+ }];
5906
+ };
5907
+ };
5908
+ };
5497
5909
  };
5498
5910
  };
5499
5911
  export declare const settingsValueSchema: {
@@ -5687,13 +6099,10 @@ export declare const settingsValueSchema: {
5687
6099
  readonly title: "BLE advertising";
5688
6100
  readonly description: "Enable advertising according to the independent BLE power policy. Wi-Fi scans and updates temporarily borrow the radio.";
5689
6101
  };
5690
- readonly bleAdvertisingPower: {
5691
- readonly type: "integer";
5692
- readonly minimum: 0;
5693
- readonly maximum: 1;
5694
- readonly enum: readonly [0, 1];
5695
- readonly title: "BLE advertising power";
5696
- readonly description: "0 allows advertising on any power source. 1 requires confirmed external power, including a full battery that remains plugged in.";
6102
+ readonly bleAdvertisingRequiresExternalPower: {
6103
+ readonly type: "boolean";
6104
+ readonly title: "BLE advertising requires external power";
6105
+ readonly description: "When true, advertise only with confirmed external power, including a full battery that remains plugged in. When false, allow advertising on battery too.";
5697
6106
  };
5698
6107
  readonly bleAdvertisingIntervalUnits: {
5699
6108
  readonly type: "integer";
@@ -5883,11 +6292,73 @@ export declare const settingsValueSchema: {
5883
6292
  readonly title: "Hot shutdown recovery temperature";
5884
6293
  readonly description: "After a high-temperature shutdown, resume only at or below this temperature. Order: cold stop < cold stop recovery <= cold limit < cold limit recovery <= warm limit recovery < warm limit <= hot stop recovery < hot stop.";
5885
6294
  };
6295
+ readonly chargingLeaseSeconds: {
6296
+ readonly type: "integer";
6297
+ readonly minimum: 1;
6298
+ readonly maximum: 4294967295;
6299
+ readonly title: "MSP charging allocation lease";
6300
+ readonly description: "Maximum charging allocation duration for an MSP with autonomous local safety and charger watchdog service. LTE retains shared power reservations through communication loss until verified stopped or expired. Installed MSPs retain their existing supervision.";
6301
+ };
6302
+ readonly wifiTimeoutSeconds: {
6303
+ readonly type: "integer";
6304
+ readonly minimum: 1;
6305
+ readonly maximum: 120;
6306
+ readonly title: "Wi-Fi acquisition timeout";
6307
+ readonly description: "Maximum time for one admitted Wi-Fi acquisition, including ESP startup and result delivery. The requesting operation deadline can end it sooner. Applies to installed and configurable ESP scan protocols.";
6308
+ };
6309
+ readonly wifiScanActiveMinMs: {
6310
+ readonly type: "integer";
6311
+ readonly minimum: 1;
6312
+ readonly maximum: 1500;
6313
+ readonly title: "Wi-Fi active scan minimum dwell";
6314
+ readonly description: "Minimum active scan dwell per channel. Must not exceed wifiScanActiveMaxMs. Requires ESP 10.2.1 or later; older or unknown ESP versions retain their native scan.";
6315
+ };
6316
+ readonly wifiScanActiveMaxMs: {
6317
+ readonly type: "integer";
6318
+ readonly minimum: 1;
6319
+ readonly maximum: 1500;
6320
+ readonly title: "Wi-Fi active scan maximum dwell";
6321
+ readonly description: "Maximum active scan dwell per channel. Must be at least wifiScanActiveMinMs. Requires ESP 10.2.1 or later; older or unknown ESP versions retain their native scan.";
6322
+ };
6323
+ readonly wifiScanPassiveMs: {
6324
+ readonly type: "integer";
6325
+ readonly minimum: 1;
6326
+ readonly maximum: 1500;
6327
+ readonly title: "Wi-Fi passive scan dwell";
6328
+ readonly description: "Passive scan dwell per channel. Used only for passive scans. Requires ESP 10.2.1 or later; older or unknown ESP versions retain their native scan.";
6329
+ };
6330
+ readonly wifiScanChannelMask: {
6331
+ readonly type: "integer";
6332
+ readonly minimum: 0;
6333
+ readonly maximum: 16383;
6334
+ readonly title: "Wi-Fi scan channels";
6335
+ readonly description: "Channel bitmask: bit 0 is channel 1, bit 13 is channel 14. Zero selects all permitted channels. Intersected with ESP regulatory channels. Requires ESP 10.2.1 or later.";
6336
+ };
6337
+ readonly wifiScanBudgetMs: {
6338
+ readonly type: "integer";
6339
+ readonly minimum: 100;
6340
+ readonly maximum: 60000;
6341
+ readonly title: "Wi-Fi scan budget";
6342
+ readonly description: "ESP initialization and scan budget, excluding result delivery. Limited by the remaining LTE acquisition deadline. Requires ESP 10.2.1 or later; older or unknown ESP versions retain their native scan.";
6343
+ };
6344
+ readonly wifiScanType: {
6345
+ readonly type: "string";
6346
+ readonly enum: readonly ["active", "passive"];
6347
+ readonly title: "Wi-Fi scan type";
6348
+ readonly description: "Choose active probing or passive listening. Requires ESP 10.2.1 or later; older or unknown ESP versions retain their native scan.";
6349
+ };
6350
+ readonly chargingStatusMaxAgeSeconds: {
6351
+ readonly type: "integer";
6352
+ readonly minimum: 30;
6353
+ readonly maximum: 86400;
6354
+ readonly title: "Charging status maximum age";
6355
+ readonly description: "Maximum age of charger readback used for the reported charging status. Independent of charging-control safety deadlines; does not authorize charging or schedule extra hardware reads. Confirmed input loss still reports not charging immediately.";
6356
+ };
5886
6357
  };
5887
6358
  readonly "x-bf": {
5888
6359
  readonly domain: "settings";
5889
6360
  readonly version: 1;
5890
- readonly settingsSchemaVersion: 24;
6361
+ readonly settingsSchemaVersion: 27;
5891
6362
  };
5892
6363
  };
5893
6364
  export declare const observationDefinitions: readonly [{
@@ -6032,7 +6503,7 @@ export declare const observationDefinitions: readonly [{
6032
6503
  readonly producer: "device";
6033
6504
  readonly presentation: {
6034
6505
  readonly displayName: "Battery module charger status";
6035
- readonly description: "State/fault are one hardware status. Optional supply fields require evidence from the same validated transaction; never fill them from older cache entries.";
6506
+ readonly description: "State/fault and optional local MSP charging guard are one coherent hardware snapshot. Guard reports permission, actual output, remaining authorization at capture, local inhibit reasons and safety-policy/boot generations. Null on legacy modules. Supply/guard fields must never borrow older cache entries.";
6036
6507
  readonly hiddenByDefault: false;
6037
6508
  readonly formatter: "status";
6038
6509
  };
@@ -7964,6 +8435,105 @@ export declare const observationDefinitions: readonly [{
7964
8435
  readonly format: "duration";
7965
8436
  }];
7966
8437
  };
8438
+ }, {
8439
+ readonly id: 161;
8440
+ readonly name: "battery.protocolIdentity";
8441
+ readonly role: "state";
8442
+ readonly subject: "batteryRoute";
8443
+ readonly producer: "device";
8444
+ readonly presentation: {
8445
+ readonly displayName: "battery.protocolIdentity";
8446
+ readonly description: "Accepted HELLO identity and metadata for this raw route. Optional unavailable metadata is null. Relay headers are not module identity evidence.";
8447
+ readonly hiddenByDefault: true;
8448
+ readonly formatter: "fields";
8449
+ readonly fields: readonly [{
8450
+ readonly path: "moduleId";
8451
+ }, {
8452
+ readonly path: "bootGeneration";
8453
+ }, {
8454
+ readonly path: "capabilities";
8455
+ }, {
8456
+ readonly path: "hardwareRevision";
8457
+ }, {
8458
+ readonly path: "resetReason";
8459
+ }];
8460
+ };
8461
+ }, {
8462
+ readonly id: 162;
8463
+ readonly name: "battery.protocolExchange";
8464
+ readonly role: "state";
8465
+ readonly subject: "batteryRoute";
8466
+ readonly producer: "device";
8467
+ readonly presentation: {
8468
+ readonly displayName: "battery.protocolExchange";
8469
+ readonly description: "Last protocol envelope exchange. Transport/framing/correlation errors are distinct from the matched MSP result. No request or response payload bytes are retained. Operation-body validity is checked separately by the typed consumer.";
8470
+ readonly hiddenByDefault: true;
8471
+ readonly formatter: "fields";
8472
+ readonly fields: readonly [{
8473
+ readonly path: "operation";
8474
+ }, {
8475
+ readonly path: "elapsedMs";
8476
+ readonly format: "duration";
8477
+ }, {
8478
+ readonly path: "transportError";
8479
+ }, {
8480
+ readonly path: "status";
8481
+ }, {
8482
+ readonly path: "bootGeneration";
8483
+ }];
8484
+ };
8485
+ }, {
8486
+ readonly id: 163;
8487
+ readonly name: "battery.updateHealth";
8488
+ readonly role: "state";
8489
+ readonly subject: "device";
8490
+ readonly producer: "device";
8491
+ readonly presentation: {
8492
+ readonly displayName: "battery.updateHealth";
8493
+ readonly description: "Operational verification after a completed MSP installation and LTE restart. Installation completion does not imply operational health. A failed health check never rearms image installation or consumes another flash attempt.";
8494
+ readonly hiddenByDefault: true;
8495
+ readonly formatter: "fields";
8496
+ readonly fields: readonly [{
8497
+ readonly path: "requestId";
8498
+ }, {
8499
+ readonly path: "slot";
8500
+ }, {
8501
+ readonly path: "imageInstalled";
8502
+ }, {
8503
+ readonly path: "state";
8504
+ }, {
8505
+ readonly path: "error";
8506
+ }, {
8507
+ readonly path: "bootGeneration";
8508
+ }];
8509
+ };
8510
+ }, {
8511
+ readonly id: 164;
8512
+ readonly name: "battery.charging.allocations";
8513
+ readonly role: "state";
8514
+ readonly subject: "device";
8515
+ readonly producer: "device";
8516
+ readonly presentation: {
8517
+ readonly displayName: "Charging allocation decisions";
8518
+ readonly hiddenByDefault: true;
8519
+ readonly description: "LTE allocation intent and acknowledged output, not proof of actual current flow. Reports stopped fault gates and physical-identity power reservations, including unreachable modules and lost acknowledgements. Remaining durations freeze at capture; use observation age. A null reservation list is unavailable, not empty. Reads perform no UART I/O and never retire or renew a reservation.";
8520
+ readonly formatter: "fields";
8521
+ readonly fields: readonly [{
8522
+ readonly path: "held";
8523
+ }, {
8524
+ readonly path: "reason";
8525
+ }, {
8526
+ readonly path: "inputBudgetMa";
8527
+ }, {
8528
+ readonly path: "maximumChargers";
8529
+ }, {
8530
+ readonly path: "modules";
8531
+ readonly format: "count";
8532
+ }, {
8533
+ readonly path: "reservations";
8534
+ readonly format: "count";
8535
+ }];
8536
+ };
7967
8537
  }];
7968
8538
  export type OperationOutcome = "success" | "empty" | "partial" | "timeout" | "failed" | "cancelled" | "budgetExhausted" | "skipped";
7969
8539
  export type ModuleSubject = string;
@@ -8534,6 +9104,10 @@ export interface ObservationValues {
8534
9104
  "workflow.execution"?: WorkflowExecution;
8535
9105
  "battery.module.chargeCompleted"?: BatteryModuleChargeCompleted;
8536
9106
  "battery.module.chargeRested"?: BatteryModuleChargeRested;
9107
+ "battery.protocolIdentity"?: BatteryProtocolIdentity;
9108
+ "battery.protocolExchange"?: BatteryProtocolExchange;
9109
+ "battery.updateHealth"?: BatteryUpdateHealth;
9110
+ "battery.charging.allocations"?: ChargingAllocationDecisions;
8537
9111
  }
8538
9112
  /**
8539
9113
  * A single assistance exchange outcome; later fix latency is new search evidence, not a mutation of this completed record.
@@ -8650,13 +9224,22 @@ export interface InventoryMember {
8650
9224
  hardwareId: string | null;
8651
9225
  }
8652
9226
  /**
8653
- * State/fault are one hardware status. Optional supply fields require evidence from the same validated transaction; never fill them from older cache entries.
9227
+ * State/fault and optional local MSP charging guard are one coherent hardware snapshot. Guard reports permission, actual output, remaining authorization at capture, local inhibit reasons and safety-policy/boot generations. Null on legacy modules. Supply/guard fields must never borrow older cache entries.
8654
9228
  */
8655
9229
  export interface BatteryModuleChargerStatus {
8656
9230
  state: "ready" | "charging" | "full" | "fault";
8657
9231
  fault: number;
8658
9232
  inputValidated: boolean | null;
8659
9233
  voltageRegulationActive: boolean | null;
9234
+ guard: {
9235
+ authorized: boolean;
9236
+ outputEnabled: boolean;
9237
+ remainingMs: number;
9238
+ inhibitReasons: number;
9239
+ policyRevision: number;
9240
+ authorizedSample: number;
9241
+ bootGeneration: number;
9242
+ } | null;
8660
9243
  }
8661
9244
  /**
8662
9245
  * Version and confidence are inseparable; relay headers do not prove remote firmware identity.
@@ -9163,6 +9746,71 @@ export interface BatteryModuleChargeRested {
9163
9746
  afterStopMs: number;
9164
9747
  sinceCompletionMs: number;
9165
9748
  }
9749
+ /**
9750
+ * Accepted HELLO identity and metadata for this raw route. Optional unavailable metadata is null. Relay headers are not module identity evidence.
9751
+ */
9752
+ export interface BatteryProtocolIdentity {
9753
+ moduleId: string;
9754
+ bootGeneration: number;
9755
+ capabilities: string;
9756
+ hardwareRevision: number | null;
9757
+ resetReason: number | null;
9758
+ }
9759
+ /**
9760
+ * Last protocol envelope exchange. Transport/framing/correlation errors are distinct from the matched MSP result. No request or response payload bytes are retained. Operation-body validity is checked separately by the typed consumer.
9761
+ */
9762
+ export interface BatteryProtocolExchange {
9763
+ operation: number;
9764
+ elapsedMs: number;
9765
+ transportError: number;
9766
+ status: number | null;
9767
+ bootGeneration: number | null;
9768
+ }
9769
+ /**
9770
+ * Operational verification after a completed MSP installation and LTE restart. Installation completion does not imply operational health. A failed health check never rearms image installation or consumes another flash attempt.
9771
+ */
9772
+ export interface BatteryUpdateHealth {
9773
+ requestId: number;
9774
+ slot: number;
9775
+ target: ModuleSubject;
9776
+ imageInstalled: boolean;
9777
+ state: "operational" | "failed" | "unsupported";
9778
+ error: number;
9779
+ bootGeneration: number | null;
9780
+ }
9781
+ /**
9782
+ * LTE allocation intent and acknowledged output, not proof of actual current flow. Reports stopped fault gates and physical-identity power reservations, including unreachable modules and lost acknowledgements. Remaining durations freeze at capture; use observation age. A null reservation list is unavailable, not empty. Reads perform no UART I/O and never retire or renew a reservation.
9783
+ */
9784
+ export interface ChargingAllocationDecisions {
9785
+ inventoryConfirmed: boolean;
9786
+ held: boolean;
9787
+ inputBudgetMa: number;
9788
+ maximumChargers: number;
9789
+ reason: "none" | "disabled" | "detached" | "unknownInput" | "notReady" | "communication" | "stale" | "thermal" | "cable" | "full" | "overcurrent" | "maintenance" | "chargerFault" | "allocationBudget";
9790
+ /**
9791
+ * @minItems 0
9792
+ * @maxItems 8
9793
+ */
9794
+ modules: ChargingAllocationMember[];
9795
+ reservations: ChargingPowerReservation[] | null;
9796
+ }
9797
+ export interface ChargingAllocationMember {
9798
+ slot: number;
9799
+ target: ModuleSubject | null;
9800
+ requestedInputMa: number | null;
9801
+ configuredInputMa: number | null;
9802
+ outputAcknowledged: boolean;
9803
+ stopUncertain: boolean;
9804
+ faultCode: number;
9805
+ faultAttempts: number;
9806
+ faultGate: "clear" | "cooldown" | "latched" | "recheck";
9807
+ cooldownRemainingMs: number | null;
9808
+ }
9809
+ export interface ChargingPowerReservation {
9810
+ moduleId: string;
9811
+ inputMa: number | null;
9812
+ remainingMs: number;
9813
+ }
9166
9814
  /**
9167
9815
  * Interval between battery measurements, in seconds.
9168
9816
  */
@@ -9280,9 +9928,9 @@ export type I2CIdlePowerSaving = boolean;
9280
9928
  */
9281
9929
  export type BLEAdvertising = boolean;
9282
9930
  /**
9283
- * 0 allows advertising on any power source. 1 requires confirmed external power, including a full battery that remains plugged in.
9931
+ * When true, advertise only with confirmed external power, including a full battery that remains plugged in. When false, allow advertising on battery too.
9284
9932
  */
9285
- export type BLEAdvertisingPower = 0 | 1;
9933
+ export type BLEAdvertisingRequiresExternalPower = boolean;
9286
9934
  /**
9287
9935
  * Advertising interval in 0.625 millisecond units. Applied by the peripheral owner independently of LTE connection work.
9288
9936
  */
@@ -9391,6 +10039,42 @@ export type WarmCurrentLimitingRecoveryTemperature = number;
9391
10039
  * After a high-temperature shutdown, resume only at or below this temperature. Order: cold stop < cold stop recovery <= cold limit < cold limit recovery <= warm limit recovery < warm limit <= hot stop recovery < hot stop.
9392
10040
  */
9393
10041
  export type HotShutdownRecoveryTemperature = number;
10042
+ /**
10043
+ * Maximum charging allocation duration for an MSP with autonomous local safety and charger watchdog service. LTE retains shared power reservations through communication loss until verified stopped or expired. Installed MSPs retain their existing supervision.
10044
+ */
10045
+ export type MSPChargingAllocationLease = number;
10046
+ /**
10047
+ * Maximum time for one admitted Wi-Fi acquisition, including ESP startup and result delivery. The requesting operation deadline can end it sooner. Applies to installed and configurable ESP scan protocols.
10048
+ */
10049
+ export type WiFiAcquisitionTimeout = number;
10050
+ /**
10051
+ * Minimum active scan dwell per channel. Must not exceed wifiScanActiveMaxMs. Requires ESP 10.2.1 or later; older or unknown ESP versions retain their native scan.
10052
+ */
10053
+ export type WiFiActiveScanMinimumDwell = number;
10054
+ /**
10055
+ * Maximum active scan dwell per channel. Must be at least wifiScanActiveMinMs. Requires ESP 10.2.1 or later; older or unknown ESP versions retain their native scan.
10056
+ */
10057
+ export type WiFiActiveScanMaximumDwell = number;
10058
+ /**
10059
+ * Passive scan dwell per channel. Used only for passive scans. Requires ESP 10.2.1 or later; older or unknown ESP versions retain their native scan.
10060
+ */
10061
+ export type WiFiPassiveScanDwell = number;
10062
+ /**
10063
+ * Channel bitmask: bit 0 is channel 1, bit 13 is channel 14. Zero selects all permitted channels. Intersected with ESP regulatory channels. Requires ESP 10.2.1 or later.
10064
+ */
10065
+ export type WiFiScanChannels = number;
10066
+ /**
10067
+ * ESP initialization and scan budget, excluding result delivery. Limited by the remaining LTE acquisition deadline. Requires ESP 10.2.1 or later; older or unknown ESP versions retain their native scan.
10068
+ */
10069
+ export type WiFiScanBudget = number;
10070
+ /**
10071
+ * Choose active probing or passive listening. Requires ESP 10.2.1 or later; older or unknown ESP versions retain their native scan.
10072
+ */
10073
+ export type WiFiScanType = "active" | "passive";
10074
+ /**
10075
+ * Maximum age of charger readback used for the reported charging status. Independent of charging-control safety deadlines; does not authorize charging or schedule extra hardware reads. Confirmed input loss still reports not charging immediately.
10076
+ */
10077
+ export type ChargingStatusMaximumAge = number;
9394
10078
  export interface DeviceSettings {
9395
10079
  batteryIntervalSeconds?: BatteryMeasurementInterval;
9396
10080
  accTapSensitivity?: AccelerometerTapSensitivity;
@@ -9421,7 +10105,7 @@ export interface DeviceSettings {
9421
10105
  workflowDebugEnabled?: WorkflowDebugTracing;
9422
10106
  i2cIdlePowerSavingEnabled?: I2CIdlePowerSaving;
9423
10107
  bleAdvertisingEnabled?: BLEAdvertising;
9424
- bleAdvertisingPower?: BLEAdvertisingPower;
10108
+ bleAdvertisingRequiresExternalPower?: BLEAdvertisingRequiresExternalPower;
9425
10109
  bleAdvertisingIntervalUnits?: BLEAdvertisingInterval;
9426
10110
  mode?: TrackingMode;
9427
10111
  poweredReportIntervalSeconds?: PoweredReportInterval;
@@ -9449,6 +10133,15 @@ export interface DeviceSettings {
9449
10133
  chargingTemperatureColdStopRecoveryC?: ColdShutdownRecoveryTemperature;
9450
10134
  chargingTemperatureWarmLimitRecoveryC?: WarmCurrentLimitingRecoveryTemperature;
9451
10135
  chargingTemperatureHotStopRecoveryC?: HotShutdownRecoveryTemperature;
10136
+ chargingLeaseSeconds?: MSPChargingAllocationLease;
10137
+ wifiTimeoutSeconds?: WiFiAcquisitionTimeout;
10138
+ wifiScanActiveMinMs?: WiFiActiveScanMinimumDwell;
10139
+ wifiScanActiveMaxMs?: WiFiActiveScanMaximumDwell;
10140
+ wifiScanPassiveMs?: WiFiPassiveScanDwell;
10141
+ wifiScanChannelMask?: WiFiScanChannels;
10142
+ wifiScanBudgetMs?: WiFiScanBudget;
10143
+ wifiScanType?: WiFiScanType;
10144
+ chargingStatusMaxAgeSeconds?: ChargingStatusMaximumAge;
9452
10145
  }
9453
10146
  type Definition = (typeof observationDefinitions)[number];
9454
10147
  export type MetricName = Definition["name"];