mtmsdk 0.0.52 → 0.0.53

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 (250) hide show
  1. package/dist/gomtmapi/@tanstack/react-query.gen.d.ts +21 -173
  2. package/dist/gomtmapi/@tanstack/react-query.gen.d.ts.map +1 -1
  3. package/dist/gomtmapi/@tanstack/react-query.gen.js +39 -179
  4. package/dist/gomtmapi/@tanstack/react-query.gen.js.map +1 -1
  5. package/dist/gomtmapi/index.d.ts +2 -2
  6. package/dist/gomtmapi/index.d.ts.map +1 -1
  7. package/dist/gomtmapi/index.js +1 -1
  8. package/dist/gomtmapi/index.js.map +1 -1
  9. package/dist/gomtmapi/schemas.gen.d.ts +67 -81
  10. package/dist/gomtmapi/schemas.gen.d.ts.map +1 -1
  11. package/dist/gomtmapi/schemas.gen.js +68 -82
  12. package/dist/gomtmapi/schemas.gen.js.map +1 -1
  13. package/dist/gomtmapi/sdk.gen.d.ts +15 -95
  14. package/dist/gomtmapi/sdk.gen.d.ts.map +1 -1
  15. package/dist/gomtmapi/sdk.gen.js +22 -102
  16. package/dist/gomtmapi/sdk.gen.js.map +1 -1
  17. package/dist/gomtmapi/types.gen.d.ts +66 -209
  18. package/dist/gomtmapi/types.gen.d.ts.map +1 -1
  19. package/dist/gomtmapi/zod.gen.d.ts +48 -121
  20. package/dist/gomtmapi/zod.gen.d.ts.map +1 -1
  21. package/dist/gomtmapi/zod.gen.js +36 -99
  22. package/dist/gomtmapi/zod.gen.js.map +1 -1
  23. package/dist/sbmng/@tanstack/react-query.gen.d.ts +146 -146
  24. package/dist/sbmng/@tanstack/react-query.gen.js +6 -6
  25. package/dist/sbmng/schemas.gen.d.ts +4 -4
  26. package/dist/sbmng/schemas.gen.js +4 -4
  27. package/dist/sbmng/schemas.gen.js.map +1 -1
  28. package/dist/sbmng/sdk.gen.d.ts +6 -6
  29. package/dist/sbmng/sdk.gen.js +6 -6
  30. package/dist/supabase/auth-provider.d.ts +8 -1
  31. package/dist/supabase/auth-provider.d.ts.map +1 -1
  32. package/dist/supabase/context.d.ts +3844 -1
  33. package/dist/supabase/context.d.ts.map +1 -1
  34. package/dist/supabase/cursor-pagination.d.ts +4 -4
  35. package/dist/supabase/cursor-pagination.js +4 -4
  36. package/dist/supabase/schema/index.d.ts +1 -11
  37. package/dist/supabase/schema/index.d.ts.map +1 -1
  38. package/dist/supabase/schema/index.js +1 -19
  39. package/dist/supabase/schema/index.js.map +1 -1
  40. package/dist/supabase/schema/system-config.d.ts +12 -0
  41. package/dist/supabase/schema/system-config.d.ts.map +1 -0
  42. package/dist/supabase/schema/system-config.js +22 -0
  43. package/dist/supabase/schema/system-config.js.map +1 -0
  44. package/dist/supabase/supabase-client.d.ts +1 -471
  45. package/dist/supabase/supabase-client.d.ts.map +1 -1
  46. package/dist/supabase/supabase.d.ts +44 -984
  47. package/dist/supabase/supabase.d.ts.map +1 -1
  48. package/dist/supabase/use-sb-query/use-rpc-mutation.d.ts +8 -8
  49. package/dist/supabase/use-sb-query/use-rpc-mutation.js +8 -8
  50. package/dist/types/contracts.d.ts +63 -0
  51. package/dist/types/contracts.d.ts.map +1 -0
  52. package/dist/types/contracts.js +17 -0
  53. package/dist/types/contracts.js.map +1 -0
  54. package/dist/types/database.schemas.d.ts +27 -626
  55. package/dist/types/database.schemas.d.ts.map +1 -1
  56. package/dist/types/database.schemas.js +0 -432
  57. package/dist/types/database.schemas.js.map +1 -1
  58. package/dist/types/database.types.d.ts +1 -476
  59. package/dist/types/database.types.d.ts.map +1 -1
  60. package/dist/types/database.types.js +0 -10
  61. package/dist/types/database.types.js.map +1 -1
  62. package/dist/types/index.d.ts +9 -25
  63. package/dist/types/index.d.ts.map +1 -1
  64. package/dist/types/index.js +3 -5
  65. package/dist/types/index.js.map +1 -1
  66. package/package.json +101 -105
  67. package/dist/cloud-account/platform-configs.d.ts +0 -64
  68. package/dist/cloud-account/platform-configs.d.ts.map +0 -1
  69. package/dist/cloud-account/platform-configs.js +0 -44
  70. package/dist/cloud-account/platform-configs.js.map +0 -1
  71. package/dist/lib/aisdk/types.d.ts +0 -3
  72. package/dist/lib/aisdk/types.d.ts.map +0 -1
  73. package/dist/lib/aisdk/types.js +0 -5
  74. package/dist/lib/aisdk/types.js.map +0 -1
  75. package/dist/lib/logger/index.d.ts +0 -22
  76. package/dist/lib/logger/index.d.ts.map +0 -1
  77. package/dist/lib/logger/index.js +0 -7
  78. package/dist/lib/logger/index.js.map +0 -1
  79. package/dist/lib/schema.d.ts +0 -43
  80. package/dist/lib/schema.d.ts.map +0 -1
  81. package/dist/lib/schema.js +0 -28
  82. package/dist/lib/schema.js.map +0 -1
  83. package/dist/mtgate_api/client/client.gen.d.ts +0 -3
  84. package/dist/mtgate_api/client/client.gen.d.ts.map +0 -1
  85. package/dist/mtgate_api/client/client.gen.js +0 -236
  86. package/dist/mtgate_api/client/client.gen.js.map +0 -1
  87. package/dist/mtgate_api/client/index.d.ts +0 -9
  88. package/dist/mtgate_api/client/index.d.ts.map +0 -1
  89. package/dist/mtgate_api/client/index.js +0 -7
  90. package/dist/mtgate_api/client/index.js.map +0 -1
  91. package/dist/mtgate_api/client/types.gen.d.ts +0 -118
  92. package/dist/mtgate_api/client/types.gen.d.ts.map +0 -1
  93. package/dist/mtgate_api/client/types.gen.js +0 -3
  94. package/dist/mtgate_api/client/types.gen.js.map +0 -1
  95. package/dist/mtgate_api/client/utils.gen.d.ts +0 -34
  96. package/dist/mtgate_api/client/utils.gen.d.ts.map +0 -1
  97. package/dist/mtgate_api/client/utils.gen.js +0 -232
  98. package/dist/mtgate_api/client/utils.gen.js.map +0 -1
  99. package/dist/mtgate_api/client.gen.d.ts +0 -13
  100. package/dist/mtgate_api/client.gen.d.ts.map +0 -1
  101. package/dist/mtgate_api/client.gen.js +0 -4
  102. package/dist/mtgate_api/client.gen.js.map +0 -1
  103. package/dist/mtgate_api/core/auth.gen.d.ts +0 -19
  104. package/dist/mtgate_api/core/auth.gen.d.ts.map +0 -1
  105. package/dist/mtgate_api/core/auth.gen.js +0 -15
  106. package/dist/mtgate_api/core/auth.gen.js.map +0 -1
  107. package/dist/mtgate_api/core/bodySerializer.gen.d.ts +0 -26
  108. package/dist/mtgate_api/core/bodySerializer.gen.d.ts.map +0 -1
  109. package/dist/mtgate_api/core/bodySerializer.gen.js +0 -58
  110. package/dist/mtgate_api/core/bodySerializer.gen.js.map +0 -1
  111. package/dist/mtgate_api/core/params.gen.d.ts +0 -44
  112. package/dist/mtgate_api/core/params.gen.d.ts.map +0 -1
  113. package/dist/mtgate_api/core/params.gen.js +0 -101
  114. package/dist/mtgate_api/core/params.gen.js.map +0 -1
  115. package/dist/mtgate_api/core/pathSerializer.gen.d.ts +0 -34
  116. package/dist/mtgate_api/core/pathSerializer.gen.d.ts.map +0 -1
  117. package/dist/mtgate_api/core/pathSerializer.gen.js +0 -115
  118. package/dist/mtgate_api/core/pathSerializer.gen.js.map +0 -1
  119. package/dist/mtgate_api/core/queryKeySerializer.gen.d.ts +0 -19
  120. package/dist/mtgate_api/core/queryKeySerializer.gen.d.ts.map +0 -1
  121. package/dist/mtgate_api/core/queryKeySerializer.gen.js +0 -100
  122. package/dist/mtgate_api/core/queryKeySerializer.gen.js.map +0 -1
  123. package/dist/mtgate_api/core/serverSentEvents.gen.d.ts +0 -72
  124. package/dist/mtgate_api/core/serverSentEvents.gen.d.ts.map +0 -1
  125. package/dist/mtgate_api/core/serverSentEvents.gen.js +0 -138
  126. package/dist/mtgate_api/core/serverSentEvents.gen.js.map +0 -1
  127. package/dist/mtgate_api/core/types.gen.d.ts +0 -79
  128. package/dist/mtgate_api/core/types.gen.d.ts.map +0 -1
  129. package/dist/mtgate_api/core/types.gen.js +0 -3
  130. package/dist/mtgate_api/core/types.gen.js.map +0 -1
  131. package/dist/mtgate_api/core/utils.gen.d.ts +0 -20
  132. package/dist/mtgate_api/core/utils.gen.d.ts.map +0 -1
  133. package/dist/mtgate_api/core/utils.gen.js +0 -88
  134. package/dist/mtgate_api/core/utils.gen.js.map +0 -1
  135. package/dist/mtgate_api/index.d.ts +0 -3
  136. package/dist/mtgate_api/index.d.ts.map +0 -1
  137. package/dist/mtgate_api/index.js +0 -3
  138. package/dist/mtgate_api/index.js.map +0 -1
  139. package/dist/mtgate_api/sdk.gen.d.ts +0 -15
  140. package/dist/mtgate_api/sdk.gen.d.ts.map +0 -1
  141. package/dist/mtgate_api/sdk.gen.js +0 -3
  142. package/dist/mtgate_api/sdk.gen.js.map +0 -1
  143. package/dist/mtgate_api/types.gen.d.ts +0 -4
  144. package/dist/mtgate_api/types.gen.d.ts.map +0 -1
  145. package/dist/mtgate_api/types.gen.js +0 -3
  146. package/dist/mtgate_api/types.gen.js.map +0 -1
  147. package/dist/openclaw/client-info.d.ts +0 -38
  148. package/dist/openclaw/client-info.d.ts.map +0 -1
  149. package/dist/openclaw/client-info.js +0 -38
  150. package/dist/openclaw/client-info.js.map +0 -1
  151. package/dist/openclaw/device-auth-utils.d.ts +0 -12
  152. package/dist/openclaw/device-auth-utils.d.ts.map +0 -1
  153. package/dist/openclaw/device-auth-utils.js +0 -16
  154. package/dist/openclaw/device-auth-utils.js.map +0 -1
  155. package/dist/openclaw/device-auth.d.ts +0 -21
  156. package/dist/openclaw/device-auth.d.ts.map +0 -1
  157. package/dist/openclaw/device-auth.js +0 -87
  158. package/dist/openclaw/device-auth.js.map +0 -1
  159. package/dist/openclaw/device-identity.d.ts +0 -8
  160. package/dist/openclaw/device-identity.d.ts.map +0 -1
  161. package/dist/openclaw/device-identity.js +0 -87
  162. package/dist/openclaw/device-identity.js.map +0 -1
  163. package/dist/openclaw/gateway.d.ts +0 -100
  164. package/dist/openclaw/gateway.d.ts.map +0 -1
  165. package/dist/openclaw/gateway.js +0 -302
  166. package/dist/openclaw/gateway.js.map +0 -1
  167. package/dist/openclaw/types.d.ts +0 -473
  168. package/dist/openclaw/types.d.ts.map +0 -1
  169. package/dist/openclaw/types.js +0 -2
  170. package/dist/openclaw/types.js.map +0 -1
  171. package/src/cloud-account/platform-configs.ts +0 -73
  172. package/src/gomtmapi/@tanstack/react-query.gen.ts +0 -537
  173. package/src/gomtmapi/client/client.gen.ts +0 -311
  174. package/src/gomtmapi/client/index.ts +0 -25
  175. package/src/gomtmapi/client/types.gen.ts +0 -241
  176. package/src/gomtmapi/client/utils.gen.ts +0 -332
  177. package/src/gomtmapi/client.gen.ts +0 -16
  178. package/src/gomtmapi/core/auth.gen.ts +0 -42
  179. package/src/gomtmapi/core/bodySerializer.gen.ts +0 -100
  180. package/src/gomtmapi/core/params.gen.ts +0 -176
  181. package/src/gomtmapi/core/pathSerializer.gen.ts +0 -181
  182. package/src/gomtmapi/core/queryKeySerializer.gen.ts +0 -136
  183. package/src/gomtmapi/core/serverSentEvents.gen.ts +0 -266
  184. package/src/gomtmapi/core/types.gen.ts +0 -118
  185. package/src/gomtmapi/core/utils.gen.ts +0 -143
  186. package/src/gomtmapi/index.ts +0 -4
  187. package/src/gomtmapi/schemas.gen.ts +0 -532
  188. package/src/gomtmapi/sdk.gen.ts +0 -371
  189. package/src/gomtmapi/types.gen.ts +0 -854
  190. package/src/gomtmapi/zod.gen.ts +0 -448
  191. package/src/index.ts +0 -4
  192. package/src/lib/aisdk/types.ts +0 -8
  193. package/src/lib/logger/index.ts +0 -8
  194. package/src/lib/schema.ts +0 -37
  195. package/src/mtgate_api/client/client.gen.ts +0 -311
  196. package/src/mtgate_api/client/index.ts +0 -25
  197. package/src/mtgate_api/client/types.gen.ts +0 -241
  198. package/src/mtgate_api/client/utils.gen.ts +0 -332
  199. package/src/mtgate_api/client.gen.ts +0 -16
  200. package/src/mtgate_api/core/auth.gen.ts +0 -42
  201. package/src/mtgate_api/core/bodySerializer.gen.ts +0 -100
  202. package/src/mtgate_api/core/params.gen.ts +0 -176
  203. package/src/mtgate_api/core/pathSerializer.gen.ts +0 -181
  204. package/src/mtgate_api/core/queryKeySerializer.gen.ts +0 -136
  205. package/src/mtgate_api/core/serverSentEvents.gen.ts +0 -266
  206. package/src/mtgate_api/core/types.gen.ts +0 -118
  207. package/src/mtgate_api/core/utils.gen.ts +0 -143
  208. package/src/mtgate_api/index.ts +0 -4
  209. package/src/mtgate_api/sdk.gen.ts +0 -17
  210. package/src/mtgate_api/types.gen.ts +0 -5
  211. package/src/openclaw/client-info.ts +0 -54
  212. package/src/openclaw/device-auth-utils.ts +0 -26
  213. package/src/openclaw/device-auth.ts +0 -99
  214. package/src/openclaw/device-identity.ts +0 -108
  215. package/src/openclaw/gateway.ts +0 -392
  216. package/src/openclaw/types.ts +0 -518
  217. package/src/sbmng/@tanstack/react-query.gen.ts +0 -2967
  218. package/src/sbmng/client/client.gen.ts +0 -311
  219. package/src/sbmng/client/index.ts +0 -25
  220. package/src/sbmng/client/types.gen.ts +0 -241
  221. package/src/sbmng/client/utils.gen.ts +0 -332
  222. package/src/sbmng/client.gen.ts +0 -16
  223. package/src/sbmng/core/auth.gen.ts +0 -42
  224. package/src/sbmng/core/bodySerializer.gen.ts +0 -100
  225. package/src/sbmng/core/params.gen.ts +0 -176
  226. package/src/sbmng/core/pathSerializer.gen.ts +0 -181
  227. package/src/sbmng/core/queryKeySerializer.gen.ts +0 -136
  228. package/src/sbmng/core/serverSentEvents.gen.ts +0 -266
  229. package/src/sbmng/core/types.gen.ts +0 -118
  230. package/src/sbmng/core/utils.gen.ts +0 -143
  231. package/src/sbmng/index.ts +0 -4
  232. package/src/sbmng/schemas.gen.ts +0 -9671
  233. package/src/sbmng/sdk.gen.ts +0 -1755
  234. package/src/sbmng/types.gen.ts +0 -7886
  235. package/src/supabase/auth-provider.tsx +0 -67
  236. package/src/supabase/context.tsx +0 -51
  237. package/src/supabase/cursor-pagination.ts +0 -155
  238. package/src/supabase/schema/browser.ts +0 -45
  239. package/src/supabase/schema/index.ts +0 -25
  240. package/src/supabase/supabase-client.ts +0 -30
  241. package/src/supabase/supabase.ts +0 -67
  242. package/src/supabase/use-sb-query/build-query-opts.ts +0 -68
  243. package/src/supabase/use-sb-query/key.ts +0 -57
  244. package/src/supabase/use-sb-query/use-query.ts +0 -352
  245. package/src/supabase/use-sb-query/use-rpc-mutation.ts +0 -83
  246. package/src/supabase/use-sb-query/use-rpc-query.ts +0 -267
  247. package/src/supabase/utils.ts +0 -75
  248. package/src/types/database.schemas.ts +0 -4359
  249. package/src/types/database.types.ts +0 -4182
  250. package/src/types/index.ts +0 -85
@@ -1,392 +0,0 @@
1
- import { GATEWAY_CLIENT_IDS, GATEWAY_CLIENT_MODES, type GatewayClientId, type GatewayClientMode } from "./client-info";
2
- import { clearDeviceAuthToken, loadDeviceAuthToken, storeDeviceAuthToken } from "./device-auth";
3
- import type { DeviceIdentity } from "./device-identity";
4
-
5
- export type GatewayEventFrame = {
6
- type: "event";
7
- event: string;
8
- payload?: unknown;
9
- seq?: number;
10
- stateVersion?: { presence: number; health: number };
11
- };
12
-
13
- export type GatewayResponseFrame = {
14
- type: "res";
15
- id: string;
16
- ok: boolean;
17
- payload?: unknown;
18
- error?: { code: string; message: string; details?: unknown };
19
- };
20
-
21
- export type GatewayErrorInfo = {
22
- code: string;
23
- message: string;
24
- details?: unknown;
25
- };
26
-
27
- export type GatewayHelloOk = {
28
- type: "hello-ok";
29
- protocol: number;
30
- features?: { methods?: string[]; events?: string[] };
31
- snapshot?: unknown;
32
- auth?: {
33
- deviceToken?: string;
34
- role?: string;
35
- scopes?: string[];
36
- issuedAtMs?: number;
37
- };
38
- policy?: { tickIntervalMs?: number };
39
- };
40
-
41
- type Pending = {
42
- resolve: (value: unknown) => void;
43
- reject: (err: unknown) => void;
44
- };
45
-
46
- export type GatewayBrowserClientOptions = {
47
- url: string;
48
- token?: string;
49
- password?: string;
50
- deviceIdentity?: DeviceIdentity | null;
51
- clientName?: GatewayClientId;
52
- clientVersion?: string;
53
- platform?: string;
54
- mode?: GatewayClientMode;
55
- instanceId?: string;
56
- onHello?: (hello: GatewayHelloOk) => void;
57
- onEvent?: (evt: GatewayEventFrame) => void;
58
- onClose?: (info: { code: number; reason: string; error?: GatewayErrorInfo | null }) => void;
59
- onGap?: (info: { expected: number; received: number }) => void;
60
- autoReconnect?: boolean;
61
- };
62
-
63
- // 4008 = application-defined code (browser rejects 1008 "Policy Violation")
64
- const CONNECT_FAILED_CLOSE_CODE = 4008;
65
-
66
- export class GatewayRequestError extends Error {
67
- readonly code: string;
68
- readonly details?: unknown;
69
-
70
- constructor(error: GatewayErrorInfo) {
71
- super(error.message || error.code);
72
- this.name = "GatewayRequestError";
73
- this.code = error.code;
74
- this.details = error.details;
75
- }
76
- }
77
-
78
- export class GatewayBrowserClient {
79
- private ws: WebSocket | null = null;
80
- private pending = new Map<string, Pending>();
81
- private closed = false;
82
- private lastSeq: number | null = null;
83
- private connectNonce: string | null = null;
84
- private connectSent = false;
85
- private connectTimer: number | null = null;
86
- private backoffMs = 800;
87
- private connectError: GatewayErrorInfo | null = null;
88
- private pendingTokenResetRetry = false;
89
- private tokenResetRetryBudgetUsed = false;
90
-
91
- constructor(private opts: GatewayBrowserClientOptions) {}
92
-
93
- start() {
94
- this.closed = false;
95
- this.connect();
96
- }
97
-
98
- stop() {
99
- this.closed = true;
100
- this.ws?.close();
101
- this.ws = null;
102
- this.pendingTokenResetRetry = false;
103
- this.tokenResetRetryBudgetUsed = false;
104
- this.flushPending(new Error("gateway client stopped"));
105
- }
106
-
107
- get connected() {
108
- return this.ws?.readyState === WebSocket.OPEN;
109
- }
110
-
111
- private connect() {
112
- if (this.closed) return;
113
- try {
114
- this.ws = new WebSocket(this.opts.url);
115
- this.ws.onopen = () => this.queueConnect();
116
- this.ws.onmessage = (ev) => this.handleMessage(String(ev.data ?? ""));
117
- this.ws.onclose = (ev) => {
118
- const reason = String(ev.reason ?? "");
119
- const error = this.connectError;
120
- this.connectError = null;
121
- this.ws = null;
122
- this.flushPending(new Error(`gateway closed (${ev.code}): ${reason}`));
123
-
124
- if (this.pendingTokenResetRetry) {
125
- this.pendingTokenResetRetry = false;
126
- window.setTimeout(() => this.connect(), 0);
127
- return;
128
- }
129
-
130
- this.opts.onClose?.({ code: ev.code, reason, error });
131
- this.scheduleReconnect();
132
- };
133
- this.ws.onerror = () => {
134
- // ignored; close handler will fire
135
- };
136
- } catch (err) {
137
- console.error("[gateway] Failed to create WebSocket instance:", err);
138
- // Simulate a close event for the UI to handle
139
- this.opts.onClose?.({
140
- code: 1006,
141
- reason: err instanceof Error ? err.message : "Connect failed",
142
- error: null,
143
- });
144
- this.scheduleReconnect();
145
- }
146
- }
147
-
148
- private scheduleReconnect() {
149
- if (this.closed || this.opts.autoReconnect === false) return;
150
- const delay = this.backoffMs;
151
- this.backoffMs = Math.min(this.backoffMs * 1.7, 15_000);
152
- window.setTimeout(() => this.connect(), delay);
153
- }
154
-
155
- private flushPending(err: Error) {
156
- for (const [, p] of this.pending) p.reject(err);
157
- this.pending.clear();
158
- }
159
-
160
- private async sendConnect() {
161
- if (this.connectSent) return;
162
- this.connectSent = true;
163
- if (this.connectTimer !== null) {
164
- window.clearTimeout(this.connectTimer);
165
- this.connectTimer = null;
166
- }
167
- const hasWebCrypto = typeof crypto !== "undefined" && !!crypto.subtle;
168
-
169
- const scopes = ["operator.admin", "operator.approvals", "operator.pairing"];
170
- const role = "operator";
171
-
172
- // Dynamic import types for correct typing
173
- let deviceIdentity = this.opts.deviceIdentity ?? null;
174
- let authToken: string | undefined;
175
-
176
- // Dynamically import device auth logic only if needed and in secure context
177
- if (hasWebCrypto && !deviceIdentity) {
178
- try {
179
- const { loadOrCreateDeviceIdentity } = await import("./device-identity");
180
-
181
- deviceIdentity = await loadOrCreateDeviceIdentity();
182
- } catch (e) {
183
- console.warn("[gateway] Failed to load device identity libs", e);
184
- }
185
- }
186
-
187
- if (deviceIdentity) {
188
- authToken = loadDeviceAuthToken({
189
- deviceId: deviceIdentity.deviceId,
190
- role,
191
- })?.token;
192
- }
193
-
194
- const auth =
195
- authToken || this.opts.token || this.opts.password
196
- ? {
197
- token: authToken ?? this.opts.token,
198
- password: this.opts.password,
199
- }
200
- : undefined;
201
-
202
- let device:
203
- | {
204
- id: string;
205
- publicKey: string;
206
- signature: string;
207
- signedAt: number;
208
- nonce: string | undefined;
209
- }
210
- | undefined;
211
-
212
- if (deviceIdentity) {
213
- const signedAtMs = Date.now();
214
- const nonce = this.connectNonce ?? "";
215
-
216
- try {
217
- const { buildDeviceAuthPayload } = await import("./device-auth-utils");
218
- const { signDevicePayload } = await import("./device-identity");
219
-
220
- const payload = buildDeviceAuthPayload({
221
- deviceId: deviceIdentity.deviceId,
222
- clientId: this.opts.clientName ?? GATEWAY_CLIENT_IDS.CONTROL_UI,
223
- clientMode: this.opts.mode ?? GATEWAY_CLIENT_MODES.WEBCHAT,
224
- role,
225
- scopes,
226
- signedAtMs,
227
- token: authToken ?? undefined,
228
- nonce,
229
- });
230
- const signature = await signDevicePayload(deviceIdentity.privateKey, payload);
231
- device = {
232
- id: deviceIdentity.deviceId,
233
- publicKey: deviceIdentity.publicKey,
234
- signature,
235
- signedAt: signedAtMs,
236
- nonce,
237
- };
238
- } catch (e) {
239
- console.error("[gateway] Failed to sign device payload", e);
240
- }
241
- }
242
-
243
- const params = {
244
- minProtocol: 3,
245
- maxProtocol: 3,
246
- client: {
247
- id: this.opts.clientName ?? GATEWAY_CLIENT_IDS.CONTROL_UI,
248
- version: this.opts.clientVersion ?? "dev",
249
- platform: this.opts.platform ?? navigator.platform ?? "web",
250
- mode: this.opts.mode ?? GATEWAY_CLIENT_MODES.WEBCHAT,
251
- instanceId: this.opts.instanceId,
252
- },
253
- role,
254
- scopes,
255
- device,
256
- caps: [],
257
- auth,
258
- userAgent: navigator.userAgent,
259
- locale: navigator.language,
260
- };
261
-
262
- void this.request<GatewayHelloOk>("connect", params)
263
- .then(async (hello) => {
264
- this.connectError = null;
265
- if (hello?.auth?.deviceToken && deviceIdentity) {
266
- try {
267
- storeDeviceAuthToken({
268
- deviceId: deviceIdentity.deviceId,
269
- role: hello.auth.role ?? role,
270
- token: hello.auth.deviceToken,
271
- scopes: hello.auth.scopes ?? [],
272
- });
273
- } catch (e) {
274
- console.warn("[gateway] Failed to store device token", e);
275
- }
276
- }
277
- this.backoffMs = 800;
278
- this.tokenResetRetryBudgetUsed = false;
279
- this.opts.onHello?.(hello);
280
- })
281
- .catch((err) => {
282
- console.warn("[gateway] connect seq failed", err);
283
-
284
- if (
285
- !this.tokenResetRetryBudgetUsed &&
286
- deviceIdentity &&
287
- authToken &&
288
- err instanceof GatewayRequestError &&
289
- err.code === "AUTH_TOKEN_MISMATCH"
290
- ) {
291
- clearDeviceAuthToken({
292
- deviceId: deviceIdentity.deviceId,
293
- role,
294
- });
295
- this.pendingTokenResetRetry = true;
296
- this.tokenResetRetryBudgetUsed = true;
297
- this.connectError = null;
298
- this.ws?.close(CONNECT_FAILED_CLOSE_CODE, "retry after clearing stale device token");
299
- return;
300
- }
301
-
302
- this.connectError =
303
- err instanceof GatewayRequestError
304
- ? { code: err.code, message: err.message, details: err.details }
305
- : { code: "CONNECT_FAILED", message: err instanceof Error ? err.message : "connect failed" };
306
- // Do not close here, let the interval handle it or the error event?
307
- // Original code closed it.
308
- this.ws?.close(CONNECT_FAILED_CLOSE_CODE, "connect failed");
309
- });
310
- }
311
-
312
- private handleMessage(raw: string) {
313
- let parsed: unknown;
314
- try {
315
- parsed = JSON.parse(raw);
316
- } catch {
317
- return;
318
- }
319
-
320
- const frame = parsed as { type?: unknown };
321
- if (frame.type === "event") {
322
- const evt = parsed as GatewayEventFrame;
323
-
324
- if (evt.event === "connect.challenge") {
325
- const payload = evt.payload as { nonce?: unknown } | undefined;
326
- const nonce = payload && typeof payload.nonce === "string" ? payload.nonce : null;
327
- if (nonce) {
328
- this.connectNonce = nonce;
329
- void this.sendConnect();
330
- }
331
- return;
332
- }
333
- const seq = typeof evt.seq === "number" ? evt.seq : null;
334
- if (seq !== null) {
335
- if (this.lastSeq !== null && seq > this.lastSeq + 1) {
336
- this.opts.onGap?.({ expected: this.lastSeq + 1, received: seq });
337
- }
338
- this.lastSeq = seq;
339
- }
340
- try {
341
- this.opts.onEvent?.(evt);
342
- } catch (err) {
343
- console.error("[gateway] event handler error:", err);
344
- }
345
- return;
346
- }
347
-
348
- if (frame.type === "res") {
349
- const res = parsed as GatewayResponseFrame;
350
- const pending = this.pending.get(res.id);
351
- if (!pending) return;
352
- this.pending.delete(res.id);
353
- if (res.ok) pending.resolve(res.payload);
354
- else {
355
- const error = res.error;
356
- pending.reject(
357
- error
358
- ? new GatewayRequestError({
359
- code: error.code,
360
- message: error.message ?? "request failed",
361
- details: error.details,
362
- })
363
- : new Error("request failed"),
364
- );
365
- }
366
- return;
367
- }
368
- }
369
-
370
- request<T = unknown>(method: string, params?: unknown): Promise<T> {
371
- if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
372
- return Promise.reject(new Error("gateway not connected"));
373
- }
374
- const id = crypto.randomUUID();
375
- const frame = { type: "req", id, method, params };
376
- const p = new Promise<T>((resolve, reject) => {
377
- this.pending.set(id, { resolve: (v) => resolve(v as T), reject });
378
- });
379
- this.ws.send(JSON.stringify(frame));
380
- return p;
381
- }
382
-
383
- private queueConnect() {
384
- this.connectNonce = null;
385
- this.connectSent = false;
386
- if (this.connectTimer !== null) window.clearTimeout(this.connectTimer);
387
-
388
- this.connectTimer = window.setTimeout(() => {
389
- void this.sendConnect();
390
- }, 750);
391
- }
392
- }