@glassly/miniapp 0.1.0-dev.26

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 (312) hide show
  1. package/README.md +275 -0
  2. package/dist/background/index.d.ts +64 -0
  3. package/dist/background/index.d.ts.map +1 -0
  4. package/dist/background/index.js +26 -0
  5. package/dist/background/index.js.map +1 -0
  6. package/dist/background/register.d.ts +39 -0
  7. package/dist/background/register.d.ts.map +1 -0
  8. package/dist/background/register.js +72 -0
  9. package/dist/background/register.js.map +1 -0
  10. package/dist/dev-reload.d.ts +21 -0
  11. package/dist/dev-reload.d.ts.map +1 -0
  12. package/dist/dev-reload.js +60 -0
  13. package/dist/dev-reload.js.map +1 -0
  14. package/dist/envelope.d.ts +23 -0
  15. package/dist/envelope.d.ts.map +1 -0
  16. package/dist/envelope.js +47 -0
  17. package/dist/envelope.js.map +1 -0
  18. package/dist/globals.d.ts +54 -0
  19. package/dist/globals.d.ts.map +1 -0
  20. package/dist/globals.js +12 -0
  21. package/dist/globals.js.map +1 -0
  22. package/dist/hardware.d.ts +24 -0
  23. package/dist/hardware.d.ts.map +1 -0
  24. package/dist/hardware.js +20 -0
  25. package/dist/hardware.js.map +1 -0
  26. package/dist/index.d.ts +65 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +34 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/modules/actions.d.ts +81 -0
  31. package/dist/modules/actions.d.ts.map +1 -0
  32. package/dist/modules/actions.js +137 -0
  33. package/dist/modules/actions.js.map +1 -0
  34. package/dist/modules/ai.d.ts +211 -0
  35. package/dist/modules/ai.d.ts.map +1 -0
  36. package/dist/modules/ai.js +117 -0
  37. package/dist/modules/ai.js.map +1 -0
  38. package/dist/modules/auth.d.ts +25 -0
  39. package/dist/modules/auth.d.ts.map +1 -0
  40. package/dist/modules/auth.js +52 -0
  41. package/dist/modules/auth.js.map +1 -0
  42. package/dist/modules/base64.d.ts +16 -0
  43. package/dist/modules/base64.d.ts.map +1 -0
  44. package/dist/modules/base64.js +92 -0
  45. package/dist/modules/base64.js.map +1 -0
  46. package/dist/modules/blob.d.ts +161 -0
  47. package/dist/modules/blob.d.ts.map +1 -0
  48. package/dist/modules/blob.js +277 -0
  49. package/dist/modules/blob.js.map +1 -0
  50. package/dist/modules/camera.d.ts +183 -0
  51. package/dist/modules/camera.d.ts.map +1 -0
  52. package/dist/modules/camera.js +119 -0
  53. package/dist/modules/camera.js.map +1 -0
  54. package/dist/modules/cloud.d.ts +34 -0
  55. package/dist/modules/cloud.d.ts.map +1 -0
  56. package/dist/modules/cloud.js +70 -0
  57. package/dist/modules/cloud.js.map +1 -0
  58. package/dist/modules/dashboard.d.ts +24 -0
  59. package/dist/modules/dashboard.d.ts.map +1 -0
  60. package/dist/modules/dashboard.js +39 -0
  61. package/dist/modules/dashboard.js.map +1 -0
  62. package/dist/modules/display.d.ts +174 -0
  63. package/dist/modules/display.d.ts.map +1 -0
  64. package/dist/modules/display.js +83 -0
  65. package/dist/modules/display.js.map +1 -0
  66. package/dist/modules/events.d.ts +178 -0
  67. package/dist/modules/events.d.ts.map +1 -0
  68. package/dist/modules/events.js +168 -0
  69. package/dist/modules/events.js.map +1 -0
  70. package/dist/modules/glasses.d.ts +36 -0
  71. package/dist/modules/glasses.d.ts.map +1 -0
  72. package/dist/modules/glasses.js +52 -0
  73. package/dist/modules/glasses.js.map +1 -0
  74. package/dist/modules/heading.d.ts +16 -0
  75. package/dist/modules/heading.d.ts.map +1 -0
  76. package/dist/modules/heading.js +20 -0
  77. package/dist/modules/heading.js.map +1 -0
  78. package/dist/modules/imu.d.ts +31 -0
  79. package/dist/modules/imu.d.ts.map +1 -0
  80. package/dist/modules/imu.js +40 -0
  81. package/dist/modules/imu.js.map +1 -0
  82. package/dist/modules/input.d.ts +50 -0
  83. package/dist/modules/input.d.ts.map +1 -0
  84. package/dist/modules/input.js +70 -0
  85. package/dist/modules/input.js.map +1 -0
  86. package/dist/modules/keys.d.ts +30 -0
  87. package/dist/modules/keys.d.ts.map +1 -0
  88. package/dist/modules/keys.js +37 -0
  89. package/dist/modules/keys.js.map +1 -0
  90. package/dist/modules/languages.d.ts +42 -0
  91. package/dist/modules/languages.d.ts.map +1 -0
  92. package/dist/modules/languages.js +57 -0
  93. package/dist/modules/languages.js.map +1 -0
  94. package/dist/modules/led.d.ts +35 -0
  95. package/dist/modules/led.d.ts.map +1 -0
  96. package/dist/modules/led.js +39 -0
  97. package/dist/modules/led.js.map +1 -0
  98. package/dist/modules/location.d.ts +27 -0
  99. package/dist/modules/location.d.ts.map +1 -0
  100. package/dist/modules/location.js +35 -0
  101. package/dist/modules/location.js.map +1 -0
  102. package/dist/modules/memory.d.ts +126 -0
  103. package/dist/modules/memory.d.ts.map +1 -0
  104. package/dist/modules/memory.js +141 -0
  105. package/dist/modules/memory.js.map +1 -0
  106. package/dist/modules/mic.d.ts +61 -0
  107. package/dist/modules/mic.d.ts.map +1 -0
  108. package/dist/modules/mic.js +94 -0
  109. package/dist/modules/mic.js.map +1 -0
  110. package/dist/modules/miniapps.d.ts +82 -0
  111. package/dist/modules/miniapps.d.ts.map +1 -0
  112. package/dist/modules/miniapps.js +58 -0
  113. package/dist/modules/miniapps.js.map +1 -0
  114. package/dist/modules/navigation.d.ts +332 -0
  115. package/dist/modules/navigation.d.ts.map +1 -0
  116. package/dist/modules/navigation.js +387 -0
  117. package/dist/modules/navigation.js.map +1 -0
  118. package/dist/modules/permissions.d.ts +58 -0
  119. package/dist/modules/permissions.d.ts.map +1 -0
  120. package/dist/modules/permissions.js +66 -0
  121. package/dist/modules/permissions.js.map +1 -0
  122. package/dist/modules/phone.d.ts +95 -0
  123. package/dist/modules/phone.d.ts.map +1 -0
  124. package/dist/modules/phone.js +110 -0
  125. package/dist/modules/phone.js.map +1 -0
  126. package/dist/modules/pivots/engine.d.ts +169 -0
  127. package/dist/modules/pivots/engine.d.ts.map +1 -0
  128. package/dist/modules/pivots/engine.js +778 -0
  129. package/dist/modules/pivots/engine.js.map +1 -0
  130. package/dist/modules/pivots/geometry.d.ts +84 -0
  131. package/dist/modules/pivots/geometry.d.ts.map +1 -0
  132. package/dist/modules/pivots/geometry.js +371 -0
  133. package/dist/modules/pivots/geometry.js.map +1 -0
  134. package/dist/modules/pivots/instructions.d.ts +139 -0
  135. package/dist/modules/pivots/instructions.d.ts.map +1 -0
  136. package/dist/modules/pivots/instructions.js +281 -0
  137. package/dist/modules/pivots/instructions.js.map +1 -0
  138. package/dist/modules/speaker.d.ts +175 -0
  139. package/dist/modules/speaker.d.ts.map +1 -0
  140. package/dist/modules/speaker.js +249 -0
  141. package/dist/modules/speaker.js.map +1 -0
  142. package/dist/modules/speakers.d.ts +29 -0
  143. package/dist/modules/speakers.d.ts.map +1 -0
  144. package/dist/modules/speakers.js +38 -0
  145. package/dist/modules/speakers.js.map +1 -0
  146. package/dist/modules/storage.d.ts +50 -0
  147. package/dist/modules/storage.d.ts.map +1 -0
  148. package/dist/modules/storage.js +99 -0
  149. package/dist/modules/storage.js.map +1 -0
  150. package/dist/modules/stream.d.ts +133 -0
  151. package/dist/modules/stream.d.ts.map +1 -0
  152. package/dist/modules/stream.js +53 -0
  153. package/dist/modules/stream.js.map +1 -0
  154. package/dist/modules/system.d.ts +71 -0
  155. package/dist/modules/system.d.ts.map +1 -0
  156. package/dist/modules/system.js +65 -0
  157. package/dist/modules/system.js.map +1 -0
  158. package/dist/modules/transcription.d.ts +99 -0
  159. package/dist/modules/transcription.d.ts.map +1 -0
  160. package/dist/modules/transcription.js +126 -0
  161. package/dist/modules/transcription.js.map +1 -0
  162. package/dist/modules/translation.d.ts +65 -0
  163. package/dist/modules/translation.d.ts.map +1 -0
  164. package/dist/modules/translation.js +121 -0
  165. package/dist/modules/translation.js.map +1 -0
  166. package/dist/modules/ui.d.ts +186 -0
  167. package/dist/modules/ui.d.ts.map +1 -0
  168. package/dist/modules/ui.js +289 -0
  169. package/dist/modules/ui.js.map +1 -0
  170. package/dist/protocol.d.ts +390 -0
  171. package/dist/protocol.d.ts.map +1 -0
  172. package/dist/protocol.js +419 -0
  173. package/dist/protocol.js.map +1 -0
  174. package/dist/react/MiniappHeader.d.ts +44 -0
  175. package/dist/react/MiniappHeader.d.ts.map +1 -0
  176. package/dist/react/MiniappHeader.js +32 -0
  177. package/dist/react/MiniappHeader.js.map +1 -0
  178. package/dist/react/MiniappProvider.d.ts +33 -0
  179. package/dist/react/MiniappProvider.d.ts.map +1 -0
  180. package/dist/react/MiniappProvider.js +15 -0
  181. package/dist/react/MiniappProvider.js.map +1 -0
  182. package/dist/react/capsuleHeaderLayout.d.ts +3 -0
  183. package/dist/react/capsuleHeaderLayout.d.ts.map +1 -0
  184. package/dist/react/capsuleHeaderLayout.js +5 -0
  185. package/dist/react/capsuleHeaderLayout.js.map +1 -0
  186. package/dist/react/index.d.ts +13 -0
  187. package/dist/react/index.d.ts.map +1 -0
  188. package/dist/react/index.js +9 -0
  189. package/dist/react/index.js.map +1 -0
  190. package/dist/react/useCapabilities.d.ts +26 -0
  191. package/dist/react/useCapabilities.d.ts.map +1 -0
  192. package/dist/react/useCapabilities.js +27 -0
  193. package/dist/react/useCapabilities.js.map +1 -0
  194. package/dist/react/useCapsuleHeaderStyle.d.ts +27 -0
  195. package/dist/react/useCapsuleHeaderStyle.d.ts.map +1 -0
  196. package/dist/react/useCapsuleHeaderStyle.js +39 -0
  197. package/dist/react/useCapsuleHeaderStyle.js.map +1 -0
  198. package/dist/react/useColorScheme.d.ts +18 -0
  199. package/dist/react/useColorScheme.d.ts.map +1 -0
  200. package/dist/react/useColorScheme.js +24 -0
  201. package/dist/react/useColorScheme.js.map +1 -0
  202. package/dist/react/useConnected.d.ts +17 -0
  203. package/dist/react/useConnected.d.ts.map +1 -0
  204. package/dist/react/useConnected.js +39 -0
  205. package/dist/react/useConnected.js.map +1 -0
  206. package/dist/react/useRpc.d.ts +29 -0
  207. package/dist/react/useRpc.d.ts.map +1 -0
  208. package/dist/react/useRpc.js +82 -0
  209. package/dist/react/useRpc.js.map +1 -0
  210. package/dist/react/useSafeArea.d.ts +21 -0
  211. package/dist/react/useSafeArea.d.ts.map +1 -0
  212. package/dist/react/useSafeArea.js +22 -0
  213. package/dist/react/useSafeArea.js.map +1 -0
  214. package/dist/session.d.ts +355 -0
  215. package/dist/session.d.ts.map +1 -0
  216. package/dist/session.js +688 -0
  217. package/dist/session.js.map +1 -0
  218. package/dist/sub-path-types.test-d.d.ts +40 -0
  219. package/dist/sub-path-types.test-d.d.ts.map +1 -0
  220. package/dist/sub-path-types.test-d.js +37 -0
  221. package/dist/sub-path-types.test-d.js.map +1 -0
  222. package/dist/transport/auto.d.ts +35 -0
  223. package/dist/transport/auto.d.ts.map +1 -0
  224. package/dist/transport/auto.js +124 -0
  225. package/dist/transport/auto.js.map +1 -0
  226. package/dist/transport/dispatch.d.ts +43 -0
  227. package/dist/transport/dispatch.d.ts.map +1 -0
  228. package/dist/transport/dispatch.js +91 -0
  229. package/dist/transport/dispatch.js.map +1 -0
  230. package/dist/transport/local-socket.d.ts +28 -0
  231. package/dist/transport/local-socket.d.ts.map +1 -0
  232. package/dist/transport/local-socket.js +80 -0
  233. package/dist/transport/local-socket.js.map +1 -0
  234. package/dist/transport/mock.d.ts +54 -0
  235. package/dist/transport/mock.d.ts.map +1 -0
  236. package/dist/transport/mock.js +210 -0
  237. package/dist/transport/mock.js.map +1 -0
  238. package/dist/transport/postmessage.d.ts +36 -0
  239. package/dist/transport/postmessage.d.ts.map +1 -0
  240. package/dist/transport/postmessage.js +78 -0
  241. package/dist/transport/postmessage.js.map +1 -0
  242. package/dist/transport/types.d.ts +25 -0
  243. package/dist/transport/types.d.ts.map +1 -0
  244. package/dist/transport/types.js +11 -0
  245. package/dist/transport/types.js.map +1 -0
  246. package/dist/ui/index.d.ts +107 -0
  247. package/dist/ui/index.d.ts.map +1 -0
  248. package/dist/ui/index.js +32 -0
  249. package/dist/ui/index.js.map +1 -0
  250. package/package.json +88 -0
  251. package/src/background/index.ts +177 -0
  252. package/src/background/register.ts +89 -0
  253. package/src/dev-reload.ts +59 -0
  254. package/src/envelope.ts +54 -0
  255. package/src/globals.ts +62 -0
  256. package/src/hardware.ts +25 -0
  257. package/src/index.ts +216 -0
  258. package/src/modules/actions.ts +189 -0
  259. package/src/modules/ai.ts +281 -0
  260. package/src/modules/auth.ts +68 -0
  261. package/src/modules/base64.ts +87 -0
  262. package/src/modules/blob.ts +341 -0
  263. package/src/modules/camera.ts +258 -0
  264. package/src/modules/cloud.ts +94 -0
  265. package/src/modules/dashboard.ts +51 -0
  266. package/src/modules/display.ts +214 -0
  267. package/src/modules/events.ts +318 -0
  268. package/src/modules/glasses.ts +58 -0
  269. package/src/modules/heading.ts +23 -0
  270. package/src/modules/imu.ts +44 -0
  271. package/src/modules/input.ts +87 -0
  272. package/src/modules/keys.ts +46 -0
  273. package/src/modules/languages.ts +72 -0
  274. package/src/modules/led.ts +61 -0
  275. package/src/modules/location.ts +39 -0
  276. package/src/modules/memory.ts +224 -0
  277. package/src/modules/mic.ts +103 -0
  278. package/src/modules/miniapps.ts +103 -0
  279. package/src/modules/navigation.ts +674 -0
  280. package/src/modules/permissions.ts +83 -0
  281. package/src/modules/phone.ts +155 -0
  282. package/src/modules/pivots/engine.ts +863 -0
  283. package/src/modules/pivots/geometry.ts +409 -0
  284. package/src/modules/pivots/instructions.ts +341 -0
  285. package/src/modules/speaker.ts +347 -0
  286. package/src/modules/speakers.ts +40 -0
  287. package/src/modules/storage.ts +109 -0
  288. package/src/modules/stream.ts +168 -0
  289. package/src/modules/system.ts +113 -0
  290. package/src/modules/transcription.ts +180 -0
  291. package/src/modules/translation.ts +156 -0
  292. package/src/modules/ui.ts +481 -0
  293. package/src/protocol.ts +482 -0
  294. package/src/react/MiniappHeader.tsx +114 -0
  295. package/src/react/MiniappProvider.tsx +50 -0
  296. package/src/react/capsuleHeaderLayout.ts +11 -0
  297. package/src/react/index.ts +12 -0
  298. package/src/react/useCapabilities.ts +29 -0
  299. package/src/react/useCapsuleHeaderStyle.ts +55 -0
  300. package/src/react/useColorScheme.ts +26 -0
  301. package/src/react/useConnected.ts +47 -0
  302. package/src/react/useRpc.ts +103 -0
  303. package/src/react/useSafeArea.ts +36 -0
  304. package/src/session.ts +969 -0
  305. package/src/sub-path-types.test-d.ts +60 -0
  306. package/src/transport/auto.ts +143 -0
  307. package/src/transport/dispatch.ts +106 -0
  308. package/src/transport/local-socket.ts +91 -0
  309. package/src/transport/mock.ts +255 -0
  310. package/src/transport/postmessage.ts +95 -0
  311. package/src/transport/types.ts +26 -0
  312. package/src/ui/index.ts +129 -0
@@ -0,0 +1,95 @@
1
+ /**
2
+ * @fileoverview PostMessage transport — in-WebView bridge via React Native WebView.
3
+ *
4
+ * The React Native WebView exposes:
5
+ * - window.ReactNativeWebView.postMessage(string): miniapp → phone
6
+ * - document "message" events + window "message" events: phone → miniapp
7
+ *
8
+ * react-native-webview sends incoming messages as regular DOM `MessageEvent`s
9
+ * on the `window` object, with `event.data` as the string payload. We listen
10
+ * there.
11
+ *
12
+ * Old Glassly builds injected a global `window.receiveNativeMessage` function;
13
+ * we also accept that path for compatibility by assigning our handler to it.
14
+ */
15
+
16
+ import {Transport, TransportDisconnectHandler, TransportMessageHandler} from "./types"
17
+
18
+ // Note: window.Glassly is declared in ../globals.ts. ReactNativeWebView and
19
+ // receiveNativeMessage are local to this transport.
20
+ declare global {
21
+ interface Window {
22
+ ReactNativeWebView?: {
23
+ postMessage: (data: string) => void
24
+ }
25
+ receiveNativeMessage?: (raw: string) => void
26
+ }
27
+ }
28
+
29
+ export class PostMessageTransport implements Transport {
30
+ private messageHandler: TransportMessageHandler | null = null
31
+ private disconnectHandler: TransportDisconnectHandler | null = null
32
+ private open_ = false
33
+ private windowListener: ((ev: MessageEvent) => void) | null = null
34
+
35
+ async open(): Promise<void> {
36
+ if (this.open_) return
37
+ if (typeof window === "undefined" || !window.ReactNativeWebView) {
38
+ throw new Error("PostMessageTransport: not running inside a React Native WebView")
39
+ }
40
+
41
+ // Listen on window "message" — react-native-webview routes host→webview
42
+ // messages here. Also some builds dispatch on document; hook both.
43
+ this.windowListener = (ev: MessageEvent) => {
44
+ const data = ev.data
45
+ if (typeof data !== "string") return
46
+ this.messageHandler?.(data)
47
+ }
48
+ window.addEventListener("message", this.windowListener)
49
+ if (typeof document !== "undefined") {
50
+ document.addEventListener("message", this.windowListener as unknown as EventListener)
51
+ }
52
+
53
+ // Legacy path: some host code calls window.receiveNativeMessage directly.
54
+ window.receiveNativeMessage = (raw: string) => {
55
+ this.messageHandler?.(raw)
56
+ }
57
+
58
+ this.open_ = true
59
+ }
60
+
61
+ send(raw: string): void {
62
+ if (typeof window === "undefined" || !window.ReactNativeWebView) {
63
+ throw new Error("PostMessageTransport: not running inside a React Native WebView")
64
+ }
65
+ window.ReactNativeWebView.postMessage(raw)
66
+ }
67
+
68
+ onMessage(handler: TransportMessageHandler): void {
69
+ this.messageHandler = handler
70
+ }
71
+
72
+ onDisconnect(handler: TransportDisconnectHandler): void {
73
+ this.disconnectHandler = handler
74
+ }
75
+
76
+ close(): void {
77
+ if (!this.open_) return
78
+ this.open_ = false
79
+ if (this.windowListener) {
80
+ window.removeEventListener("message", this.windowListener)
81
+ if (typeof document !== "undefined") {
82
+ document.removeEventListener("message", this.windowListener as unknown as EventListener)
83
+ }
84
+ this.windowListener = null
85
+ }
86
+ if (typeof window !== "undefined" && window.receiveNativeMessage) {
87
+ window.receiveNativeMessage = undefined
88
+ }
89
+ this.disconnectHandler?.("closed")
90
+ }
91
+
92
+ isOpen(): boolean {
93
+ return this.open_
94
+ }
95
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @fileoverview Transport abstraction for @glassly/miniapp.
3
+ *
4
+ * Two v1 implementations:
5
+ * - PostMessageTransport — inside Glassly WebView, uses window.ReactNativeWebView
6
+ * - LocalSocketTransport — in external Safari/Chrome fallback, uses ws://127.0.0.1
7
+ *
8
+ * createTransport() in auto.ts picks the right one based on environment.
9
+ */
10
+
11
+ export type TransportMessageHandler = (raw: string) => void
12
+ export type TransportDisconnectHandler = (reason: string) => void
13
+
14
+ export interface Transport {
15
+ /** Establish whatever connection the transport needs. May be a no-op. */
16
+ open(): Promise<void>
17
+ /** Send a serialized envelope. */
18
+ send(raw: string): void
19
+ /** Register a callback for incoming serialized envelopes. */
20
+ onMessage(handler: TransportMessageHandler): void
21
+ /** Register a callback for transport-level disconnects / errors. */
22
+ onDisconnect(handler: TransportDisconnectHandler): void
23
+ /** Close the transport cleanly. Idempotent. */
24
+ close(): void
25
+ isOpen(): boolean
26
+ }
@@ -0,0 +1,129 @@
1
+ /**
2
+ * @glassly/miniapp/ui — WebView-side SDK entry point.
3
+ *
4
+ * Imported from a miniapp's `src/ui/main.tsx` (or equivalent) to access
5
+ * the `glassly` WebView global, React hooks, and the `MiniappProvider`
6
+ * wrapper. This is the **on-demand WebView side** of a two-layer miniapp.
7
+ *
8
+ * What's NOT in this entry point:
9
+ * - `MiniappSession` — background-only.
10
+ * - Any `session.*` module classes — background-only.
11
+ * - `__dispatch` / direct native access — by design, the WebView has
12
+ * no host-native APIs. All hardware calls go through the background
13
+ * bus via `glassly.send(channel, payload)`.
14
+ *
15
+ * The `glassly` global is injected into every UI WebView at mount time
16
+ * by the host's `uiShim` (see `@glassly/engine/services/uiShim`).
17
+ * This entry point exports its TypeScript declaration so authors get
18
+ * autocomplete and compile-time errors on channel names + payloads.
19
+ */
20
+
21
+ import type {IsRpc, RpcReq, RpcRes, RpcRequestOptions} from "../modules/ui"
22
+ export type {Rpc, IsRpc, RpcReq, RpcRes, RpcRequestOptions, RpcHandlerContext} from "../modules/ui"
23
+ export {RpcError, RpcTimeoutError} from "../modules/ui"
24
+
25
+ export interface UiGlobal<TChannels extends object = Record<string, unknown>> {
26
+ /**
27
+ * Broadcast a typed message to the bound background JSContext.
28
+ * Buffered until `ready()` acks; once acked, fires immediately.
29
+ * Compile-error if `C` is an RPC channel — use `request()` instead.
30
+ */
31
+ send<C extends keyof TChannels & string>(
32
+ channel: IsRpc<TChannels[C]> extends true ? never : C,
33
+ payload: TChannels[C],
34
+ ): void
35
+
36
+ /**
37
+ * Subscribe to broadcast messages from the background. Compile-error
38
+ * if `C` is an RPC channel.
39
+ */
40
+ on<C extends keyof TChannels & string>(
41
+ channel: IsRpc<TChannels[C]> extends true ? never : C,
42
+ cb: (payload: TChannels[C]) => void,
43
+ ): () => void
44
+
45
+ /**
46
+ * Make an RPC call to the background `session.ui.handle(channel, ...)`
47
+ * handler. On failure, throws an `Error` whose `name` is one of:
48
+ * - `"RpcError"` — the handler threw. `err.cause?.code` may be set.
49
+ * - `"RpcTimeoutError"` — `options.timeout` elapsed.
50
+ * - `"AbortError"` — `options.signal` aborted.
51
+ * Distinguish by `err.name`, not `instanceof` — these errors are
52
+ * constructed in the WebView's bare runtime scope. No default timeout.
53
+ */
54
+ request<C extends keyof TChannels & string>(
55
+ channel: IsRpc<TChannels[C]> extends true ? C : never,
56
+ payload: RpcReq<TChannels[C]>,
57
+ options?: RpcRequestOptions,
58
+ ): Promise<RpcRes<TChannels[C]>>
59
+
60
+ /**
61
+ * Fires when the bridge is open and `glassly.send` is flushable. If
62
+ * subscribed AFTER `ready()` has been called, fires immediately.
63
+ */
64
+ onOpen(cb: () => void): () => void
65
+
66
+ /**
67
+ * Fires when the host is about to destroy the WebView. Handlers
68
+ * should snapshot any session state into background via
69
+ * `glassly.send` if they want it to survive.
70
+ */
71
+ onClose(cb: () => void): () => void
72
+
73
+ /**
74
+ * MUST be called once on UI bootstrap. Tells the host the WebView is
75
+ * mounted and ready to receive messages from background. Idempotent
76
+ * — subsequent calls no-op. Background's `session.ui.onOpen` handlers
77
+ * fire after this lands.
78
+ */
79
+ ready(): void
80
+
81
+ /**
82
+ * Tell the host what color to paint the native WebView layer — the
83
+ * surface that shows through during keyboard push-up and resize
84
+ * animations, which page CSS cannot reach. Accepts a CSS hex
85
+ * (`#rgb`/`#rrggbb`/`#rrggbbaa`) or `rgb()`/`rgba()`/`hsl()` string.
86
+ * Until called (or on an invalid value) the host defaults to its
87
+ * theme background. Call on mount and again on color-scheme changes.
88
+ */
89
+ setBackgroundColor(color: string): void
90
+ }
91
+
92
+ // React adapters are re-exported here so authors can import everything
93
+ // from a single sub-path. The actual hooks live in src/react/ and are
94
+ // already shipped as a separate sub-path for backwards-compat.
95
+ export {MiniappProvider, type MiniappProviderProps} from "../react/MiniappProvider"
96
+ export {MiniappHeader} from "../react/MiniappHeader"
97
+ export {useColorScheme} from "../react/useColorScheme"
98
+ export {useCapabilities} from "../react/useCapabilities"
99
+ export {useConnected} from "../react/useConnected"
100
+ export {useSafeArea} from "../react/useSafeArea"
101
+ export {useCapsuleHeaderStyle} from "../react/useCapsuleHeaderStyle"
102
+ export {useRpc, type RpcCallable} from "../react/useRpc"
103
+
104
+ /**
105
+ * Type helper for declaring a typed `glassly` global inside a miniapp.
106
+ *
107
+ * Every mini app should declare ONE global `glassly` typed against its
108
+ * own channel registry. The SDK no longer auto-declares the global so
109
+ * each miniapp's registry doesn't collide with the SDK's default.
110
+ *
111
+ * Usage (in your miniapp's `src/shared/channels.ts`):
112
+ *
113
+ * ```ts
114
+ * import type {TypedUiGlobal} from "@glassly/miniapp/ui"
115
+ *
116
+ * export interface Channels {
117
+ * "live-transcript": {text: string}
118
+ * }
119
+ *
120
+ * declare global {
121
+ * // eslint-disable-next-line no-var
122
+ * var glassly: TypedUiGlobal<Channels>
123
+ * }
124
+ * ```
125
+ *
126
+ * Both halves of the miniapp (background + UI) import this same file,
127
+ * so the typed shape is consistent across the bridge.
128
+ */
129
+ export type TypedUiGlobal<TChannels extends object> = UiGlobal<TChannels>