@onekeyfe/hd-core 1.2.0-alpha.41 → 1.2.0-alpha.42

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.
Files changed (200) hide show
  1. package/__tests__/AllNetworkGetAddressBase.tracing.test.ts +78 -0
  2. package/__tests__/DeviceEventRegistration.test.ts +6 -0
  3. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +14 -1
  4. package/__tests__/connectSettings.test.ts +5 -47
  5. package/__tests__/deviceUploadNft.test.ts +187 -0
  6. package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +31 -59
  7. package/__tests__/get-device-state.test.ts +132 -12
  8. package/__tests__/homescreen.test.ts +41 -1
  9. package/__tests__/logBlockEvent.test.ts +1 -1
  10. package/__tests__/open-wallet-session.test.ts +259 -18
  11. package/__tests__/pro2Nft.test.ts +108 -0
  12. package/__tests__/protocol-v2-resources.test.ts +204 -0
  13. package/__tests__/protocol-v2-ui-lifecycle.test.ts +56 -0
  14. package/__tests__/protocol-v2-unlock-policy.test.ts +86 -35
  15. package/__tests__/protocol-v2.test.ts +526 -955
  16. package/__tests__/public-pro2-api-boundary.test.ts +1 -0
  17. package/__tests__/uiProgressThrottle.test.ts +74 -0
  18. package/dist/api/BaseMethod.d.ts +3 -1
  19. package/dist/api/BaseMethod.d.ts.map +1 -1
  20. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  21. package/dist/api/FirmwareUpdateV2.d.ts +0 -11
  22. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  23. package/dist/api/FirmwareUpdateV3.d.ts +3 -7
  24. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  25. package/dist/api/FirmwareUpdateV4.d.ts +6 -25
  26. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  27. package/dist/api/GetPassphraseState.d.ts.map +1 -1
  28. package/dist/api/OpenWalletSession.d.ts.map +1 -1
  29. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
  30. package/dist/api/device/DeviceUpdateBootloader.d.ts +1 -5
  31. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  32. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +0 -8
  33. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  34. package/dist/api/firmware/getBinary.d.ts +0 -7
  35. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  36. package/dist/api/firmware/updateBootloader.d.ts +0 -2
  37. package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
  38. package/dist/api/firmware/uploadFirmware.d.ts +1 -9
  39. package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
  40. package/dist/api/helpers/protocolV2FileWrite.d.ts +2 -0
  41. package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -1
  42. package/dist/api/index.d.ts +1 -0
  43. package/dist/api/index.d.ts.map +1 -1
  44. package/dist/api/protocol-v2/DeviceUploadNft.d.ts +30 -0
  45. package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +1 -0
  46. package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
  47. package/dist/api/stellar/StellarSignTransaction.d.ts +1 -1
  48. package/dist/core/deviceEventRegistration.d.ts +2 -0
  49. package/dist/core/deviceEventRegistration.d.ts.map +1 -1
  50. package/dist/core/index.d.ts.map +1 -1
  51. package/dist/data-manager/DataManager.d.ts +3 -2
  52. package/dist/data-manager/DataManager.d.ts.map +1 -1
  53. package/dist/data-manager/connectSettings.d.ts.map +1 -1
  54. package/dist/device/Device.d.ts +22 -4
  55. package/dist/device/Device.d.ts.map +1 -1
  56. package/dist/events/device.d.ts +4 -0
  57. package/dist/events/device.d.ts.map +1 -1
  58. package/dist/events/logBlockEvent.d.ts.map +1 -1
  59. package/dist/events/ui-request.d.ts +27 -2
  60. package/dist/events/ui-request.d.ts.map +1 -1
  61. package/dist/index.d.ts +110 -182
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +1919 -3336
  64. package/dist/inject.d.ts.map +1 -1
  65. package/dist/lowLevelInject.d.ts.map +1 -1
  66. package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
  67. package/dist/protocols/protocol-v2/resources.d.ts +30 -0
  68. package/dist/protocols/protocol-v2/resources.d.ts.map +1 -0
  69. package/dist/protocols/protocol-v2/uiInteraction.d.ts +3 -3
  70. package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -1
  71. package/dist/protocols/protocol-v2/unlockPolicy.d.ts +1 -3
  72. package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -1
  73. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts +22 -0
  74. package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +1 -0
  75. package/dist/protocols/protocol-v2/walletSession.d.ts +4 -1
  76. package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -1
  77. package/dist/topLevelInject.d.ts.map +1 -1
  78. package/dist/types/api/checkAllFirmwareRelease.d.ts +1 -4
  79. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  80. package/dist/types/api/deviceUpdateBootloader.d.ts +0 -6
  81. package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
  82. package/dist/types/api/export.d.ts +1 -4
  83. package/dist/types/api/export.d.ts.map +1 -1
  84. package/dist/types/api/firmwareUpdate.d.ts +0 -69
  85. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  86. package/dist/types/api/index.d.ts +3 -10
  87. package/dist/types/api/index.d.ts.map +1 -1
  88. package/dist/types/api/protocolV2.d.ts +3 -0
  89. package/dist/types/api/protocolV2.d.ts.map +1 -1
  90. package/dist/types/settings.d.ts +12 -13
  91. package/dist/types/settings.d.ts.map +1 -1
  92. package/dist/utils/deviceFeaturesUtils.d.ts +2 -0
  93. package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
  94. package/dist/utils/homescreen.d.ts +4 -0
  95. package/dist/utils/homescreen.d.ts.map +1 -1
  96. package/dist/utils/index.d.ts +1 -1
  97. package/dist/utils/index.d.ts.map +1 -1
  98. package/dist/utils/patch.d.ts +1 -1
  99. package/dist/utils/patch.d.ts.map +1 -1
  100. package/dist/utils/pro2Nft.d.ts +29 -0
  101. package/dist/utils/pro2Nft.d.ts.map +1 -0
  102. package/dist/utils/pro2Wallpaper.d.ts +10 -0
  103. package/dist/utils/pro2Wallpaper.d.ts.map +1 -1
  104. package/dist/utils/uiProgressThrottle.d.ts +3 -0
  105. package/dist/utils/uiProgressThrottle.d.ts.map +1 -0
  106. package/package.json +4 -4
  107. package/src/api/BaseMethod.ts +8 -10
  108. package/src/api/CheckAllFirmwareRelease.ts +40 -53
  109. package/src/api/FirmwareUpdateV2.ts +120 -298
  110. package/src/api/FirmwareUpdateV3.ts +57 -263
  111. package/src/api/FirmwareUpdateV4.ts +307 -912
  112. package/src/api/GetPassphraseState.ts +7 -1
  113. package/src/api/OpenWalletSession.ts +54 -17
  114. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +32 -11
  115. package/src/api/device/DeviceUnlock.ts +1 -1
  116. package/src/api/device/DeviceUpdateBootloader.ts +6 -122
  117. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +0 -57
  118. package/src/api/firmware/updateBootloader.ts +4 -19
  119. package/src/api/firmware/uploadFirmware.ts +22 -140
  120. package/src/api/helpers/protocolV2FileWrite.ts +11 -4
  121. package/src/api/index.ts +1 -0
  122. package/src/api/protocol-v2/DeviceUploadNft.ts +166 -0
  123. package/src/api/protocol-v2/ProtocolInfoRequest.ts +3 -1
  124. package/src/core/deviceEventRegistration.ts +4 -0
  125. package/src/core/index.ts +118 -75
  126. package/src/data/messages/messages-protocol-v2.json +53 -0
  127. package/src/data-manager/DataManager.ts +63 -38
  128. package/src/data-manager/connectSettings.ts +0 -11
  129. package/src/device/Device.ts +193 -21
  130. package/src/events/device.ts +4 -0
  131. package/src/events/logBlockEvent.ts +1 -0
  132. package/src/events/ui-request.ts +32 -2
  133. package/src/index.ts +0 -5
  134. package/src/inject.ts +3 -22
  135. package/src/lowLevelInject.ts +1 -5
  136. package/src/protocols/protocol-v2/features.ts +9 -2
  137. package/src/protocols/protocol-v2/resources.ts +233 -0
  138. package/src/protocols/protocol-v2/uiInteraction.ts +31 -5
  139. package/src/protocols/protocol-v2/unlockPolicy.ts +1 -105
  140. package/src/protocols/protocol-v2/unlockPolicyRunner.ts +117 -0
  141. package/src/protocols/protocol-v2/walletSession.ts +93 -18
  142. package/src/topLevelInject.ts +1 -5
  143. package/src/types/api/checkAllFirmwareRelease.ts +1 -4
  144. package/src/types/api/deviceUpdateBootloader.ts +0 -6
  145. package/src/types/api/export.ts +0 -18
  146. package/src/types/api/firmwareUpdate.ts +0 -76
  147. package/src/types/api/index.ts +2 -14
  148. package/src/types/api/protocolV2.ts +13 -0
  149. package/src/types/settings.ts +26 -13
  150. package/src/utils/deviceFeaturesUtils.ts +4 -0
  151. package/src/utils/homescreen.ts +32 -6
  152. package/src/utils/index.ts +6 -1
  153. package/src/utils/pro2Nft.ts +91 -0
  154. package/src/utils/pro2Wallpaper.ts +35 -8
  155. package/src/utils/uiProgressThrottle.ts +63 -0
  156. package/__tests__/firmware-update/check-all-firmware-release.test.ts +0 -175
  157. package/__tests__/firmware-update/firmware-artifact-source.test.ts +0 -119
  158. package/__tests__/firmware-update/firmware-host-binding.test.ts +0 -70
  159. package/__tests__/firmware-update/firmware-preparation-error.test.ts +0 -27
  160. package/__tests__/firmware-update/firmware-update-capabilities.test.ts +0 -13
  161. package/__tests__/firmware-update/firmware-update-plan.test.ts +0 -593
  162. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +0 -213
  163. package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +0 -58
  164. package/__tests__/firmware-update/firmware-upload-source.test.ts +0 -70
  165. package/dist/api/firmware/FirmwareArtifactSource.d.ts +0 -25
  166. package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +0 -1
  167. package/dist/api/firmware/FirmwareHostBinding.d.ts +0 -6
  168. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +0 -1
  169. package/dist/api/firmware/FirmwarePreparationError.d.ts +0 -3
  170. package/dist/api/firmware/FirmwarePreparationError.d.ts.map +0 -1
  171. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +0 -3
  172. package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +0 -1
  173. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +0 -25
  174. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +0 -1
  175. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +0 -30
  176. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +0 -1
  177. package/dist/api/firmware/progressThrottle.d.ts +0 -3
  178. package/dist/api/firmware/progressThrottle.d.ts.map +0 -1
  179. package/dist/protocols/protocol-v2/lockedError.d.ts +0 -2
  180. package/dist/protocols/protocol-v2/lockedError.d.ts.map +0 -1
  181. package/dist/protocols/protocol-v2/unlockRetry.d.ts +0 -10
  182. package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +0 -1
  183. package/dist/types/api/firmwareUpdateCapabilities.d.ts +0 -9
  184. package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +0 -1
  185. package/dist/types/api/firmwareUpdatePlan.d.ts +0 -28
  186. package/dist/types/api/firmwareUpdatePlan.d.ts.map +0 -1
  187. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +0 -42
  188. package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +0 -1
  189. package/src/api/firmware/FirmwareArtifactSource.ts +0 -278
  190. package/src/api/firmware/FirmwareHostBinding.ts +0 -100
  191. package/src/api/firmware/FirmwarePreparationError.ts +0 -12
  192. package/src/api/firmware/FirmwareUpdateCapabilities.ts +0 -9
  193. package/src/api/firmware/FirmwareUpdatePlan.ts +0 -745
  194. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +0 -392
  195. package/src/api/firmware/progressThrottle.ts +0 -44
  196. package/src/protocols/protocol-v2/lockedError.ts +0 -10
  197. package/src/protocols/protocol-v2/unlockRetry.ts +0 -109
  198. package/src/types/api/firmwareUpdateCapabilities.ts +0 -9
  199. package/src/types/api/firmwareUpdatePlan.ts +0 -38
  200. package/src/types/api/firmwareUpdatePreparedPlan.ts +0 -53
@@ -16,16 +16,14 @@ import { getBleFirmwareReleaseInfo, getFirmwareReleaseInfo } from './firmware/re
16
16
  import { LoggerNames, getLogger } from '../utils';
17
17
  import { generateInstanceId } from '../utils/tracing';
18
18
  import { DeviceModelToTypes } from '../types';
19
- import {
20
- type UnlockPolicy,
21
- getProtocolV2UnlockPolicy,
22
- } from '../protocols/protocol-v2/unlockPolicy';
23
19
 
24
20
  import type { Device } from '../device/Device';
25
21
  import type DeviceConnector from '../device/DeviceConnector';
26
22
  import type { DeviceFirmwareRange, KnownDevice } from '../types';
27
23
  import type { CoreMessage } from '../events';
24
+ import type { UnlockPolicy } from '../protocols/protocol-v2/unlockPolicy';
28
25
  import type { ProtocolV2InteractionDescriptor } from '../protocols/protocol-v2/uiInteraction';
26
+ import type { ProtocolV2UnlockContext } from '../protocols/protocol-v2/unlockPolicyRunner';
29
27
  import type { RequestContext } from '../utils/tracing';
30
28
  import type { CoreContext } from '../core';
31
29
 
@@ -128,9 +126,7 @@ export abstract class BaseMethod<Params = undefined> {
128
126
  */
129
127
  checkDeviceId = false;
130
128
 
131
- /**
132
- * 该方法是否需要校验 passphrase state
133
- */
129
+ /** Whether the method requires wallet-session selection and Protocol V2 pre-unlock. */
134
130
  useDevicePassphraseState = true;
135
131
 
136
132
  /**
@@ -168,9 +164,12 @@ export abstract class BaseMethod<Params = undefined> {
168
164
  */
169
165
  strictCheckDeviceSupport = false;
170
166
 
171
- /** Core unlocks and retries only explicitly replay-safe Protocol V2 methods. */
167
+ /** Non-wallet methods may explicitly require Protocol V2 pre-unlock. */
172
168
  unlockPolicy: UnlockPolicy = 'none';
173
169
 
170
+ /** Shared by composite methods so nested calls do not repeat the root preflight. */
171
+ protocolV2UnlockContext?: ProtocolV2UnlockContext;
172
+
174
173
  getSupportedProtocols(): readonly ProtocolType[] {
175
174
  return ['V1'];
176
175
  }
@@ -188,7 +187,7 @@ export abstract class BaseMethod<Params = undefined> {
188
187
  /** Non-blocking Protocol V2 interaction synthesized by the SDK. */
189
188
  protocolV2UiInteraction?: ProtocolV2InteractionDescriptor;
190
189
 
191
- /** Special background methods may suppress all synthesized Protocol V2 UI events. */
190
+ /** Special background methods may suppress method-level Protocol V2 UI events. */
192
191
  protocolV2UiMode: ProtocolV2UiMode = 'auto';
193
192
 
194
193
  protected throwIfAborted() {
@@ -217,7 +216,6 @@ export abstract class BaseMethod<Params = undefined> {
217
216
  this.useDevice = true;
218
217
  this.allowDeviceMode = [UI_REQUEST.NOT_INITIALIZE];
219
218
  this.requireDeviceMode = [];
220
- this.unlockPolicy = getProtocolV2UnlockPolicy(this.name);
221
219
  }
222
220
 
223
221
  abstract init(): void;
@@ -1,7 +1,6 @@
1
- import { EFirmwareType, ERRORS, HardwareError, HardwareErrorCode } from '@onekeyfe/hd-shared';
1
+ import { EFirmwareType, ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
2
2
  import semver from 'semver';
3
3
 
4
- import { BaseMethod } from './BaseMethod';
5
4
  import { UI_REQUEST } from '../constants/ui-request';
6
5
  import { DataManager } from '../data-manager';
7
6
  import {
@@ -9,18 +8,13 @@ import {
9
8
  getBootloaderReleaseInfo,
10
9
  getFirmwareReleaseInfo,
11
10
  } from './firmware/releaseHelper';
12
- import {
13
- buildFirmwareUpdatePlan,
14
- validateFirmwareUpdatePlanForceTargets,
15
- } from './firmware/FirmwareUpdatePlan';
16
11
  import { getBridgeReleaseInfo } from '../utils/bridgeUpdate';
12
+ import { getDeviceFirmwareVersion, getDeviceType, getFirmwareType } from '../utils';
13
+ import { BaseMethod } from './BaseMethod';
17
14
  import {
18
- LoggerNames,
19
- getDeviceFirmwareVersion,
20
- getDeviceType,
21
- getFirmwareType,
22
- getLogger,
23
- } from '../utils';
15
+ buildProtocolV2ResourceUpdatePlan,
16
+ requestProtocolV2ResourceInventory,
17
+ } from '../protocols/protocol-v2/resources';
24
18
 
25
19
  import type {
26
20
  AllFirmwareRelease,
@@ -36,7 +30,6 @@ import type {
36
30
  IProtocolV2FirmwareComponent,
37
31
  IProtocolV2FirmwareComponentTarget,
38
32
  } from '../types';
39
- import type { FirmwareUpdatePlan } from '../types/api/firmwareUpdatePlan';
40
33
 
41
34
  const UPDATE_TARGET_BY_COMPONENT_TARGET: Readonly<
42
35
  Partial<Record<IProtocolV2FirmwareComponentTarget, FirmwareUpdateV4Target>>
@@ -230,9 +223,6 @@ export function buildProtocolV2FirmwareRelease({
230
223
  const targetsToUpdate = components.flatMap(component =>
231
224
  component.status === 'outdated' && component.updateTarget ? [component.updateTarget] : []
232
225
  );
233
- if (targetsToUpdate.length > 0 && release.resourceBundles?.length) {
234
- targetsToUpdate.push('resource');
235
- }
236
226
  const uniqueTargetsToUpdate = Array.from(new Set(targetsToUpdate));
237
227
  const hasUpgrade = uniqueTargetsToUpdate.length > 0;
238
228
  const required = release.required && hasUpgrade;
@@ -257,8 +247,6 @@ export function buildProtocolV2FirmwareRelease({
257
247
  };
258
248
  }
259
249
 
260
- const Log = getLogger(LoggerNames.Method);
261
-
262
250
  export default class CheckAllFirmwareRelease extends BaseMethod {
263
251
  getSupportedProtocols() {
264
252
  return ['V1', 'V2'] as const;
@@ -276,13 +264,8 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
276
264
  }
277
265
 
278
266
  const { features } = this.device;
279
- const {
280
- checkBridgeRelease,
281
- firmwareType: firmwareTypeParams,
282
- platform,
283
- forceUpdateTargets,
284
- } = this.payload as CheckAllFirmwareReleaseParams;
285
- const validatedForceUpdateTargets = validateFirmwareUpdatePlanForceTargets(forceUpdateTargets);
267
+ const { checkBridgeRelease, firmwareType: firmwareTypeParams } = this
268
+ .payload as CheckAllFirmwareReleaseParams;
286
269
 
287
270
  if (!features) {
288
271
  return Promise.resolve(null);
@@ -313,32 +296,6 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
313
296
  firmwareType,
314
297
  });
315
298
  const bleFirmwareReleaseInfo = getBleFirmwareReleaseInfo(features);
316
- let firmwareUpdatePlan: FirmwareUpdatePlan | undefined;
317
- try {
318
- firmwareUpdatePlan = buildFirmwareUpdatePlan({
319
- features,
320
- firmwareType,
321
- platform: platform ?? 'web',
322
- firmware: firmwareRelease,
323
- ble: bleFirmwareReleaseInfo,
324
- bootloader: bootloaderRelease,
325
- forceUpdateTargets: validatedForceUpdateTargets,
326
- });
327
- } catch (error) {
328
- if (
329
- validatedForceUpdateTargets.length > 0 ||
330
- !(error instanceof HardwareError) ||
331
- error.params?.firmwareUpdateCode !== 'FirmwarePlanInvalid'
332
- ) {
333
- throw error;
334
- }
335
- // A Plan is an optional external-host capability. Release checks remain
336
- // available for legacy and recovery flows when a Plan cannot be built.
337
- Log.warn(
338
- '[CheckAllFirmwareRelease] Optional firmware Plan is unavailable; using the legacy release result'
339
- );
340
- firmwareUpdatePlan = undefined;
341
- }
342
299
 
343
300
  return {
344
301
  firmware: firmwareRelease,
@@ -353,8 +310,7 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
353
310
  }
354
311
  : undefined,
355
312
  features,
356
- firmwareUpdatePlan,
357
- } as unknown as AllFirmwareRelease;
313
+ } as AllFirmwareRelease;
358
314
  }
359
315
 
360
316
  private async runProtocolV2(): Promise<AllFirmwareRelease> {
@@ -386,6 +342,34 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
386
342
  firmwareType,
387
343
  release,
388
344
  });
345
+ const resources = DataManager.getProtocolV2Resources();
346
+ let resourceStatus: 'valid' | 'outdated' | 'unknown' = 'unknown';
347
+ if (resources?.length) {
348
+ const loaderMode = state.status.mode === 'bootloader' || state.status.mode === 'romloader';
349
+ if (loaderMode) {
350
+ resourceStatus = buildProtocolV2ResourceUpdatePlan({
351
+ resources,
352
+ mode: 'bootloader-recovery',
353
+ }).status;
354
+ } else if (state.status.mode === 'normal') {
355
+ try {
356
+ const inventory = await requestProtocolV2ResourceInventory({
357
+ commands: this.device.getCommands(),
358
+ });
359
+ resourceStatus = buildProtocolV2ResourceUpdatePlan({
360
+ resources,
361
+ inventory,
362
+ mode: 'application',
363
+ }).status;
364
+ } catch {
365
+ resourceStatus = 'unknown';
366
+ }
367
+ }
368
+ }
369
+ const targetsToUpdate = [
370
+ ...plan.targetsToUpdate,
371
+ ...(resourceStatus === 'outdated' ? (['resource'] as const) : []),
372
+ ];
389
373
  const firmwareStatus = plan.status === 'unavailable' ? 'unknown' : plan.status;
390
374
  const emptyRelease = 'none' as const;
391
375
 
@@ -408,6 +392,9 @@ export default class CheckAllFirmwareRelease extends BaseMethod {
408
392
  protocol: 'V2',
409
393
  deviceType: 'pro2',
410
394
  ...plan,
395
+ resourceStatus,
396
+ hasUpgrade: plan.hasUpgrade || resourceStatus === 'outdated',
397
+ targetsToUpdate,
411
398
  };
412
399
  }
413
400
  }