@nadohq/mobile-client 0.65.0 → 0.67.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.
Files changed (211) hide show
  1. package/README.md +202 -10
  2. package/dist/{MobileClient-CfVZXTcz.cjs → MobileClient-vuI5wlB_.cjs} +303 -21
  3. package/dist/MobileClient-vuI5wlB_.cjs.map +1 -0
  4. package/dist/MobileClient.cjs +1 -1
  5. package/dist/MobileClient.d.cts +175 -20
  6. package/dist/MobileClient.d.cts.map +1 -1
  7. package/dist/MobileClient.d.ts +175 -20
  8. package/dist/MobileClient.d.ts.map +1 -1
  9. package/dist/MobileClient.js +303 -21
  10. package/dist/MobileClient.js.map +1 -1
  11. package/dist/{MobileServerFailureError-BZVwlsMg.d.ts → MobileServerFailureError-BeCCNShj.d.cts} +2 -3
  12. package/dist/MobileServerFailureError-BeCCNShj.d.cts.map +1 -0
  13. package/dist/{MobileServerFailureError-CbtK8kD4.d.cts → MobileServerFailureError-hHv28weI.d.ts} +2 -3
  14. package/dist/MobileServerFailureError-hHv28weI.d.ts.map +1 -0
  15. package/dist/MobileUnsupportedNotificationRouteError-DpiNBvvY.d.cts +15 -0
  16. package/dist/MobileUnsupportedNotificationRouteError-DpiNBvvY.d.cts.map +1 -0
  17. package/dist/MobileUnsupportedNotificationRouteError-DpiNBvvY.d.ts +15 -0
  18. package/dist/MobileUnsupportedNotificationRouteError-DpiNBvvY.d.ts.map +1 -0
  19. package/dist/{buildSignedMobileRequest-C1v0flCR.d.cts → buildSignedMobileRequest-DcEMKU_4.d.cts} +2 -2
  20. package/dist/{buildSignedMobileRequest-C1v0flCR.d.cts.map → buildSignedMobileRequest-DcEMKU_4.d.cts.map} +1 -1
  21. package/dist/{buildSignedMobileRequest-UeeWdYGU.d.ts → buildSignedMobileRequest-DlTMvoXR.d.ts} +2 -2
  22. package/dist/{buildSignedMobileRequest-UeeWdYGU.d.ts.map → buildSignedMobileRequest-DlTMvoXR.d.ts.map} +1 -1
  23. package/dist/{canonicalize-5eeZrkzQ.d.ts → canonicalize-BOZlflI3.d.ts} +2 -2
  24. package/dist/canonicalize-BOZlflI3.d.ts.map +1 -0
  25. package/dist/{canonicalize-CBaZprTo.d.cts → canonicalize-BvCozzvJ.d.cts} +2 -2
  26. package/dist/canonicalize-BvCozzvJ.d.cts.map +1 -0
  27. package/dist/{clientTypes-_mEgzmNs.d.cts → clientTypes-KpHlCDGZ.d.cts} +341 -38
  28. package/dist/clientTypes-KpHlCDGZ.d.cts.map +1 -0
  29. package/dist/{clientTypes-C9dJufxk.d.ts → clientTypes-XRI41VdC.d.ts} +341 -38
  30. package/dist/clientTypes-XRI41VdC.d.ts.map +1 -0
  31. package/dist/dataMappers.cjs +257 -20
  32. package/dist/dataMappers.cjs.map +1 -1
  33. package/dist/dataMappers.d.cts +98 -15
  34. package/dist/dataMappers.d.cts.map +1 -1
  35. package/dist/dataMappers.d.ts +98 -15
  36. package/dist/dataMappers.d.ts.map +1 -1
  37. package/dist/dataMappers.js +242 -20
  38. package/dist/dataMappers.js.map +1 -1
  39. package/dist/{eip712MethodByType-D8jLoxDu.d.cts → eip712MethodByType-DyAmzH7b.d.cts} +2 -2
  40. package/dist/eip712MethodByType-DyAmzH7b.d.cts.map +1 -0
  41. package/dist/{eip712MethodByType-DcUh8h-l.d.ts → eip712MethodByType-qSSAF6i2.d.ts} +2 -2
  42. package/dist/eip712MethodByType-qSSAF6i2.d.ts.map +1 -0
  43. package/dist/feed-BrgkFqP3.d.cts +23 -0
  44. package/dist/feed-BrgkFqP3.d.cts.map +1 -0
  45. package/dist/feed-DcbhLoo1.d.ts +23 -0
  46. package/dist/feed-DcbhLoo1.d.ts.map +1 -0
  47. package/dist/index-BVVgDSdq.d.cts +1 -0
  48. package/dist/index-BVVgDSdq.d.ts +1 -0
  49. package/dist/index.cjs +8 -2
  50. package/dist/index.d.cts +14 -16
  51. package/dist/index.d.ts +14 -16
  52. package/dist/index.js +4 -3
  53. package/dist/{mobileErrorCodes-CmjYEIYm.d.ts → mobileErrorCodes-CdwX6QTO.d.cts} +8 -3
  54. package/dist/mobileErrorCodes-CdwX6QTO.d.cts.map +1 -0
  55. package/dist/{mobileErrorCodes-CmjYEIYm.d.cts → mobileErrorCodes-CdwX6QTO.d.ts} +8 -3
  56. package/dist/mobileErrorCodes-CdwX6QTO.d.ts.map +1 -0
  57. package/dist/{payloadHash-DhHmgRqL.d.cts → payloadHash-BgGSZock.d.cts} +2 -2
  58. package/dist/payloadHash-BgGSZock.d.cts.map +1 -0
  59. package/dist/{payloadHash-E1_8fpLW.d.ts → payloadHash-Bi6upCLQ.d.ts} +2 -2
  60. package/dist/payloadHash-Bi6upCLQ.d.ts.map +1 -0
  61. package/dist/{serverExecuteTypes-BwWGspOg.d.ts → serverExecuteTypes-DuCWe_H_.d.cts} +23 -14
  62. package/dist/serverExecuteTypes-DuCWe_H_.d.cts.map +1 -0
  63. package/dist/{serverExecuteTypes-B-OJok19.d.cts → serverExecuteTypes-usJ6HMJv.d.ts} +23 -14
  64. package/dist/serverExecuteTypes-usJ6HMJv.d.ts.map +1 -0
  65. package/dist/{serverModelTypes-CiA-dy1R.d.ts → serverModelTypes-CTHMNIQS.d.cts} +170 -13
  66. package/dist/serverModelTypes-CTHMNIQS.d.cts.map +1 -0
  67. package/dist/{serverModelTypes-CiA-dy1R.d.cts → serverModelTypes-CTHMNIQS.d.ts} +170 -13
  68. package/dist/serverModelTypes-CTHMNIQS.d.ts.map +1 -0
  69. package/dist/{serverResponseGuards-CShiXpHT.d.ts → serverResponseGuards-CzmldAad.d.cts} +2 -2
  70. package/dist/{serverResponseGuards-BW69PS7O.d.cts.map → serverResponseGuards-CzmldAad.d.cts.map} +1 -1
  71. package/dist/{serverResponseGuards-BW69PS7O.d.cts → serverResponseGuards-Dvkbjp2_.d.ts} +2 -2
  72. package/dist/{serverResponseGuards-CShiXpHT.d.ts.map → serverResponseGuards-Dvkbjp2_.d.ts.map} +1 -1
  73. package/dist/signing/buildSignedMobileRequest.d.cts +1 -1
  74. package/dist/signing/buildSignedMobileRequest.d.ts +1 -1
  75. package/dist/signing/canonicalize.cjs +53 -2
  76. package/dist/signing/canonicalize.cjs.map +1 -1
  77. package/dist/signing/canonicalize.d.cts +1 -1
  78. package/dist/signing/canonicalize.d.ts +1 -1
  79. package/dist/signing/canonicalize.js +53 -2
  80. package/dist/signing/canonicalize.js.map +1 -1
  81. package/dist/signing/eip712MethodByType.cjs +7 -0
  82. package/dist/signing/eip712MethodByType.cjs.map +1 -1
  83. package/dist/signing/eip712MethodByType.d.cts +1 -1
  84. package/dist/signing/eip712MethodByType.d.ts +1 -1
  85. package/dist/signing/eip712MethodByType.js +7 -0
  86. package/dist/signing/eip712MethodByType.js.map +1 -1
  87. package/dist/signing/index.d.cts +5 -5
  88. package/dist/signing/index.d.ts +5 -5
  89. package/dist/signing/payloadHash.cjs +1 -1
  90. package/dist/signing/payloadHash.d.cts +1 -1
  91. package/dist/signing/payloadHash.d.ts +1 -1
  92. package/dist/signing/payloadHash.js +1 -1
  93. package/dist/signing/types.d.cts +1 -1
  94. package/dist/signing/types.d.ts +1 -1
  95. package/dist/types/MobileServerFailureError.d.cts +1 -1
  96. package/dist/types/MobileServerFailureError.d.ts +1 -1
  97. package/dist/types/MobileUnsupportedNotificationRouteError.cjs +19 -0
  98. package/dist/types/MobileUnsupportedNotificationRouteError.cjs.map +1 -0
  99. package/dist/types/MobileUnsupportedNotificationRouteError.d.cts +2 -0
  100. package/dist/types/MobileUnsupportedNotificationRouteError.d.ts +2 -0
  101. package/dist/types/MobileUnsupportedNotificationRouteError.js +18 -0
  102. package/dist/types/MobileUnsupportedNotificationRouteError.js.map +1 -0
  103. package/dist/types/clientTypes.d.cts +2 -2
  104. package/dist/types/clientTypes.d.ts +2 -2
  105. package/dist/types/index.cjs +4 -0
  106. package/dist/types/index.d.cts +8 -9
  107. package/dist/types/index.d.ts +8 -9
  108. package/dist/types/index.js +3 -2
  109. package/dist/types/mobileErrorCodes.cjs +11 -1
  110. package/dist/types/mobileErrorCodes.cjs.map +1 -1
  111. package/dist/types/mobileErrorCodes.d.cts +1 -1
  112. package/dist/types/mobileErrorCodes.d.ts +1 -1
  113. package/dist/types/mobileErrorCodes.js +11 -1
  114. package/dist/types/mobileErrorCodes.js.map +1 -1
  115. package/dist/types/serverBaseTypes.d.cts +1 -1
  116. package/dist/types/serverBaseTypes.d.ts +1 -1
  117. package/dist/types/serverExecuteTypes.d.cts +2 -2
  118. package/dist/types/serverExecuteTypes.d.ts +2 -2
  119. package/dist/types/serverModelTypes.cjs +15 -0
  120. package/dist/types/serverModelTypes.cjs.map +1 -1
  121. package/dist/types/serverModelTypes.d.cts +2 -2
  122. package/dist/types/serverModelTypes.d.ts +2 -2
  123. package/dist/types/serverModelTypes.js +14 -1
  124. package/dist/types/serverModelTypes.js.map +1 -1
  125. package/dist/types/serverQueryTypes.d.cts +2 -2
  126. package/dist/types/serverQueryTypes.d.ts +2 -2
  127. package/dist/types/serverRequestTypes.d.cts +2 -2
  128. package/dist/types/serverRequestTypes.d.ts +2 -2
  129. package/dist/types-CByl_NyJ.d.ts +825 -0
  130. package/dist/types-CByl_NyJ.d.ts.map +1 -0
  131. package/dist/types-CR5iaKR4.d.cts +825 -0
  132. package/dist/types-CR5iaKR4.d.cts.map +1 -0
  133. package/dist/utils/buildMobileFeedImageMultipart.cjs +31 -0
  134. package/dist/utils/buildMobileFeedImageMultipart.cjs.map +1 -0
  135. package/dist/utils/buildMobileFeedImageMultipart.d.cts +15 -0
  136. package/dist/utils/buildMobileFeedImageMultipart.d.cts.map +1 -0
  137. package/dist/utils/buildMobileFeedImageMultipart.d.ts +15 -0
  138. package/dist/utils/buildMobileFeedImageMultipart.d.ts.map +1 -0
  139. package/dist/utils/buildMobileFeedImageMultipart.js +30 -0
  140. package/dist/utils/buildMobileFeedImageMultipart.js.map +1 -0
  141. package/dist/utils/feed.cjs +12 -0
  142. package/dist/utils/feed.cjs.map +1 -1
  143. package/dist/utils/feed.d.cts +2 -2
  144. package/dist/utils/feed.d.ts +2 -2
  145. package/dist/utils/feed.js +11 -1
  146. package/dist/utils/feed.js.map +1 -1
  147. package/dist/utils/index.cjs +3 -1
  148. package/dist/utils/index.d.cts +3 -3
  149. package/dist/utils/index.d.ts +3 -3
  150. package/dist/utils/index.js +2 -2
  151. package/dist/utils/serverResponseGuards.d.cts +1 -1
  152. package/dist/utils/serverResponseGuards.d.ts +1 -1
  153. package/package.json +3 -3
  154. package/src/MobileClient.ts +444 -19
  155. package/src/dataMappers.test.ts +511 -6
  156. package/src/dataMappers.ts +325 -24
  157. package/src/feedImages.test.ts +309 -0
  158. package/src/notifications.test.ts +950 -0
  159. package/src/signing/canonicalize.ts +72 -0
  160. package/src/signing/eip712MethodByType.ts +10 -0
  161. package/src/signing/signing.test.ts +67 -1
  162. package/src/signing/types.ts +55 -9
  163. package/src/socialFeed.test.ts +63 -2
  164. package/src/types/MobileUnsupportedNotificationRouteError.ts +16 -0
  165. package/src/types/clientTypes.ts +427 -36
  166. package/src/types/index.ts +1 -0
  167. package/src/types/mobileErrorCodes.ts +10 -0
  168. package/src/types/serverExecuteTypes.ts +22 -10
  169. package/src/types/serverModelTypes.ts +216 -11
  170. package/src/types/serverQueryTypes.ts +106 -9
  171. package/src/types/serverRequestTypes.ts +114 -17
  172. package/src/utils/buildMobileFeedImageMultipart.test.ts +45 -0
  173. package/src/utils/buildMobileFeedImageMultipart.ts +36 -0
  174. package/src/utils/feed.ts +16 -0
  175. package/dist/MobileClient-CfVZXTcz.cjs.map +0 -1
  176. package/dist/MobileServerFailureError-BZVwlsMg.d.ts.map +0 -1
  177. package/dist/MobileServerFailureError-CbtK8kD4.d.cts.map +0 -1
  178. package/dist/canonicalize-5eeZrkzQ.d.ts.map +0 -1
  179. package/dist/canonicalize-CBaZprTo.d.cts.map +0 -1
  180. package/dist/clientTypes-C9dJufxk.d.ts.map +0 -1
  181. package/dist/clientTypes-_mEgzmNs.d.cts.map +0 -1
  182. package/dist/eip712MethodByType-D8jLoxDu.d.cts.map +0 -1
  183. package/dist/eip712MethodByType-DcUh8h-l.d.ts.map +0 -1
  184. package/dist/feed-DTJlsg8W.d.cts +0 -14
  185. package/dist/feed-DTJlsg8W.d.cts.map +0 -1
  186. package/dist/feed-DTJlsg8W.d.ts +0 -14
  187. package/dist/feed-DTJlsg8W.d.ts.map +0 -1
  188. package/dist/mobileErrorCodes-CmjYEIYm.d.cts.map +0 -1
  189. package/dist/mobileErrorCodes-CmjYEIYm.d.ts.map +0 -1
  190. package/dist/payloadHash-DhHmgRqL.d.cts.map +0 -1
  191. package/dist/payloadHash-E1_8fpLW.d.ts.map +0 -1
  192. package/dist/serverBaseTypes-B5J1_TyC.d.cts +0 -25
  193. package/dist/serverBaseTypes-B5J1_TyC.d.cts.map +0 -1
  194. package/dist/serverBaseTypes-DnLzsdm-.d.ts +0 -25
  195. package/dist/serverBaseTypes-DnLzsdm-.d.ts.map +0 -1
  196. package/dist/serverExecuteTypes-B-OJok19.d.cts.map +0 -1
  197. package/dist/serverExecuteTypes-BwWGspOg.d.ts.map +0 -1
  198. package/dist/serverModelTypes-CiA-dy1R.d.cts.map +0 -1
  199. package/dist/serverModelTypes-CiA-dy1R.d.ts.map +0 -1
  200. package/dist/serverQueryTypes-CJcjLB7n.d.ts +0 -283
  201. package/dist/serverQueryTypes-CJcjLB7n.d.ts.map +0 -1
  202. package/dist/serverQueryTypes-V1f9yE7L.d.cts +0 -283
  203. package/dist/serverQueryTypes-V1f9yE7L.d.cts.map +0 -1
  204. package/dist/serverRequestTypes-CRlkNSu5.d.cts +0 -270
  205. package/dist/serverRequestTypes-CRlkNSu5.d.cts.map +0 -1
  206. package/dist/serverRequestTypes-DZoOhV2o.d.ts +0 -270
  207. package/dist/serverRequestTypes-DZoOhV2o.d.ts.map +0 -1
  208. package/dist/types-BiRmH5Iv.d.cts +0 -108
  209. package/dist/types-BiRmH5Iv.d.cts.map +0 -1
  210. package/dist/types-DoJuq0Ij.d.ts +0 -108
  211. package/dist/types-DoJuq0Ij.d.ts.map +0 -1
@@ -8,7 +8,9 @@ import {
8
8
  MobileServerSocialFeedDrawing,
9
9
  MobileServerSocialFeedItem,
10
10
  MobileServerSocialFeedReply,
11
+ MobileServerSocialFeedUploadedImage,
11
12
  } from './serverModelTypes';
13
+ import { MobileServerNotificationSettingsV2Response } from './serverQueryTypes';
12
14
  import {
13
15
  MobileServerExecuteRequestType,
14
16
  MobileServerPublicExecuteRequestByType,
@@ -80,15 +82,31 @@ export interface MobileServerAvatarUploadResponse {
80
82
  expires_in_seconds: number;
81
83
  }
82
84
 
85
+ /** Ready image returned by a direct multipart upload. */
86
+ export interface MobileServerSocialFeedImageUploadResponse {
87
+ /** Ready image metadata, including original and thumbnail paths. */
88
+ image: MobileServerSocialFeedUploadedImage;
89
+ }
90
+
83
91
  /**
84
92
  * Success payloads for each signed `execute`, keyed by request `type`. Mutations return either the success
85
93
  * envelope alone or authoritative post-commit state; avatar upload creation returns a temporary grant.
86
94
  */
87
95
  export interface MobileServerExecuteResponseByType {
96
+ /** Capability-aware device registration returns only status. */
97
+ register_expo_token_v2: MobileServerEmptyExecuteResponse;
98
+ /** Re-query subscriptions after success to obtain the new revision. */
99
+ update_notification_subscriptions: MobileServerEmptyExecuteResponse;
100
+ /** Atomic event recording returns only status. */
101
+ record_product_events: MobileServerEmptyExecuteResponse;
88
102
  /** Published or idempotently recovered item. */
89
103
  create_feed_post: MobileServerSocialFeedPostResponse;
90
104
  /** Atomically published reply and updated count. */
91
105
  create_feed_comment: MobileServerSocialFeedCommentResponse;
106
+ /** Direct post-image upload; the image is ready immediately. */
107
+ create_feed_post_image_uploads: MobileServerSocialFeedImageUploadResponse;
108
+ /** Direct comment-image upload; the image is ready immediately. */
109
+ create_feed_comment_image_uploads: MobileServerSocialFeedImageUploadResponse;
92
110
  /** First attached drawing. */
93
111
  create_feed_chart_drawing: MobileServerSocialFeedDrawingMutationResponse;
94
112
  /** Replaced or idempotently recovered drawing. */
@@ -159,14 +177,6 @@ export interface MobileServerSocialFeedLikeResponse {
159
177
  version: string;
160
178
  }
161
179
 
162
- /** Exposure counts deduplicated by browsing credential, item, and UTC day. */
163
- export interface MobileServerSocialFeedViewsResponse {
164
- /** Newly counted items. */
165
- accepted_item_ids: string[];
166
- /** Already counted items. */
167
- duplicate_item_ids: string[];
168
- }
169
-
170
180
  /** Page lease result; this response does not carry as_of_ms. */
171
181
  export interface MobileServerSocialFeedPresenceResponse {
172
182
  /** Active visitor count. */
@@ -181,12 +191,14 @@ export interface MobileServerSocialFeedPresenceResponse {
181
191
 
182
192
  /** Response payloads for unsigned writes. */
183
193
  export interface MobileServerPublicExecuteResponseByType {
194
+ /** Saved document, including the advanced settings revision. */
195
+ update_notification_settings_v2: MobileServerNotificationSettingsV2Response;
184
196
  /** Token removal returns only the success envelope. */
185
197
  unregister_expo_token: MobileServerEmptyExecuteResponse;
186
198
  /** Preference updates return only the success envelope. */
187
199
  update_preferences: MobileServerEmptyExecuteResponse;
188
- /** Exposure deduplication result. */
189
- record_feed_views: MobileServerSocialFeedViewsResponse;
200
+ /** Batch views return only status; no per-target result or count. */
201
+ record_feed_views: MobileServerEmptyExecuteResponse;
190
202
  /** Page lease result. */
191
203
  position_presence: MobileServerSocialFeedPresenceResponse;
192
204
  }
@@ -33,6 +33,51 @@ export interface MobileServerAvatarPreset {
33
33
  */
34
34
  export type MobileNotificationPlatform = 'ios' | 'android';
35
35
 
36
+ /**
37
+ * Notification types supported by the v2 payload protocol.
38
+ */
39
+ export type MobileNotificationTypeId =
40
+ | 'new_follower'
41
+ | 'followed_you_back'
42
+ | 'order_fill'
43
+ | 'order_update'
44
+ | 'liquidation'
45
+ | 'trader_opened'
46
+ | 'trader_closed'
47
+ | 'position_milestone'
48
+ | 'market_movement'
49
+ | 'trader_streak'
50
+ | 'account_drama'
51
+ | 'weekly_digest';
52
+
53
+ /**
54
+ * Named navigation destinations supported by notification payloads.
55
+ */
56
+ export type MobileNotificationRouteName = MobileServerNotificationRoute['name'];
57
+
58
+ /** Position milestone options supported by notification settings. */
59
+ export const MOBILE_NOTIFICATION_POSITION_THRESHOLDS = [10, 25, 50] as const;
60
+
61
+ /** Minimum trade-size options, in whole USD, supported by notification settings. */
62
+ export const MOBILE_NOTIFICATION_MIN_TRADE_SIZES_USD = [
63
+ 0, 100, 1000, 10000,
64
+ ] as const;
65
+
66
+ /** Supported notification position milestone threshold. */
67
+ export type MobileNotificationPositionThreshold =
68
+ (typeof MOBILE_NOTIFICATION_POSITION_THRESHOLDS)[number];
69
+
70
+ /** Supported notification minimum trade size, in whole USD. */
71
+ export type MobileNotificationMinTradeSizeUsd =
72
+ (typeof MOBILE_NOTIFICATION_MIN_TRADE_SIZES_USD)[number];
73
+
74
+ /** Supported product analytics interaction. */
75
+ export type MobileProductEventName =
76
+ | 'notif_opened'
77
+ | 'market_viewed'
78
+ | 'chart_opened'
79
+ | 'search';
80
+
36
81
  /**
37
82
  * Category of push notification.
38
83
  */
@@ -223,6 +268,127 @@ export interface MobileServerNotificationPreferences {
223
268
  categories: MobileServerNotificationCategoryPreference[];
224
269
  }
225
270
 
271
+ /**
272
+ * Stored push-device metadata shared by registration requests and token ownership responses.
273
+ */
274
+ export interface MobileServerNotificationDeviceMetadata {
275
+ /** Device operating system. */
276
+ platform: MobileNotificationPlatform;
277
+ /** Locale tag, or null when absent; at most 35 UTF-8 bytes. */
278
+ locale: string | null;
279
+ /** App version, or null when absent; at most 64 UTF-8 bytes. */
280
+ app_version: string | null;
281
+ }
282
+
283
+ /**
284
+ * Device capabilities shared by v2 registration and v1/v2 registration queries.
285
+ */
286
+ export interface MobileServerNotificationCapabilities {
287
+ /** Exactly one supported payload version. */
288
+ payload_versions: [1] | [2];
289
+ /** Supported subset of the registered notification types. */
290
+ type_ids: MobileNotificationTypeId[];
291
+ /** Supported subset of the named destinations. */
292
+ routes: MobileNotificationRouteName[];
293
+ }
294
+
295
+ /**
296
+ * Server-side wallet settings; all fields are required on replacement.
297
+ */
298
+ export interface MobileServerNotificationSettings {
299
+ /** Own position milestones and the initial weekly digest. */
300
+ my_positions: boolean;
301
+ /** One to three unique values; the minimum selects the starting milestone tier. */
302
+ position_thresholds: MobileNotificationPositionThreshold[];
303
+ /** Combined order fill/update switch; does not control liquidation notifications. */
304
+ my_orders: boolean;
305
+ /** Ordinary followed-trader notifications; enabled bells override this switch. */
306
+ following_trades: boolean;
307
+ /** Notifications about posts by followed traders. */
308
+ following_posts: boolean;
309
+ /** Minimum trade size for trade notifications, in whole USD. */
310
+ min_trade_size_usd: MobileNotificationMinTradeSizeUsd;
311
+ /** New followers and follow-backs. */
312
+ new_followers: boolean;
313
+ /** Maps to the legacy announcement preference. */
314
+ announcements: boolean;
315
+ /** Opt-in trader streak and account drama discovery notifications. */
316
+ discovery: boolean;
317
+ }
318
+
319
+ /**
320
+ * Server-side allowlisted destination; notification data must never be interpreted as an arbitrary URL.
321
+ */
322
+ export type MobileServerNotificationRoute =
323
+ | {
324
+ /** Public profile destination. */
325
+ name: 'profile';
326
+ /** Profile subaccount as bytes32. */
327
+ subaccount: Hex;
328
+ }
329
+ | {
330
+ /** Market destination. */
331
+ name: 'market';
332
+ /** Positive product ID. */
333
+ product_id: number;
334
+ }
335
+ | {
336
+ /** Own portfolio destination. */
337
+ name: 'portfolio';
338
+ };
339
+
340
+ /**
341
+ * Server-side v2 push/inbox navigation data, not a complete historical trade or notification body.
342
+ */
343
+ export interface MobileServerNotificationPayloadV2 {
344
+ /** Payload protocol version. */
345
+ payload_version: 2;
346
+ /** Logical notification UUID, used for click deduplication. */
347
+ notification_id: string;
348
+ /** Intended wallet; private navigation must wait for this wallet to connect. */
349
+ recipient_wallet: Hex;
350
+ /** Registered notification type. */
351
+ type_id: MobileNotificationTypeId;
352
+ /** Supported template version. */
353
+ template_version: 1;
354
+ /** Named destination and its parameters. */
355
+ route: MobileServerNotificationRoute;
356
+ }
357
+
358
+ /**
359
+ * Server-side accepted logical notification; does not prove device delivery or read status.
360
+ */
361
+ export interface MobileServerNotificationInboxItem {
362
+ /** Logical notification UUID. */
363
+ notification_id: string;
364
+ /** Registered notification type. */
365
+ type_id: MobileNotificationTypeId;
366
+ /** Navigation data, without title, body, or read state. */
367
+ data: MobileServerNotificationPayloadV2;
368
+ /** Intent acceptance time in milliseconds. */
369
+ created_at: number;
370
+ /** Backend-computed trade attribution. */
371
+ trade_within_24h: boolean;
372
+ }
373
+
374
+ /**
375
+ * Server-side product analytics event; unused nullable fields must be explicitly null.
376
+ */
377
+ export interface MobileServerProductEvent {
378
+ /** Stable event UUID; reuse across retries. */
379
+ client_event_id: string;
380
+ /** Supported interaction; notif_opened is not a read-state mutation. */
381
+ event_name: MobileProductEventName;
382
+ /** Required for notif_opened and owned by the signing wallet; otherwise null. */
383
+ notification_id: string | null;
384
+ /** Actual event time in milliseconds, within the past 7 days or next 5 minutes. */
385
+ occurred_at: number;
386
+ /** Required for market_viewed/chart_opened; otherwise null. */
387
+ product_id: number | null;
388
+ /** Required for search, nonblank and at most 80 Unicode characters; otherwise null. */
389
+ query: string | null;
390
+ }
391
+
226
392
  /** Content filters accepted by the six social feed lists. Empty or omitted means all. */
227
393
  export type MobileSocialFeedType =
228
394
  | 'open'
@@ -426,16 +592,47 @@ export interface MobileServerSocialFeedCommentPreview {
426
592
  items: MobileServerSocialFeedReply[];
427
593
  /** Comment count. */
428
594
  total_count: number;
429
- /** Comment cursor, if available. */
595
+ /** Opens the first complete group page in the same snapshot; do not prepend preview items. */
430
596
  next_cursor: string | null;
431
597
  }
432
598
 
433
- /** Exposure requirements associated with a reading session. */
434
- export interface MobileServerSocialFeedViewTracking {
435
- /** Required visible fraction. */
436
- min_visible_ratio: number;
437
- /** Required visible duration in milliseconds. */
438
- min_duration_ms: number;
599
+ /** Uploaded feed image metadata; bytes are fetched separately with the reading session. */
600
+ export interface MobileServerSocialFeedUploadedImage {
601
+ /** Image UUID. */
602
+ image_id: string;
603
+ /** Backend path for the original image bytes. */
604
+ url: string;
605
+ /** Display-orientation width in pixels. */
606
+ width: number;
607
+ /** Display-orientation height in pixels. */
608
+ height: number;
609
+ /** Detected content type. */
610
+ content_type: 'image/jpeg' | 'image/png';
611
+ /** Original file size in bytes. */
612
+ byte_size: number;
613
+ /** Always-present thumbnail (longest edge ≤ 512, never upscaled). */
614
+ thumbnail: MobileServerSocialFeedImageThumbnail;
615
+ }
616
+
617
+ /** External image loaded directly from its URL without Mobile session headers. */
618
+ export interface MobileServerSocialFeedExternalImage {
619
+ /** Original HTTP/HTTPS URL; no upload metadata or thumbnail is provided. */
620
+ url: string;
621
+ }
622
+
623
+ /** Uploaded image metadata or an external URL; uploaded images precede external images. */
624
+ export type MobileServerSocialFeedImage =
625
+ | MobileServerSocialFeedUploadedImage
626
+ | MobileServerSocialFeedExternalImage;
627
+
628
+ /** Thumbnail metadata for an uploaded feed image. */
629
+ export interface MobileServerSocialFeedImageThumbnail {
630
+ /** Backend path for the thumbnail bytes. */
631
+ url: string;
632
+ /** Thumbnail width in pixels. */
633
+ width: number;
634
+ /** Thumbnail height in pixels. */
635
+ height: number;
439
636
  }
440
637
 
441
638
  /** Coverage of the candidate authors in a qualification snapshot. */
@@ -484,6 +681,8 @@ export interface MobileServerSocialFeedItemBase {
484
681
 
485
682
  /** Content shared by authored posts and trade cards. */
486
683
  export interface MobileServerSocialFeedContentBase extends MobileServerSocialFeedItemBase {
684
+ /** Bound images in display order; empty when none. */
685
+ images: MobileServerSocialFeedImage[];
487
686
  /** Card text, empty for automatic cards. */
488
687
  text: string;
489
688
  /** Mentions in the original, unmodified text. */
@@ -559,16 +758,14 @@ export type MobileServerSocialFeedItem =
559
758
  | MobileServerSocialFeedPost
560
759
  | MobileServerSocialFeedReply;
561
760
 
562
- /** Fixed-duration social feed reading session. Credentials and cursors must be returned unchanged. */
761
+ /** Idle-renewed social feed reading session. Credentials and cursors must be returned unchanged. */
563
762
  export interface MobileServerSocialFeedReadSession {
564
763
  /** Session identifier. */
565
764
  session_id: string;
566
765
  /** Feed, item, or full position history session. */
567
766
  mode: MobileSocialFeedReadSessionMode;
568
- /** Fixed expiration time in Unix milliseconds; pagination does not extend it. */
767
+ /** Current idle expiration in Unix milliseconds; legitimate session requests renew it. */
569
768
  expires_at_ms: number;
570
- /** Visibility requirements for explicit exposure reporting. */
571
- view_tracking: MobileServerSocialFeedViewTracking;
572
769
  /** Initial update baseline, distinct from the page cursor. */
573
770
  update_cursor: string | null;
574
771
  /** Credential for this reading session. Do not log or cache publicly. */
@@ -737,6 +934,8 @@ export interface MobileServerSocialFeedPost extends MobileServerSocialFeedConten
737
934
  export interface MobileServerSocialFeedReply extends MobileServerSocialFeedItemBase {
738
935
  /** Reply discriminant. */
739
936
  kind: 'reply';
937
+ /** Bound images in display order; empty when none. */
938
+ images: MobileServerSocialFeedImage[];
740
939
  /** Original text. */
741
940
  text: string;
742
941
  /** Mentions in the text. */
@@ -757,6 +956,12 @@ export interface MobileServerSocialFeedReply extends MobileServerSocialFeedItemB
757
956
  interaction: MobileServerSocialFeedInteraction;
758
957
  }
759
958
 
959
+ /** Top-level comment and all readable descendants from the same thread snapshot. */
960
+ export interface MobileServerSocialFeedCommentGroup extends MobileServerSocialFeedReply {
961
+ /** Flat descendants in creation-time, depth, then UUID order; empty when none. */
962
+ replies: MobileServerSocialFeedReply[];
963
+ }
964
+
760
965
  /** Current eligibility hints; actual writes still recheck the signed author. */
761
966
  export interface MobileServerSocialFeedPublishablePosition {
762
967
  /** Candidate position. */
@@ -1,20 +1,25 @@
1
1
  import { Hex } from 'viem';
2
2
  import { MobileServerSuccessResponse } from './serverBaseTypes';
3
3
  import {
4
- MobileNotificationPlatform,
5
4
  MobileServerAvatarPreset,
6
5
  MobileServerFeedTrade,
7
6
  MobileServerFollowListAccount,
7
+ MobileServerNotificationCapabilities,
8
+ MobileServerNotificationDeviceMetadata,
9
+ MobileServerNotificationInboxItem,
8
10
  MobileServerNotificationPreferences,
11
+ MobileServerNotificationSettings,
9
12
  MobileServerProfile,
10
13
  MobileServerSocialFeedActionCandidate,
11
14
  MobileServerSocialFeedActionMarker,
12
15
  MobileServerSocialFeedAuthor,
13
16
  MobileServerSocialFeedCandle,
14
17
  MobileServerSocialFeedCohort,
18
+ MobileServerSocialFeedCommentGroup,
15
19
  MobileServerSocialFeedDrawing,
16
20
  MobileServerSocialFeedEstimatedLiquidationLine,
17
21
  MobileServerSocialFeedHistorySummary,
22
+ MobileServerSocialFeedHistoryTake,
18
23
  MobileServerSocialFeedItem,
19
24
  MobileServerSocialFeedItemPatch,
20
25
  MobileServerSocialFeedMarket,
@@ -22,7 +27,6 @@ import {
22
27
  MobileServerSocialFeedPositionPatch,
23
28
  MobileServerSocialFeedPublishablePosition,
24
29
  MobileServerSocialFeedReadSession,
25
- MobileServerSocialFeedReply,
26
30
  MobileServerSocialFeedTimelineEntry,
27
31
  MobileServerSocialFeedTradingContext,
28
32
  MobileSocialFeedActionResolution,
@@ -35,8 +39,27 @@ import {
35
39
  import {
36
40
  MobileServerPublicQueryRequestByType,
37
41
  MobileServerPublicQueryRequestType,
42
+ MobileServerSignedQueryRequestType,
38
43
  } from './serverRequestTypes';
39
44
 
45
+ /**
46
+ * Success payloads for each signed `query`, keyed by request `type`.
47
+ */
48
+ export interface MobileServerSignedQueryResponseByType {
49
+ /** Wallet subscriptions and the signing Identity's bells. */
50
+ notification_subscriptions: MobileServerNotificationSubscriptionsResponse;
51
+ /** Private notification page. */
52
+ notification_inbox_v2: MobileServerNotificationInboxV2Response;
53
+ }
54
+
55
+ /**
56
+ * Full success response for a signed `query`, with its payload inlined alongside `status`.
57
+ */
58
+ export type MobileServerSignedQuerySuccessResponse<
59
+ T extends MobileServerSignedQueryRequestType =
60
+ MobileServerSignedQueryRequestType,
61
+ > = MobileServerSuccessResponse & MobileServerSignedQueryResponseByType[T];
62
+
40
63
  /**
41
64
  * Unsigned `public_query` request body: a `type` discriminant flattened with its params.
42
65
  */
@@ -165,15 +188,58 @@ export interface MobileServerNotificationPreferencesResponse {
165
188
  preferences: MobileServerNotificationPreferences;
166
189
  }
167
190
 
191
+ /**
192
+ * Payload of the `notification_registration_v2` public query, including legacy registrations.
193
+ */
194
+ export interface MobileServerNotificationRegistrationV2Response {
195
+ /** Opaque decimal string; do not convert to a JavaScript number. */
196
+ registration_generation: string;
197
+ /** Persisted capabilities of the most recent registration; legacy type/route arrays are empty. */
198
+ capabilities: MobileServerNotificationCapabilities;
199
+ }
200
+
201
+ /**
202
+ * Full settings document returned by both `notification_settings_v2` and `update_notification_settings_v2`.
203
+ */
204
+ export interface MobileServerNotificationSettingsV2Response {
205
+ /** Settings schema version. */
206
+ schema_version: 2;
207
+ /** Settings revision, independent of the subscription revision. */
208
+ revision: number;
209
+ /** Full saved settings. */
210
+ settings: MobileServerNotificationSettings;
211
+ }
212
+
213
+ /**
214
+ * Payload of the `notification_subscriptions` signed query.
215
+ */
216
+ export interface MobileServerNotificationSubscriptionsResponse {
217
+ /** Wallet-level subscription revision; read again after every mutation. */
218
+ revision: number;
219
+ /** Whether the one-time local favorites import has completed. */
220
+ favorites_imported: boolean;
221
+ /** Subscribed market IDs in ascending order. */
222
+ market_ids: number[];
223
+ /** Followed subaccounts with bells enabled for the signing Identity. */
224
+ trader_bells: Hex[];
225
+ }
226
+
227
+ /**
228
+ * Payload of the `notification_inbox_v2` signed query, ordered newest first.
229
+ */
230
+ export interface MobileServerNotificationInboxV2Response {
231
+ /** Accepted intents owned by the signing wallet. */
232
+ notifications: MobileServerNotificationInboxItem[];
233
+ /** Pass unchanged to the next request, or null when pagination is complete. */
234
+ next_cursor: string | null;
235
+ }
236
+
168
237
  /**
169
238
  * Payload of the `registered_wallet` public query success response. Inlined into the envelope rather than
170
239
  * nested under a key, matching the backend's `RegisteredWalletResponse`.
171
240
  */
172
- export interface MobileServerRegisteredWalletResponse {
241
+ export interface MobileServerRegisteredWalletResponse extends MobileServerNotificationDeviceMetadata {
173
242
  wallet: Hex;
174
- platform: MobileNotificationPlatform;
175
- locale: string | null;
176
- app_version: string | null;
177
243
  token_fingerprint_prefix: string;
178
244
  last_seen_at: number;
179
245
  }
@@ -185,6 +251,10 @@ export interface MobileServerRegisteredWalletResponse {
185
251
  * by {@link MobileServerPublicQuerySuccessResponse}.
186
252
  */
187
253
  export interface MobileServerPublicQueryResponseByType {
254
+ /** Latest saved device generation and v1/v2 capabilities. */
255
+ notification_registration_v2: MobileServerNotificationRegistrationV2Response;
256
+ /** Full settings document with its revision. */
257
+ notification_settings_v2: MobileServerNotificationSettingsV2Response;
188
258
  /** Open position candidates. */
189
259
  self_feed_positions: MobileServerSocialFeedPositionsResponse;
190
260
  /** Position command resolution. */
@@ -197,6 +267,10 @@ export interface MobileServerPublicQueryResponseByType {
197
267
  feed_comments: MobileServerSocialFeedCommentsResponse;
198
268
  /** Full lifecycle history. */
199
269
  position_history: MobileServerSocialFeedPositionHistoryResponse;
270
+ /** Most recent 500 actions, without pagination or authored content. */
271
+ position_history_all: MobileServerSocialFeedPositionHistoryResponse;
272
+ /** Published nonblank text with complete drawings. */
273
+ position_thoughts: MobileServerSocialFeedPositionThoughtsResponse;
200
274
  /** Candle page and markers. */
201
275
  position_chart: MobileServerSocialFeedPositionChartResponse;
202
276
  /** Read-only watcher observation. */
@@ -285,10 +359,12 @@ export interface MobileServerSocialFeedDrawingResponse {
285
359
 
286
360
  /** Comment thread, including bidirectional pagination around an optional anchor. */
287
361
  export interface MobileServerSocialFeedCommentsResponse {
288
- /** Readable comments. */
289
- comments: MobileServerSocialFeedReply[];
290
- /** Total readable count. */
362
+ /** Top-level comments, newest first, each with all readable descendants in the snapshot. */
363
+ comments: MobileServerSocialFeedCommentGroup[];
364
+ /** All readable replies across the thread snapshot, including descendants. */
291
365
  total_count: number;
366
+ /** All readable top-level comments across the thread snapshot. */
367
+ top_level_count: number;
292
368
  /** Forward cursor. */
293
369
  next_cursor: string | null;
294
370
  /** Backward cursor. */
@@ -301,6 +377,8 @@ export interface MobileServerSocialFeedCommentsResponse {
301
377
 
302
378
  /** Full position history with additional metrics and trusted trading hints. */
303
379
  export interface MobileServerSocialFeedPositionHistoryResponse {
380
+ /** Current position owner. */
381
+ owner: MobileServerSocialFeedAuthor;
304
382
  /** Current or frozen position and history metrics. */
305
383
  position: MobileServerSocialFeedPositionHistoryCard;
306
384
  /** Counts across the authorized history. */
@@ -342,3 +420,22 @@ export interface MobileServerSocialFeedWatchersResponse {
342
420
  /** Observation time. */
343
421
  as_of_ms: number;
344
422
  }
423
+
424
+ /** Published position thought with nonblank text and a complete saved drawing. */
425
+ export type MobileServerSocialFeedPositionThought =
426
+ MobileServerSocialFeedHistoryTake & {
427
+ /** Always true for this endpoint; uploaded or external images alone do not qualify. */
428
+ has_analysis: true;
429
+ /** Parsed current drawing; saved data does not necessarily contain visible strokes. */
430
+ drawing: MobileServerSocialFeedDrawing;
431
+ };
432
+
433
+ /** Thoughts in descending drawing creation time and item UUID order; no 500-item total cap. */
434
+ export interface MobileServerSocialFeedPositionThoughtsResponse {
435
+ /** Complete content in server order; never reorder by display time. */
436
+ items: MobileServerSocialFeedPositionThought[];
437
+ /** Null only at the directory end; an empty page can still have a cursor. */
438
+ next_cursor: string | null;
439
+ /** Independent position session; newly published content requires a refresh. */
440
+ read_session: MobileServerSocialFeedReadSession;
441
+ }